【.net 深呼吸】WPF 中的父子視窗

來源:互聯網
上載者:User

標籤:另一個   按鈕   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 中的父子視窗

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.