综合应用WPF/WCF/WF/LINQ之三十三:XBAP项目中打开和关闭新的窗口

简介:
首先,我们在PageBase中添加一个Main属性。
    1      public  Page Main
    2     {
    3          get {  return ( Page) Application.Current.Properties[ "Main"]; }
    4     }
  然后在Login的界面中,将Main窗体的实例存储到系统属性中。注意,WPF中没有Session可用,不过我们可以将值存储在Application.Current.Properties中。
  这样一来,在任何一个继承于PageBase的窗口中,都可以通过this.Main的方式来访问主窗体的实例。
    1      Application.Current.Properties[ "Main"] =  new  Main();
    2 
    3      this.NavigationService.Navigate( this.Main);
  之后,我们可以在Main窗口的类中添加如下的代码,用于显示某个新窗口,任何继承于PageBase的窗口都可以通过访问this.Main.ShowListPage的方式来创建并显示一个新窗体。注意,由于具体显示什么窗体需要通过参数传进来,所以我们采用Activator.CreateInstance的方式来创建新窗口。
  代码最后的Navigate方法用于显示新窗口。
    1      public  void ShowListPage<T>()
    2     {
    3          try
    4         {
    5              PageBase page =  null;
    6              Type type =  typeof(T);
    7 
    8              if (type.Equals( typeof(Department. List))) page =  this._DepartmentList;
    9              if (type.Equals( typeof(Employee. List))) page =  this._EmployeeList;
   10 
   11              if (page ==  null)
   12             {
   13                 page = ( PageBase) Activator.CreateInstance(type);
   14 
   15                 page.Closed +=  new  EventHandler(Page_Closed);
   16             }
   17 
   18              if (type.Equals( typeof(Department. List)))  this._DepartmentList = (Department. List)page;
   19              if (type.Equals( typeof(Employee. List)))  this._EmployeeList = (Employee. List)page;
   20 
   21              this.Navigate(page);
   22         }
   23          catch
   24         {
   25              throw;
   26         }
   27     }
  在XBAP程序中,显示一个新窗口并不是指弹出一个新的窗口,而是将新窗口显示在Main窗口的一个Frame控件中。该控件的创建方法如下:
    1       < Frame  Name ="frmFrame"  DockPanel.Dock ="Bottom"  Margin ="0,26,0,0" />
  然后,我们即可以很简单的用Frame控件的Navigate方法实现显示新窗口了。在显示之前,我们先将其它窗口都设为隐藏状态,以便保留该窗口的当前状态。注意,不是关闭,只有用于点击窗口中的Close按钮时,才不需要保留窗口的当前状态。
    1      private  void Navigate( Page page)
    2     {
    3          try
    4         {
    5              if ( this._DepartmentList !=  nullthis._DepartmentList.Visibility =  Visibility.Hidden;
    6              if ( this._EmployeeList !=  nullthis._EmployeeList.Visibility =  Visibility.Hidden;
    7 
    8             page.Visibility =  Visibility.Visible;
    9 
   10              this.WindowTitle =  this.SystemTitle +  this.SystemSeparator +  this.Title +  this.SystemSeparator + page.Title;
   11 
   12              this.frmFrame.Navigate(page);
   13         }
   14          catch
   15         {
   16              throw;
   17         }
   18     }
  由于我们创建新窗体时,为新窗体添加了一个关闭事件(关闭事件PageBase中定义),那么这里就可以处理关闭事件了。关闭时并不是真正关闭一个窗体,而是将存储该窗体实例的变量设为null即可。
    1      private  void Page_Closed( object sender,  EventArgs e)
    2     {
    3          try
    4         {
    5             (sender  as  PageBase).Visibility =  Visibility.Hidden;
    6 
    7              if (sender  is Department. Listthis._DepartmentList =  null;
    8              if (sender  is Employee. Listthis._EmployeeList =  null;
    9 
   10              this.WindowTitle =  this.SystemTitle +  this.SystemSeparator +  this.Title;
   11         }
   12          catch
   13         {
   14              throw;
   15         }
   16     }




本文转自 Eallies 51CTO博客,原文链接:http://blog.51cto.com/eallies/79005,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
设计模式 前端开发 C#
WPF 项目中 MVVM模式 的简单例子说明
本文通过WPF项目中的加法操作示例,讲解了MVVM模式的结构和实现方法,包括数据模型、视图、视图模型的创建和数据绑定,以及命令的实现和事件通知机制。
|
3月前
|
持续交付 C# 敏捷开发
“敏捷之道:揭秘WPF项目中的快速迭代与持续交付——从需求管理到自动化测试,打造高效开发流程的全方位指南”
【8月更文挑战第31天】敏捷开发是一种注重快速迭代和持续交付的软件开发方法,通过短周期开发提高产品质量并快速响应变化。本文通过问题解答形式,探讨在Windows Presentation Foundation(WPF)项目中应用敏捷开发的最佳实践,涵盖需求管理、版本控制、自动化测试及持续集成等方面,并通过具体示例代码展示其实施过程,帮助团队提升代码质量和开发效率。
72 0
|
3月前
|
C# 开发者 Windows
勇敢迈出第一步:手把手教你如何在WPF开源项目中贡献你的第一行代码,从选择项目到提交PR的全过程解析与实战技巧分享
【8月更文挑战第31天】本文指导您如何在Windows Presentation Foundation(WPF)相关的开源项目中贡献代码。无论您是初学者还是有经验的开发者,参与这类项目都能加深对WPF框架的理解并拓展职业履历。文章推荐了一些适合入门的项目如MvvmLight和MahApps.Metro,并详细介绍了从选择项目、设置开发环境到提交代码的全过程。通过具体示例,如添加按钮点击事件处理程序,帮助您迈出第一步。此外,还强调了提交Pull Request时保持专业沟通的重要性。参与开源不仅能提升技能,还能促进社区交流。
44 0
|
3月前
|
开发者 C# UED
WPF多窗口应用程序开发秘籍:掌握窗口创建、通信与管理技巧,轻松实现高效多窗口协作!
【8月更文挑战第31天】在WPF应用开发中,多窗口设计能显著提升用户体验与工作效率。本文详述了创建新窗口的多种方法,包括直接实例化`Window`类、利用`Application.Current.MainWindow`及自定义方法。针对窗口间通信,介绍了`Messenger`类、`DataContext`共享及`Application`类的应用。此外,还探讨了布局控件与窗口管理技术,如`StackPanel`与`DockPanel`的使用,并提供了示例代码展示如何结合`Messenger`类实现窗口间的消息传递。总结了多窗口应用的设计要点,为开发者提供了实用指南。
221 0
|
3月前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
161 0
|
人工智能 C#
WPF自定义控件库之Window窗口
本文以自定义窗口为例,简述WPF开发中如何通过自定义控件来扩展功能和样式,仅供学习分享使用,如有不足之处,还请指正。
247 5
|
XML 存储 数据可视化
能快速构建和定制网络拓扑图的WPF开源项目-NodeNetwork
在现代软件开发中,数据可视化和可交互性越来越受到关注。为了实现这一点,通常需要使用各种图表、表格、网络拓扑图等控件。NodeNetwork就是一种这样的自定义方式,它是一个基于C# WPF的开源项目,可以帮助我们快速构建和定制网络拓扑图。
能快速构建和定制网络拓扑图的WPF开源项目-NodeNetwork
WPF项目获取代码行数
WPF项目获取代码行数
WPF项目获取代码行数
Revit 二次开发添加WPF窗口的办法
Revit 二次开发添加WPF窗口的办法
Revit 二次开发添加WPF窗口的办法
WPF项目中不支持 ResizingPanel,未在类型“ResizingPanel”中找到可附加的属性“ResizeWidth”
WPF项目中不支持 ResizingPanel,未在类型“ResizingPanel”中找到可附加的属性“ResizeWidth”