【.net 深呼吸】WPF 中的父子窗口
与 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 属性所引用的窗口就会成为父窗口。
相关文章
- Visual Studio 2013中ASP.NET开发部分预览
- .NET代码转换器
- 评论:微软.Net平台活力正在慢慢消褪
- ASP.net判断上传文件类型的三种方法
- ASP.NET常被忽视的一些细节
- 将死的平台:.Net
- HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
- 基于.net开发chrome核心浏览器【一】
- .NET陷阱之奇怪的OutOfMemoryException
- .NET领域驱动设计—初尝(二)
- Visual Studio的工程结构解析
- .NET领域驱动设计—初尝
- HttpContext.Current并非无处不在
- Asp.Net页面生命周期
- ASP.NET WebForm也可以这样用Ajax
- 如何在ASP.NET应用程序中初始化
- AJAX长轮询之DotNet实现
- 减少.NET应用程序内存占用的一则实践
- Visual Studio中编译任务压缩js和CSS文件
- 各种AJAX方法的使用比较