假設有這樣兩個窗體: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(); }
彈出窗體將以模式的方式出現,並且有父子關系,彈出窗體將永遠處於源窗體上方,彈出窗體將阻止用戶對源窗體的操作,並且點擊源窗體時彈出窗體會出現閃動效果。彈出窗體最小化或還原時,源窗體會隨之最小化或還原