WPF中所有窗口的基类型都是System.Windows.Window。Window通常用于SDI(SingleDocumentInterface)、MDI(MultipleDocumentInterface)窗口和对话框。Window在应用程序中除了一个设计用于托管顶级内容的控件外,就别无他物了。典型的,可以混合使用标记和代码来定义一个窗口。代码如下(这里使用VisualStudio 输出窗口查看调试信息):

xaml代码:
<Window x:Class="WindowDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WindowDemo"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="测试" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Name="BtnOpenWindow" Click="BtnOpenWindow_Click"/>
</Grid>
</Window>
  c#代码:
using System;
using System.Windows; namespace WindowDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Unloaded += MainWindow_Unloaded;
this.Initialized += MainWindow_Initialized;
this.ContentRendered += MainWindow_ContentRendered;
this.Loaded += MainWindow_Loaded;
this.Activated += MainWindow_Activated;
this.Deactivated += MainWindow_Deactivated;
this.Closing += MainWindow_Closing;
this.Closed += MainWindow_Closed;
Console.WriteLine($"{this.Name}:Constructor");
} private void MainWindow_Closed(object sender, EventArgs e)
{
Console.WriteLine($"{this.Name}:Closed");
} private void MainWindow_Unloaded(object sender, RoutedEventArgs e)
{
Console.WriteLine($"{this.Name}:Unloaded");
} private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Console.WriteLine($"{this.Name}:Closing");
} private void MainWindow_ContentRendered(object sender, EventArgs e)
{
Console.WriteLine($"{this.Name}:ContentRendered");
} private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Console.WriteLine($"{this.Name}:Loaded");
} private void MainWindow_Deactivated(object sender, EventArgs e)
{
Console.WriteLine($"{this.Name}:Deactivated");
} private void MainWindow_Activated(object sender, EventArgs e)
{
Console.WriteLine($"{this.Name}:Activated");
} private void MainWindow_Initialized(object sender, EventArgs e)
{
Console.WriteLine($"{this.Name}:Initialized");
} private static int i = ;
private void BtnOpenWindow_Click(object sender, RoutedEventArgs e)
{
new MainWindow()
{
Name = $"window_{i}"
}.Show();
i++;
} }
}
  界面:

    

  生命周期中事件执行顺序:

    1.Constructor:构造函数创建窗体对象是调用,整个生命周期中调用一次
    2.Activated:在窗口成为前台窗口时发生
    3.Loaded:当对元素进行布局、呈现,且可将其用于交互时发生
    4.ContentRendered:在呈现窗口的内容之后发生

      5.用户与窗体进行交互

    6.Closing:之后立即发生 Close 被调用,并且可以处理以取消关闭窗口
    7.Deactivated:在窗口成为后台窗口时发生
    8.Closed:当窗口即将关闭时发生
    9.Unloaded:当元素从加载元素的元素树中移除时发生。

   过程1:在创建窗体对象是调用,过程2-4:在调用Show、ShowDialog时触发,过程6-9:关闭窗口时触发(点击关闭按钮,而非Application.Current.Shutdown退出应用)

  用户在运行系统上的多个窗口中切换时,Activated和Deactivated在窗口的生命周期里会发生多次。ContentRendered事件只对窗口第一次完全呈现出来进行触发。为了让一些事情能在所有内容都显示给用户之前马上执行,可以用Loaded事件;为了让一些事情能在所有内容都显示给用户之后马上执行,可以用ContentRendered事件。

PS:

  1.Unloaded:应用程序开始关闭后(Application.Current.Shutdown();),不会引发此事件。  如果您将处理程序中的清理代码放 Unloaded 事件,例如对于 Window 或 UserControl, ,可能不会按预期方式调用它。

2. 根据 ShutdownMode 属性配置的不同,关闭窗体时Shutdown的隐式调用可能会导致Unloaded不会按预期的方式被调用。

