2011-03-28 82 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

相關問題