2011-07-12 155 views
3

我需要的是我的窗口類中的這樣一個事件處理程序。WPF創建兄弟窗口並關閉當前窗口

void someEventHandler(object sender, RoutedEventArgs e) 
{ 
    MyNewWindow mnw = new MyNewWindow(); 
    mnw.Owner = Window.GetWindow(this); 
    mnw.ShowDialog(); 
    this.Close(); 
} 

Window.GetWindow(this)返回當前窗口的父窗口。

我曾經想過,當新窗口的所有者是當前窗口的父窗口時,它會等待父窗口;而不是現在的那個。但它沒有那樣工作。當前窗口等待新的執行並且僅在之後關閉。

如果我使用Show()而不是ShowDialog()出於某種原因,窗口根本不顯示。

也許我需要一些委託方法,但我不知道從哪裏開始。

編輯:我想我需要改善未來的參考問題: 新窗口應該是一個對話框到父窗口。如果我使用Show()父窗口變得可訪問,我不希望這樣。如果我使用ShowDialog(),它會變成當前窗口的對話框,這意味着當前窗口在新窗口關閉之前不會關閉,我也不希望這樣做。

回答

5

關閉一個窗口會導致它擁有的任何窗口to be closed

如果您只是想讓所有者窗口不可見,請嘗試此操作;

void someEventHandler(object sender, RoutedEventArgs e) 
{ 
    MyNewWindow mnw = new MyNewWindow(); 
    mnw.Owner = this; 
    this.Hide(); // not required if using the child events below 
    mnw.ShowDialog(); 
} 

你可能會希望掛鉤的,當你關閉根據您的要求子窗口,採取相應的行動父窗口中的一些事件。

編輯

也許你可以控制(多個父)從孩子的藏身;

void OnLoad(object sender, RoutedEventArgs e) 
{ 
    this.Owner.Hide(); 
} 
void Closed(object sender, RoutedEventArgs e) 
{ 
    this.Owner.Show(); 
} 
+0

在父窗口中處理這個問題是最簡單的解決方案。但子窗口可以從其他各種窗口調用,這使得事情變得複雜。我需要修改每個父窗口中的事件處理程序,而我不希望這樣。 – Kta

+0

btw。在ShowDialog()之前調用this.Hide()確保了我的解決方案。窗口沒有關閉,但至少用戶認爲是這樣:) ty – Kta

1

如果我知道你想關閉當前窗口,並用MyNewWindow是,這是原始窗口的父窗口(可能是應用程序的主窗口)的子更換你想要做什麼。

要做到這一點,你應該使用:

mnw.Owner = this.Owner; 

而不是調用GetWindow,它給你回當前窗口實例。 GetWindow的目的是獲取包含一些其他UIElement的Window,例如樹中較遠的Button。當傳入一個Wi​​ndow實例時,您只需取回通過的內容。

+0

你說得對。但是我希望新窗口顯示爲主窗口的對話框。 Show()和ShowDialog()都不提供這種方式。 – Kta

1

調用ShowDialog()塊。也就是說,該方法僅在mnw關閉時才返回,只有原始窗口關閉。

如果將其更改爲Show(),那麼在原始窗口中呼叫Close()後,將立即關閉mnw。因爲Window.GetWindow(this)返回this。因此,您將所有者設置爲this,並且當您關閉this時,mnw也會關閉。這使我們與:

MyNewWindow mnw = new MyNewWindow(); 
mnw.Owner = this.Owner; // may not be necessary 
mnw.Show(); 
this.Close(); 

此代碼似乎爲我工作。

+0

當我調用Show()時,父窗口變爲可訪問。我想讓新窗口成爲父窗口的對話框。 – Kta