WPF中的窗口所有者没有始终在线的行为

时间:2011-03-28 06:31:12

标签: .net wpf window z-order owner

是否有可能获得Window.Owner的某些功能而无法获得所有功能?

有两个窗口,窗口A和窗口B.我想这样做,以便选择任何一个将使它们在其他应用程序之上,但任何一个可以覆盖另一个。 (实际上不仅仅是两个,但它们都应该表现得相似。)

如果我将窗口B的Owner设置为A,那么切换到任一窗口都会将两者都放在其他应用程序(我想要的)之前,但也会强制B始终位于A之上(我不想要。)

我实际上已经拥有独立于Owner / OwnedWindows跟踪窗口层次结构的代码,因此我可以扩展它以解决激活问题。因此,如果这简化了问题,我正在寻找的另一个答案是:

如何实际操作“当用户激活此窗口时,将一组特定窗口(应用程序中的所有其他窗口)添加到我下方的Z顺序,同时保留它们相对于现有的Z顺序彼此“?

1 个答案:

答案 0 :(得分:4)

一种可能的解决方案是拥有一个拥有应用中所有窗口的隐藏窗口。

你会声明如下:

<Window
    Opacity="0"
    ShowInTaskbar="False"
    AllowsTransparency="true"
    WindowStyle="None">

请务必从App.xaml中删除StartupUri。在App.xaml.cs中,您可以覆盖OnStartup,如下所示:

protected override void OnStartup(StartupEventArgs e)
{
    HiddenMainWindow window = new HiddenMainWindow();
    window.Show();

    Window1 one = new Window1();
    one.Owner = window;
    one.Show();

    Window2 two = new Window2();
    two.Owner = window;
    two.Show();
}

另一个难点是您希望如何处理关闭实际应用程序。如果其中一个窗口被视为MainWindow,您只需将应用程序ShutdownMode更改为ShutdownMode.OnMainWindowClose,然后将MainWindow属性设置为其中一个窗口。否则,您需要确定所有窗口何时关闭并明确调用Shutdown。