【问题标题】:WPF owner window on top of child window子窗口顶部的 WPF 所有者窗口
【发布时间】:2010-11-06 15:15:10
【问题描述】:

当您在所有者窗口位于子窗口下方时单击它时,WPF 中的所有者窗口是否可能位于子窗口的顶部?

这是我如何调用子窗口的示例:

Window2 window = new Window2();
window.Owner = this;
window.Show();

父/所有者窗口将始终位于子窗口之下。

【问题讨论】:

  • 您能否详细说明您要实现的目标,我仍然无法理解您希望窗口的行为方式。谢谢!
  • 假设我们有 Window1 和 Window2。 Window1 设置为 Window2 的所有者(在 Window1 的上下文中运行的相关代码,“this”是 Window1)。当 Window2 位于 Window1 的顶部(在 z 轴上,因此被拖过去)时,Window1 将始终位于 Window2 的下方。所以我的问题是:Window1 是否有可能在 Window2 之上/之上以及如何?
  • 我可以开始工作的唯一解决方案是不让 Window1 成为 Window2 的所有者,但是,它有它的问题。 Window2 将出现在 window1 下方。
  • 我也需要类似的东西。我需要我的主窗口来跟踪所有打开的子窗口,一旦用户单击任何窗口,我希望该窗口成为最顶部的窗口。这是你需要达到的目标吗?据我所知,所有者总是在它拥有的窗户后面,你无法改变它。唯一的方法是自己跟踪子窗口。

标签: c# .net wpf user-interface


【解决方案1】:

要获得您想要的行为,您不想在任一窗口上设置所有者。

当然,在关闭任一窗口以关闭想象中的“子”窗口时,您必须自己处理逻辑。

您可能还需要实现一些与最小化、最大化等相关的其他逻辑。

【讨论】:

    【解决方案2】:

    此页面上的许多答案都涉及 nulling- 将 Window.Owner 属性用于您的 @ 中的部分或全部(MainWindow)窗口987654324@。虽然这是一个简单易行的解决方案,确实可以单独解决Window 重叠的问题,但不幸的是,它还抑制了 WPF 似乎急于提供的许多有用的应用程序范围的功能在以下领域:

    • Application 激活/停用(通过鼠标单击、桌面 Alt-Tab 切换等...),
    • 正确遵守Application.​ShutdownMode 属性,一般来说,
    • 在关闭时有序清理、资源处置和退出您的Application

    通过指定一个特殊的不可见窗口实例作为您的Application.MainWindow,可以解决Window 重叠问题,同时仍保留这些系统范围的WPF 功能。

    修改您的应用程序,使其创建的第一个Window——即分配给Application.MainWindowWindow——是一个特殊的虚拟Window,然后通过设置其Visibility使其不可见至Visibility.Hidden 或致电Window.Hide()。这不会隐藏其拥有的窗口。然后,确保您想要的“主”窗口包含您的真实内容以及所有其他窗口,这些窗口属于这个不可见窗口。

    一旦隐藏,虚拟 Window 将不会显示在 Windows 10 任务栏中。您可以根据需要在任何您认为合适的可见窗口上设置Window.ShowInTaskbar 属性以模拟明显的特殊指定。

    此方法允许Application 中的任何可见窗口位于其他窗口之上,同时仍保留 WPF 功能和行为以激活系统范围的应用程序。例如,当Application 被激活(通过单击任何一个窗口,或通过 Alt-tab)时,应用程序的所有窗口将一起置于任何其他桌面应用程序窗口之上,同时仍然保留最新的“应用内”Z 顺序。 WPF 关闭功能也得以保留,包括根据关闭的不可见 MainWindow(或所有其他)正确观察 Application.ShutdownMode 逻辑。

    【讨论】:

      【解决方案3】:

      我遇到了类似的情况。我通过在显示窗口后简单地删除所有者来解决这个问题。

      Window2 window = new Window2();
      window.Owner = this;
      window.Show();
      window.Owner = null;
      

      编辑: 有人回复了这个,看了看,决定做一个扩展方法。

      public static void ShowAsIfChildOf(this Window childWindow, Window parentWindow)
      {
        childWindow.Owner = parentWindow;
        childWindow.Show();
        childWindow.Owner = null;
      }
      

      【讨论】:

      • 简单有效。
      猜你喜欢
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2012-10-10
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多