【WPF.NET开发】对象生存期事件

本文内容

  1. 先决条件
  2. 视觉对象的生存期事件
  3. 其他生存期事件

在所有对象的生存期内,Microsoft .NET 托管代码中的所有对象都会经历“创建”、“使用”和“销毁”的阶段。 当关于这些阶段的通知出现在对象上时,Windows Presentation Foundation (WPF) 会通过引发生存期事件来进行提供。 对于 WPF 框架级元素(视觉对象),WPF 会实现 Initialized、Loaded 和 Unloaded 生存期事件。 开发人员可以将这些生存期事件用作涉及元素的代码隐藏操作的挂钩。 本文先介绍视觉对象的生存期事件,然后介绍专门应用于窗口元素、导航宿主或应用程序对象的其他生存期事件。

1、先决条件

本文假定你已基本了解如何将 WPF 元素布局概念化为树,并且你已经阅读过路由事件概述
。 若要理解本文中的示例,还应当熟悉 Extensible Application Markup Language (XAML) 并知道如何编写 WPF 应用程序。

2、视觉对象的生存期事件

WPF 框架级元素派生自 FrameworkElement 或 FrameworkContentElement。 Initialized、Loaded和 Unloaded 生存期事件是所有 WPF 框架级别元素所通用的。 以下示例演示主要在 XAML 中实现的元素树。 XAML 定义一个父 Canvas 元素,其中包含嵌套元素,每个元素都使用 XAML 属性语法附加 InitializedLoaded 和 Unloaded 生存期事件处理程序。

<Canvas x:Name="canvas"><StackPanel x:Name="outerStackPanel" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler"><custom:ComponentWrapper x:Name="componentWrapper" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler"><TextBox Name="textBox1" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler" /><TextBox Name="textBox2" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler" /></custom:ComponentWrapper></StackPanel><Button Content="Remove canvas child elements" Click="Button_Click"/>
</Canvas>

其中一个 XAML 元素是自定义控件,它派生自在代码隐藏中分配生存期事件处理程序的基类。

public partial class MainWindow : Window
{public MainWindow() => InitializeComponent();// Handler for the Initialized lifetime event (attached in XAML).private void InitHandler(object sender, System.EventArgs e) => Debug.WriteLine($"Initialized event on {((FrameworkElement)sender).Name}.");// Handler for the Loaded lifetime event (attached in XAML).private void LoadHandler(object sender, RoutedEventArgs e) => Debug.WriteLine($"Loaded event on {((FrameworkElement)sender).Name}.");// Handler for the Unloaded lifetime event (attached in XAML).private void UnloadHandler(object sender, RoutedEventArgs e) =>Debug.WriteLine($"Unloaded event on {((FrameworkElement)sender).Name}.");// Remove nested controls.private void Button_Click(object sender, RoutedEventArgs e) => canvas.Children.Clear();
}// Custom control.
public class ComponentWrapper : ComponentWrapperBase { }// Custom base control.
public class ComponentWrapperBase : StackPanel
{public ComponentWrapperBase(){// Assign handler for the Initialized lifetime event (attached in code-behind).Initialized += (object sender, System.EventArgs e) => Debug.WriteLine($"Initialized event on componentWrapperBase.");// Assign handler for the Loaded lifetime event (attached in code-behind).Loaded += (object sender, RoutedEventArgs e) => Debug.WriteLine($"Loaded event on componentWrapperBase.");// Assign handler for the Unloaded lifetime event (attached in code-behind).Unloaded += (object sender, RoutedEventArgs e) => Debug.WriteLine($"Unloaded event on componentWrapperBase.");}
}/* Output:
Initialized event on textBox1.
Initialized event on textBox2.
Initialized event on componentWrapperBase.
Initialized event on componentWrapper.
Initialized event on outerStackPanel.Loaded event on outerStackPanel.
Loaded event on componentWrapperBase.
Loaded event on componentWrapper.
Loaded event on textBox1.
Loaded event on textBox2.Unloaded event on outerStackPanel.
Unloaded event on componentWrapperBase.
Unloaded event on componentWrapper.
Unloaded event on textBox1.
Unloaded event on textBox2.
*/

程序输出显示在每个树对象上调用 Initialized、 Loaded和 Unloaded 生存期事件的顺序。 以下各节按在每个树对象上引发这些事件的顺序对其进行介绍。

2.1 初始化的生存期事件

在以下情况下,WPF 事件系统会在元素上引发 Initialized 事件:

