与 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 中的父子窗口的更多相关文章

  1. 如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI

    原文:如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI 由于 WPF 路由事件(主要是隧道和冒泡)的存在,我们很容易能够通过只监听窗口中的某些事件使得整个窗口中所有控件发生的事件都被 ...

  2. WPF中两个窗口的互斥

    这里所讲的互斥是两个窗口不同时存在,打开一,只显示一:点一相关按钮显示二,关闭一:关闭二,显示一. 窗口一: history winResult winChoice = new winResult() ...

  3. WPF中实现登陆窗口的“记住帐号”功能

    1.在Login.xaml中添加资源: <XmlDataProvider x:Key="XmlDataProvider" Source="pack://applic ...

  4. C# 在winform或者wpf中显示控制台窗口

    这儿需要使用两个系统函数: BOOL WINAPI FreeConsole(void); //// 关闭控制台窗口,参考:http://msdn.microsoft.com/en-us/library ...

  5. WPF 中保存 window(窗口)或者canvas成图片

    最近需要用到这个功能,搜了一下不少代码有问题 ,找到一个效果比较好的,支持多级子元素 记一下. private void button_save_window_Click(object sender, ...

  6. 使用 SetParent 制作父子窗口的时候,如何设置子窗口的窗口样式以避免抢走父窗口的焦点

    原文:使用 SetParent 制作父子窗口的时候,如何设置子窗口的窗口样式以避免抢走父窗口的焦点 制作传统 Win32 程序以及 Windows Forms 程序的时候,一个用户看起来独立的窗口本就 ...

  7. WPF中禁止WebBrowser控件打开新窗口

    一.针对纯WPF的WebBrowser控件: <summary> Suppress Script Errors In WPF WebBrowser </summary> pub ...

  8. WPF中利用后台代码实现窗口分栏动态改变

    在WPF中实现窗口分栏并能够通过鼠标改变大小已经非常容易,例如将一个GRID分成竖排三栏显示,就可以将GRID先分成5列,其中两个固定列放GridSplitter. <Grid Backgrou ...

  9. WPF中窗口控件的跨线程调用

    在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可. 在WPF中要麻烦一下,同样的不允许跨线程访问,因为没 ...

随机推荐

  1. [补档]vijos1883 月光的魔法

    vijos1883 月光的魔法 题目 传送门:https://www.vijos.org/p/1883 背景 影几欺哄了众生了 天以外-- 月儿何曾圆缺   描述 有些东西就如同月光的魔法一般. Lu ...

  2. 分布式事务,EventBus 解决方案:CAP【中文文档】

    前言 很多同学想对CAP的机制以及用法等想有一个详细的了解,所以花了将近两周时间写了这份中文的CAP文档,对 CAP 还不知道的同学可以先看一下这篇文章. 本文档为 CAP 文献(Wiki),本文献同 ...

  3. MJRefresh 使用注意点

    1.使用上拉加载更多, 当数据加载完调用[ableView.mj_footer endRefreshingWithNoMoreData]方法显示已经全部加载完毕这个方法,一定要放在[tableView ...

  4. 安徽省2016“京胜杯”程序设计大赛_A_砝码称重

    砝码称重 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 61 Accepted: 37 Description 小明非常喜 ...

  5. Learn c language the one day

    第一个c程序 #include<stdio.h> int main() { ; ; printf_s("请输入两个数字:"); scanf_s("%d,%d& ...

  6. 一次和matplotlib和numpy的初识及简单的异常值清理

    1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 ...

  7. 基于react全家桶+antd-design+webpack2+node+express+mongodb开发的前后台博客系统

    很久没更新博客,最近也有点忙,然后业余时间搞了一个比较完整基于react全家桶+antd-design+webpack2+node+express+mongodb开发的前后台博客系统的流程系统,希望对 ...

  8. 王佩丰第2讲-excel单元格格式设置 笔记

    点小箭头都可以进入单元格格式设置 跨越合并 添加斜线 回车 ALT+ENTER 格式刷 数字格式 特定红色 货币VS会计专用 日期 2是1月2号,3是1月3号-- 自定义[例子中是在数值后面加&quo ...

  9. OS作业模拟SJF和FCFS

    一个OS的作业, 用于模拟短作业优先 和 先来先服务两种作业调度方式. #!/usr/bin/python3.5 ## Modify the SJF and FCFS algorithm in the ...

  10. Json应用案例之FastJson

    这几天在网上找关于Json的一些案例,无意当中找到了一个我个人感觉比较好的就是阿里巴巴工程师写的FastJson. package com.jerehedu.fastjson; import java ...