標籤:另一個 按鈕 img ted 很多 info send line out
與 WinForm 不同,WPF 並沒有 MDI 視窗,但 WPF 的視窗之間是可以存在“父子”關係的。
我們會發現,Window 類公開了一個屬性叫 Owner,這個屬性是可讀可寫的,從名字上我們也能猜到,應該是用來設定視窗的父子關係的。這個屬性看起來不難用,只要賦個視窗執行個體即可,而真正的痛點是你得搞清楚“誰是誰的父視窗”,“誰是誰的子視窗”,一旦你搞混了,有可能會應用程式帶來一些小麻煩。
這個問題是一位妹子問我的,不然怎麼說女孩子特別細心呢,這個小玩意兒估計很多時候我們都不會注意到。
下面,老周給大伙兒弄個樣本,我們還是“有理有據”,用實際例子來看看父視窗與子視窗之間的關係變化會有啥不同。
第一步,我們準備好主視窗,通常建立 WPF 項目時,項目模板會產生一個主視窗——MainWindow,我們就用它吧。
<Window x:Class="MyDemo.MainWindow" …… mc:Ignorable="d" Title="父視窗" Height="350" Width="525"> <StackPanel Margin="20"> <TextBlock Margin="0,12,0,100" Text="主視窗" FontSize="40" FontFamily="楷體" HorizontalAlignment="Center"/> <Button Content="點擊報名火星單程遊" HorizontalAlignment="Center" Padding="150,15" Click="OnClick"/> </StackPanel></Window>
注意那個按鈕,後面有用,點擊它可以開啟另一個視窗。
第二步,再建立一個 WPF 視窗,XAML 如下。
<Window x:Class="MyDemo.AddNewWindow" …… mc:Ignorable="d" Title="報名" Height="300" Width="300"> <Grid> <Button Content="關閉" VerticalAlignment="Bottom" HorizontalAlignment="Center" Padding="100,10" Click="OnClick"/> </Grid></Window>
那個“關閉”按鈕沒啥特殊功能,只是用來關閉視窗,代碼如下。
private void OnClick(object sender, RoutedEventArgs e) { Close(); }
第三步,回到主視窗,剛剛老周提醒過,主視窗上那個 Button 控制項,現在要用上了,我們處理一下它的單擊事件。
private void OnClick(object sender, RoutedEventArgs e) { AddNewWindow w2 = new AddNewWindow(); w2.Show(); this.Owner = w2; }
對一個視窗來說,必須顯示以後,才能操作 Owner 屬性,為了安全保險,大家可以在視窗顯示後再去思考誰是誰的 Owner。
現在我們來運行一下。開啟新視窗時是這樣的。
然後,切換到其他視窗,再切換回來,你會看到,此時就算新視窗處於啟用狀態,主視窗始終擋在新視窗前。
而且,你還會發現,把主視窗關了程式不會退出,但把新視窗關了程式就會退出。那是因為現在 w2 才是父視窗,而 MainWindow 成了子視窗。
現在我們把代碼改一下。
AddNewWindow w2 = new AddNewWindow(); w2.Show(); //this.Owner = w2; w2.Owner = this;
看好了,這一次是 MainWindow 作為父視窗,w2 作為子視窗。這樣的邏輯才符合我們的要求,當初的預期就是,MainWindow 視窗上開啟新視窗,並且當進行了視窗切換後再次回到應用程式時,應當讓新開啟的視窗處於活動狀態。
再次運行,此時,你會看到,新視窗始終會擋在主視窗前面。
好了,今天的內容就差不多了,還是那句話,你要弄清楚誰是誰的父視窗。給大家一句萬能口訣:Owner 屬性所引用的視窗就會成為父視窗。
【.net 深呼吸】WPF 中的父子視窗