在WPF中实现无始终置顶行为的窗口所有者

13

是否有可能在不获取所有功能的情况下获得某些 Window.Owner 的功能?

有两个窗口,窗口A和窗口B。我想使选择任何一个窗口都会将它们置于其他应用程序之上,但是任何一个窗口都可以覆盖另一个窗口。(实际上不止两个窗口,但它们应该都表现得类似。)

如果我将窗口B的 Owner 设置为A,则切换到任何一个窗口都会将它们两个置于其他应用程序之前(这是我想要的),但是B也将始终处于A之上(这是我不想要的)。

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

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


1
+1 我有同样的需求,你已经找到解决方案了吗?对于您的 z-order 问题:您可以通过保持一个堆栈(只是一个 List<Window>)并为所有窗口注册 Activated 事件来实现。在每个事件中,您将窗口从堆栈中移除并将其放回顶部(== list.Add)。在列表中的每个窗口中使用 interop 将其带到前景。 - stijn
我还没有找到其他的解决方案。Todd在下面的回答似乎很有希望,可能是我会使用的(除非出现更好的解决方案),但由于这个项目已经被搁置了,我还没有测试过它。(这就是为什么我还没有选中答案的原因。我保证,最终我会回来处理它!) - Miral
1个回答

5

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

您可以声明它类似于:

<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。


这实际上几乎完美。处理关闭/最小化/还原并不太困难,因为我正在使用事件聚合器,在创建/更改窗口时发布事件并保留所有窗口的中心列表。我发现唯一的问题是,在alt-tab时,由于透明的所有者窗口,窗口将显示一个空条目(除了图标)。 - stijn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接