1. 程式人生 > >WPF:父視窗與子視窗的層次關係

WPF:父視窗與子視窗的層次關係

關於子窗體的層級關係總結一下哈,希望能對大家有些幫助
假設有這樣兩個窗體:RootWindow,SubWindow,在RootWindow中引發某事件而顯示SubWindow

1,如果彈出窗體(比如SubWindow)僅僅是呼叫Show方法,並且沒有設定其Owner屬性:

ClassRootWindow
{
       void Foo()
       {
               SubWindow sw = newSubWindow();
               sw.Show();
       }
}
那麼彈出窗體(SubWindow)和源窗體(如RootWindow)沒有任何層級關係,也就是說不會以模態方式呈現(SubWindow不會阻擋使用者對RootWindow的操作)。SubWindow在Show出來時在RootWindow的上方,但使用者可以通過滑鼠點選等方式將RootWindow帶到SubWindow前方來而遮蓋RootWindow的內容,也就是說,享有使用者焦點的視窗將被帶到最前方。並且RootWindow和SubWindow的最小化與還原操作互不影響。

2,如果彈出窗體(比如SubWindow)呼叫Show方法,並且設定了其Owner屬性:

ClassRootWindow
{
       void Foo()
       {
               SubWindow sw = newSubWindow();
               sw.Owner = this;
               sw.Show();
       }
}

那麼彈出窗體(SubWindow)和源窗體(如RootWindow)將有著父子關係,也就是說,彈出窗體將永遠在源窗體的上方,但並不是模式的,使用者可以操作源窗體,當源窗體被最小化或還原的時候,彈出窗體也將隨著最小化和還原,反之不成立。

3,如果彈出窗體(SubWindow)以ShowDialog的方式顯示,並且沒有設定其Owner屬性:
ClassRootWindow
{
voidFoo()
{
      SubWindow sw = new SubWindow();
      sw.ShowDialog();
}
}
彈出窗體將以模式的方式出現,但沒有父子關係,彈出窗體將阻止使用者對源窗體的操作,但點選源窗體時彈出窗體不會出現閃動效果。彈出窗體最小化時,源窗體會隨之最小化,但還原操作卻不可以(很奇怪)。這裡有一個值得注意的問題是:在此模式下,如果彈出窗體不在工作列顯示(ShowInTaskBar==false),而源窗體顯示在工作列,使用者的操作可能會導致彈出視窗被隱藏在源視窗背後而沒辦法切換出來(除非使用Alt+TAB)。

4,如果彈出窗體(SubWindow)以ShowDialog的方式顯示,並且設定了其Owner屬性:
Class RootWindow
{
                void Foo()
                {
                     SubWindow sw = newSubWindow();
                        sw.Owner = this;
                        sw.ShowDialog();


}

彈出窗體將以模式的方式出現,並且有父子關係,彈出窗體將永遠處於源窗體上方,彈出窗體將阻止使用者對源窗體的操作,並且點選源窗體時彈出窗體會出現閃動效果。彈出窗體最小化或還原時,源窗體會隨之最小化或還原。