如何在撰写中将对话框居中到父窗口中?

问题描述 投票:0回答:1

在撰写桌面中,我们有 Dialog 和 AlertDialog。

如果使用Dialog,它没有父级,默认对齐屏幕中心。为了将其与窗口中心对齐,我们可以计算窗口和对话框中心点偏移之间的差异,并且需要为对话框开始位置添加偏移量:

fun getOffset(wState: WindowState, dState: DialogState): DpOffset {
    
    val winCenterPoint = DpOffset(
        wState.position.x + wState.size.width / 2,
        wState.position.y + wState.size.height / 2
    )
    
    val dlgCenterPoint = DpOffset(
        dState.position.x + dState.size.width / 2,
        dState.position.y + dState.size.height /2
    )
    
    return winCenterPoint - dlgCenterPoint
    
}

但是这里有一个问题:如果未指定窗口或对话框大小,我们将无法计算偏移量。此外,如果窗口/对话框位于屏幕中央 - state.position 将返回 Alignment 而不是 Offset。

如果使用 AlertDialog,它会以父边界为中心。当我将自定义可组合对话框设置为按钮参数时,此抛出异常:

enter image description here

AlertDialog 基于 Popup 底层,但是当我为 Popup 设置相同的可组合项时,它不会崩溃,认为这是在窗口内测量的问题。

如果有人有更好的方法将对话框对齐到窗口中心,请分享您的知识。

kotlin jvm compose-desktop
1个回答
2
投票

您可以尝试将窗口居中,对话框应该居中,

val windowState = rememberWindowState(position = WindowPosition(Alignment.Center))
Window(onCloseRequest = ::exitApplication, state = windowState) {}
© www.soinside.com 2019 - 2024. All rights reserved.