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

发表于:2017-9-25 10:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:老周    来源:51Testing软件测试网采编

  与WinForm不同,WPF并没有MDI窗口,但WPF的窗口之间是可以存在“父子”关系的。
  我们会发现,Window类公开了一个属性叫Owner,这个属性是可读可写的,从名字上我们也能猜到,应该是用来设置窗口的父子关系的。这个属性看起来不难用,只要赋个窗口实例即可,而真正的难点是你得搞清楚“谁是谁的父窗口”,“谁是谁的子窗口”,一旦你搞混了,有可能会应用程序带来一些小麻烦。
  这个问题是一位妹子问我的,不然怎么说女孩子特别细心呢,这个小玩意儿估计很多时候我们都不会注意到。
  下面,老周给大伙儿弄个示例,我们还是“有理有据”,用实际例子来看看父窗口与子窗口之间的关系变化会有啥不同。
  第一步,我们准备好主窗口,通常创建WPF项目时,项目模板会生成一个主窗口——MainWindow,我们就用它吧。
  <Windowx:Class="MyDemo.MainWindow"
  ……
  mc:Ignorable="d"
  Title="父窗口"Height="350"Width="525">
  <StackPanelMargin="20">
  <TextBlockMargin="0,12,0,100"Text="主窗口"FontSize="40"FontFamily="楷体"HorizontalAlignment="Center"/>
  <ButtonContent="点击报名火星单程游"HorizontalAlignment="Center"Padding="150,15"Click="OnClick"/>
  </StackPanel>
  </Window>
  注意那个按钮,后面有用,点击它可以打开另一个窗口。
  第二步,再新建一个WPF窗口,XAML如下。
  <Windowx:Class="MyDemo.AddNewWindow"
  ……
  mc:Ignorable="d"
  Title="报名"Height="300"Width="300">
  <Grid>
  <ButtonContent="关闭"VerticalAlignment="Bottom"HorizontalAlignment="Center"Padding="100,10"Click="OnClick"/>
  </Grid>
  </Window>
  那个“关闭”按钮没啥特殊功能,只是用来关闭窗口,代码如下。
  privatevoidOnClick(objectsender,RoutedEventArgse)
  {
  Close();
  }
  第三步,回到主窗口,刚刚老周提醒过,主窗口上那个Button控件,现在要用上了,我们处理一下它的单击事件。
  privatevoidOnClick(objectsender,RoutedEventArgse)
  {
  AddNewWindoww2=newAddNewWindow();
  w2.Show();
  this.Owner=w2;
  }
  对一个窗口来说,必须显示以后,才能操作Owner属性,为了安全保险,大家可以在窗口显示后再去思考谁是谁的Owner。
  现在我们来运行一下。打开新窗口时是这样的。
  然后,切换到其他窗口,再切换回来,你会看到,此时就算新窗口处于激活状态,主窗口始终挡在新窗口前。
  而且,你还会发现,把主窗口关了程序不会退出,但把新窗口关了程序就会退出。那是因为现在w2才是父窗口,而MainWindow成了子窗口。
  现在我们把代码改一下。
  AddNewWindoww2=newAddNewWindow();
  w2.Show();
  //this.Owner=w2;
  w2.Owner=this;
  看好了,这一次是MainWindow作为父窗口,w2作为子窗口。这样的逻辑才符合我们的要求,当初的预期就是,MainWindow窗口上打开新窗口,并且当进行了窗口切换后再次回到应用程序时,应当让新打开的窗口处于活动状态。
  再次运行,此时,你会看到,新窗口始终会挡在主窗口前面。
  好了,今天的内容就差不多了,还是那句话,你要弄清楚谁是谁的父窗口。给大家一句万能口诀:Owner属性所引用的窗口就会成为父窗口。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号