WPF Window对象的生命周期的更多相关文章

  1. vue02 过滤器、计算和侦听属性、vue对象的生命周期、阻止事件冒泡和刷新页面

    3. Vue对象提供的属性功能 3.1 过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 定义过滤器的方式有两种. 3.1.1 使用Vue.fil ...

  2. [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. hibernate 持久化对象的生命周期 2.1

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...

  5. Java 对象的生命周期

    Java对象的生命周期 在Java中,对象的生命周期包含下面几个阶段: 1.      创建阶段(Created) 2.      应用阶段(In Use) 3.      不可见阶段(Invisib ...

  6. 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控

    如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...

  7. [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少分配率, 最重要的规则,缩短对象的生命周期,减少对象层次的深度,减少对象之间的引用,避免钉住对象(Pinning)

    减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少GC回收时的压力,同时降低了内存碎片与CPU的使用量.你可以用一些方法来达到这一目的,但它可能会与其它设计相冲突. 你需要在设计对象时仔细检 ...

  8. Hibernate学习(4)- Hibernate对象的生命周期

    1.Hibernate对象的生命周期(瞬时状态.持久化状态.游离状态) 1.瞬时状态(Transient): 使用new操作符初始化的对象就是瞬时状态,没有跟任何数据库数据相关联:2.持久化状态(Pa ...

  9. Unity中巧用协程和游戏对象的生命周期处理游戏重启的问题

    主要用到协程(Coroutines)和游戏对象的生命周期(GameObject Lifecycle)基础知识,巧妙解决了游戏重启的问题. 关于协程,这里有篇文章我觉得写的非常好,理解起来也很容易.推荐 ...

随机推荐

  1. arcgis android 中shapefile的加载

    前言 本文为大家分享arcgis android 中shapefile的加载,默认你有java环境,懂一定的android基础知识,默认你已经安装android studio.如缺乏以上环境和知识,请 ...

  2. RobotFramework做接口自动化(内部接口需要登录token)

    背景: 项目中需要做接口自动化测试,使用robot,有一个收货地址列表的接口直接传参数访问时会返回:{"msg":"缺少参数","code" ...

  3. [CSS]利用伪元素实现一些特殊图形 from baidu校招

    最近在博客园看到某人发的baidu校招题目,说是要用一行html代码实现下面的这个图形: 给定的html代码是: <div class='square'></div> ---- ...

  4. 格式化JavaScript代码

    javascript代码格式化工具 网上下载的js代码经常遇到代码已被压缩(注释.换行.缩进.空格.TAB等都被删除了),如果拿来学习.研究的话必定看到头晕.有些编辑器的“格 式化代码”功能可以解决这 ...

  5. Https&证书

    参考 http站点转https站点教程 http站点转https站点教程 HTTP与HTTPS的区别 Http站点转为Https: 为域名购买/申请证书(免费型DV SSL) 把证书部署到web se ...

  6. Winform Log4net 配置写不同文件

    以下配置了二种写文件,第一种根据日期写文件yyyyMMdd.txt,第二种是写固定文件login.txt. 1, 下载Log4net组件: http://logging.apache.org/log4 ...

  7. Major OSL changes to catch up

    flat_map optimization for runtime specialization: https://github.com/imageworks/OpenShadingLanguage/ ...

  8. Javascript:日期排班功能实现

     背景: 近期,公司的产品经常会遇到日期排班类似的功能: 需求的排班日期长短不一:有些是两周,有些是四周:要求选中的时候有一个active的状态区分,另外要提供钩子获取选中日期的形如:[2018-04 ...

  9. “全栈2019”Java第十八章:一元运算符

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. TCP协议中URG和PSH位

    URG(紧急位):设置为1时,首部中的紧急指针有效:为0时,紧急指针没有意义. PSH(推位):当设置为1时,要求把数据尽快的交给应用层,不做处理 通常的数据中都会带有PSH但URG只在紧急数据的时设 ...