【问题标题】:Problem with Z-Order involving TopMost and Invoke涉及 TopMost 和 Invoke 的 Z-Order 问题
【发布时间】:2009-04-06 11:56:17
【问题描述】:

我正在使用 Form.ShowDialog() 显示对话框。表单设置为 TopMost。一些图像处理计算在后台异步执行。它们的结果由 Invoke 以主要形式呈现。到现在为止还挺好。奇怪的是,模态对话框时不时地移动到主窗体后面。我想当构建对话框的消息被 Invoke 以某种方式“干扰”时会发生这种情况。

任何想法如何解决这个问题?

【问题讨论】:

    标签: .net winforms invoke z-order topmost


    【解决方案1】:

    作为一般规则,除非绝对不能,否则请避免使用 TopMost。如果你绝对不能,一次不要有超过一个 TopMost 表格。 (毕竟,不可能有三种 TopMost 形式——总要有人输)。

    首先,确认您在调用Form.ShowDialog() 时正确设置了所有者。这将使新表单更有可能出现在适当的位置并全方位改进应用程序的行为。其次,验证您在任何时候都只有一个 TopMost 窗口。做这些事情的综合失败肯定会导致你的问题。例如:

    // MainForm.cs -- Don't do this
    this.TopMost = true;
    childForm.TopMost = true;
    childForm.ShowDialog(/*no parent spec'd*/);
    

    现在会发生什么?主窗体和子窗体都在最顶层,因此必须丢失其中一个。 MainForm 在将 childForm 创建为最顶层时处于活动状态,但 childForm 没有父级。也许 Windows 决定将桌面作为其父级。这可能会导致主窗体停留在新打开的子窗体上。

    【讨论】:

    • ShowDialog(parentHandle) 据我所知解决了我的问题。但是另一个问题出现了:为什么会有 ShowDialog(/*no parent spec'd*/);仅适用于 100 个原因中的 99 个?这种虫子真的可以让人抓狂。我从没想过编码 UI 会将编码员带入统计领域。 :)
    • 好问题,但我不知道答案。最佳猜测与“preview.tinyurl.com/c6cfze”有关。无论出于何种原因,底层 API 都允许 NULL 父窗口(也许 ShowDialog() 在某些情况下不能有父窗口?),因此 .Net 等价物也是如此。
    【解决方案2】:

    也许您可以尝试将拥有的表单作为参数传递给 ShowDialog,就像这样(VB 语法):

    Form.ShowDialog(Me)
    

    不确定它是否会改变任何东西,但值得一试......

    另外,当您说“表单设置为 TopMost”时,您是指主表单还是模态表单?您真的需要将其设置为 TopMost 吗?有时 TopMost 表单有奇怪的行为...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 2023-03-05
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      相关资源
      最近更新 更多