2011-03-28 70 views
12

是否有可能获得Window.Owner的某些功能而没有获得全部功能?WPF中的窗口所有者没有始终在顶行为

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

如果我将窗口B的Owner设置为A,那么切换到任一窗口都会使其他应用程序(我想要)都处于前面,但是也会迫使B总是坐在A的顶部(我不想)。

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

我该怎么做“当用户激活此窗口,带一组特定的窗口(应用程序中的所有其他人)到我下面的Z顺序,同时保留它们相对于彼此的现有Z顺序“?

+1

+1我有同样的要求;你有没有找到解决方案?对于您的z顺序问题:您可以通过保留堆栈(仅列表)并注册所有窗口的激活事件来完成此操作。在每个事件上,你从堆栈中移除winodw并放回顶部(== list.Add)。列表中的foreach窗口将它引向前台(使用interop)。 – stijn 2011-12-30 12:19:32

+0

我还没有找到其他解决方案。托德的回答看起来很有希望,可能是我会用的(除非有更好的结果出现),但是我还没有设法测试它,因为这个项目已经被烧毁了。 (这就是为什么我还没有打勾的答案,我保证,我会最终回到它!) – Miral 2012-01-18 04:29:32

回答

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。

+0

这实际上是几乎完美的。处理关闭/最小化/恢复并不难,因为我使用的是事件聚合器,我只是在创建/更改窗口时发布事件并保留所有事件的中央列表。我发现唯一的退出是,因为透明的所有者窗口,在alt-tab窗口上将显示空的条目(除了图标)。 – stijn 2011-12-30 12:21:36

相关问题