  • 设置元素的属性时。
  • 大约在同一时间通过调用对象构造函数对其进行初始化。

某些元素属性(如 Panel.Children)可以包含子元素。 父元素在初始化其子元素之前无法报告初始化。 因此,从元素树中嵌套最深的元素开始设置属性值,后跟连续父元素,一直到应用程序根。 由于在设置元素的属性时发生 Initialized 事件,因此首先在标记中定义的嵌套最深的元素上调用该事件,后跟连续父元素,一直到应用程序根。 在代码隐藏中动态创建对象时,其初始化可能不按顺序进行。

WPF 事件系统不会等待元素树中的所有元素都完成初始化,然后再对元素引发 Initialized 事件。 因此,在为任何元素编写 Initialized 事件处理程序时,请记住,逻辑树或可视化树中的周围元素(尤其是父元素)可能尚未创建。 或者,其成员变量和数据绑定可能未初始化。

 备注

在元素上引发 Initialized 事件时,将取消计算元素的表达式用法,例如动态资源或绑定。

2.2 加载的生存期事件

在以下情况下,WPF 事件系统会在元素上引发 Loaded 事件:

  • 当包含该元素的逻辑树完成并连接到演示文稿源时。 演示源提供窗口句柄 (HWND) 和呈现图面。
  • 当数据绑定到本地源(例如其他属性或直接定义的数据源)完成时。
  • 在布局系统已计算呈现所需的所有值后。
  • 在最终呈现之前。

在加载
逻辑树中的所有元素之前,不会在元素树中的任何元素上引发 Loaded 事件。 WPF 事件系统首先在元素树的根元素上引发 Loaded 事件,然后在每个连续的子元素上向下引发嵌套最深的元素。 尽管此事件可能类似于
隧道路由事件,但 Loaded 事件不会将事件数据从一个元素传输到另一个元素,因此将事件标记为已处理没有效果。

 备注

WPF 事件系统无法保证异步数据绑定在 Loaded 事件之前已经完成。 异步数据绑定会绑定到外部或动态源。

2.3 卸载的生存期事件

在以下情况下,WPF 事件系统会在元素上引发 Unloaded 事件:

  • 删除其演示文稿源时,或
  • 删除其视觉对象父级时。

WPF 事件系统首先在元素树的根元素上引发 Unloaded 事件,然后在每个连续的子元素上向下引发嵌套最深的元素。 尽管此事件可能类似于
隧道路由事件,但 Unloaded 事件不会将事件数据在元素间传播,因此将事件标记为已处理没有效果。

在 Unloaded 元素上引发事件时,它的父元素或逻辑树或可视化树中更高级的元素可能已取消设置。 取消设置意味着元素的数据绑定、资源引用和样式不再设置为其正常或上次已知运行时值。

3、其他生存期事件

从生存期事件角度来看,主要有四种 WPF 对象类型:常规元素、窗口元素、导航宿主和应用程序对象。 Initialized、Loaded和 Unloaded 生存期事件适用于所有框架级元素。 其他生存期事件专门应用于窗口元素、导航宿主或应用程序对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/584119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

售后客服日常回复必备的话术

致歉安抚通用 1.非常抱歉耽误您宝贵的时间了&#xff0c;这边给您查询一下&#xff0c;请稍等。 2.非常抱歉&#xff0c;给您添麻烦了。这边为您转接售后专员给您处理&#xff0c;请亲稍等。 3.影响到您的购物体验万分抱歉。 4.这边都会给您尽心解决的呢。 5.我非常理解您…

算法:加油站

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、问题描述 二、原始解法 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、问题描述 在一条环路上有N个加油站&#xff0c;其中第…

深度解析高防产品---游戏盾

游戏盾是针对游戏行业所推出的高度可定制的网络安全解决方案&#xff0c;游戏盾是高防产品系列中针对游戏行业的安全解决方案。游戏盾专为游戏行业定制&#xff0c;针对性解决游戏行业中复杂的DDoS攻击、游戏CC攻击等问题。游戏盾通过分布式的抗D节点&#xff0c;可以防御TB级大…

@PersistenceContext和@Autowired在EntityManager上应用的不同

首先PersistenceContext是jpa专有的注解&#xff0c;而Autowired是spring自带的注释 上方图片的意思就是EntityManager不是线程安全的&#xff0c;当多个请求进来的时候&#xff0c;spring会创建多个线程&#xff0c;而PersistenceContext就是用来为每个线程创建一个EntityMana…

AI渲染:改变图像和视频制作的技术革命

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其应用领域已经覆盖了从医疗、教育到娱乐、艺术等各个行业。其中&#xff0c;AI在图像和视频制作领域的应用尤为引人注目&#xff0c;而AI渲染则是这一领域中的一颗璀璨明珠。AI渲染利用人工智能算法对图像和…

智能外呼系统全新升级,携手企业迈向高效转化新时代

智能外呼系统已成为企业提升业务效率和转化率的重要工具。随着人工智能技术的不断进步&#xff0c;智能外呼系统迎来了全面升级&#xff0c;旨在进一步助力企业优化客户沟通流程&#xff0c;提高业务转化效率。 新升级的智能外呼系统采用了更先进的自然语言处理技术&#xff0c…

Linux free命令使用教程(free指令)(查看内存、系统内存、内存占用、内存使用情况)

文章目录 Linux free命令使用教程1. free命令简介2. free命令选项2.1 显示单位&#xff08;free -b、free -k、free -m、free -g&#xff09;2.2 使用人类可读的格式&#xff08;free -h&#xff09;2.3 显示总计数&#xff08;free -t&#xff09;2.4 连续监视内存使用 3. 解析…

新疆老人扶梯摔倒铁路民警秒速救援 揭秘富维智能识别跌倒技术

近日&#xff0c;吐鲁番北站进站口一位年长的乘客在火车站的扶梯上突然失去平衡摔倒了&#xff0c;紧张的一幕在铁路民警的快速反应下得到了及时的处理。这位民警的敏捷和专业救援能力赢得了大家的称赞&#xff0c;同时也让我们思考&#xff1a;如何更好地及时报警这类事故的发…

【强化学习】基于蒙特卡洛MC与时序差分TD的简易21点游戏应用

1. 本文将强化学习方法&#xff08;MC、Sarsa、Q learning&#xff09;应用于“S21点的简单纸牌游戏”。 类似于Sutton和Barto的21点游戏示例&#xff0c;但请注意&#xff0c;纸牌游戏的规则是不同且非标准的。 2. 为方便描述&#xff0c;过程使用代码截图&#xff0c;文末附链…

马斯克谈六西格玛:管理质量与火箭科学如何相辅相成

如果你问我&#xff0c;作为一个有志于送人类上火星的家伙&#xff0c;六西格玛管理有没有用&#xff1f;我会说&#xff0c;如果把火箭控制的精度与六西格玛得到的生产质量相比&#xff0c;你会发现两者都追求同一件事&#xff1a;接近零缺陷的完美。 六西格玛不只是一组工具…

elasticsearch系列七:聚合查询

概述 今天咱们来看下es中的聚合查询&#xff0c;在es中聚合查询分为三大类bucket、metrics、pipeline&#xff0c;每一大类下又有十几种小类&#xff0c;咱们各举例集中&#xff0c;有兴许的同学可以参考官网&#xff1a;https://www.elastic.co/guide/en/elasticsearch/refere…

np.copy()是深拷贝还是浅拷贝

np.copy到底是深拷贝还是浅拷贝 实验1. 拷贝矩阵2. 修改m的值3. 修改拷贝矩阵的值 官方文档参考文档 最近在用numpy的拷贝操作&#xff0c;发现网上对np.copy()究竟是深拷贝还是浅拷贝说法不一致&#xff0c;因此记录一下。 总结&#xff1a;如果numpy array是一个简单的数组&…

yolov7中添加fppi评价指标

参考&#xff1a;https://blog.csdn.net/liuhao3285/article/details/135233281?spm1001.2014.3001.5502 fppifp/image_num yolov7中增加FPPI FPPI实现 yolo7中的评价指标实现位于utils/metrics.py中&#xff0c;我们只需要参照mAP指标在其中增加FPPI的内容即可&#xff1a;…

6、LLaVA

简介 LLaVA官网 LLaVA使用Vicuna(LLaMA-2)作为LLM f ϕ ( ⋅ ) f_\phi() fϕ​(⋅)&#xff0c;使用预训练的CLIP图像编码器 ViT-L/14 g ( X v ) g(X_v) g(Xv​)。 输入图像 X v X_v Xv​&#xff0c;首先获取feature Z v g ( X v ) Z_vg(X_v) Zv​g(Xv​)。考虑到最后一…

复试 || 就业day03(2023.12.29)算法篇

文章目录 前言同构字符串存在重复元素有效的字母异位词丢失的数字单词规律 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;文章题目大多来自于 leetcode&#xff0c;当然也可能来自洛谷或其他刷题平台 &#x1f4ab;欢迎大…

【Linux系统编程二十五】:线程概念(Linux中的轻量级进程)

【Linux系统编程二十五】&#xff1a;线程概念(Linux中的轻量级进程&#xff09; 一.线程的概念1.地址空间是资源窗口 二.线程初步理解1.进程执行分支(内部运行)2.执行粒度更细3.重构进程概念&#xff1a;系统资源分配的基本实体4.重构线程概念&#xff1a;系统调度的基本单位5…

springcloud中使用openfeign来优化接口调用

简单介绍在springcloud中使用openfeign来优化接口调用 目录 一、引入依赖二、为服务提供者编写openfeign接口三、服务消费者调用定义的openfeign接口四、项目结构五、日志级别配置1、通过配置类进行全局配置2、通过配置类进行局部配置3、通过配置文件配置 一、引入依赖 <!-…

业务中台-上线切换计划篇

业务中台上线&#xff0c;是一项涉及众多复杂环节的重大任务。以我们当前的项目为例&#xff0c;新增接口多达50多个&#xff0c;原系统接口需调整30多个&#xff0c;同时还需要处理流程、期初数据、数据迁移、人员、权限等各个方面。结合我在项目中的实际经验&#xff0c;本文…

3D展2D数学原理

今年早些时候&#xff0c;我为 MAKE 杂志写了一篇教程&#xff0c;介绍如何制作视频游戏角色的毛绒动物。 该技术采用给定的角色 3D 模型及其纹理&#xff0c;并以编程方式生成缝纫图案。 虽然我已经编写了一般摘要并将源代码上传到 GitHub&#xff0c;但我在这里编写了对使这一…

车联网的安全风险与应对措施

安全风险 1、恶意软件 攻击者可以通过入侵厂商或供应商网络&#xff0c;用恶意软件&#xff08;如病毒、木马、勒索软件等&#xff09;感染车联网系统组件&#xff0c;从而获得对车辆的控制权或窃取敏感信息。例如&#xff0c;一名安全研究人员成功入侵了特斯拉&#xff08;T…