C# 20260112

Application生命周期

在前面,我们知道打开了隐藏代码app是继承了application的。

app什么都没有给我们展示,那自然要求看看application里面有什么东西。

使用override可以看app可以重写applicaition的哪些方法。

override官方文档这么写的,不需要理解太深,容易晕:

简单说就是字面意思,对基类方法的新实现。

正是如此,肯定是applicaiton里面有些方法可以提供给app重写,从而实现在程序启动和程序关闭中各种操作。**让我们去找找这些方法!**看到图二中onexit()方法,双击application找找。

    • OnStartup (程序启动)
    • OnActivated (窗口首次激活)
    • OnDeactivated (重新激活)
    • OnExit (程序退出)

就是这些了!


为了验证一下重写的效果和applicaiton的周期的效果,我们可以在4个周期中打印语出出来。

cs 复制代码
 public partial class App : Application
 {
     protected override void OnStartup(StartupEventArgs e)
     {
         base.OnStartup(e);//执行applicaiton父类方法
         Console.WriteLine("Onstartup方法执行");
     }

     protected override void OnActivated(EventArgs e)
     {
         base.OnActivated(e);
         Console.WriteLine("OnActivated方法执行");
     }

     protected override void OnDeactivated(EventArgs e)
     {
         base.OnDeactivated(e);
         Console.WriteLine("OnDeactivate方法执行");
     }

     protected override void OnExit(ExitEventArgs e)
     {
         base.OnExit(e);
         Console.WriteLine("OnExit方法执行");
     }


 }

效果如下:

启动项目,onstartup方法执行,OnActivated执行,激活窗口。红线部分为打印出来的字符串。

窗口关闭会先失去激活(OnDeactivated),再关闭(Onexit)。

窗口不关闭,但是最小化和最大化,都会执行激活和失去激活。

application生命周期大致就是这样了,很多事情可以在周期中执行!


主窗体Window的生命周期

同理,Mainwindow继承于window

不停往下点,我们发现:

  • 继承路线:MainWindow → Window → ContentControl → Control → FrameworkElement → UIElement → Visual → DependencyObject → DispatcherObject
  • 顶级父类:DispatcherObject是WPF中的顶级抽象类,所有UI元素的基类(DispatcherObject后面会被认识)

老师采用了在构造函数中,使用事件+匿名函数的方式进行打印。


构造函数(官方文档):

简单点说,就是实例化的时候会调用的一个函数。

事件的介绍:

官方文档中,关于订阅事件是这么描述的:

匿名函数官方是这么说的:

貌似没看懂,是涉及到Lambda表达式,面试经常使用,需要重点关注。

上面主要是了解**事件订阅(采用"+="符号)和匿名函数("=>")。作用就是在窗口各种方法执行的时候,触发相应的打印事件。**不需要深入理解,理解大概操作,现在主要就是看Window生命周期。


cs 复制代码
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.SourceInitialized += (s, e) => Console.WriteLine("1、MainWindow.SourceInitialized被触发");
        this.Activated += (s, e) => Console.WriteLine("2、MainWindow.Activated被触发");
        this.Loaded += (s, e) => Console.WriteLine("3、MainWindow.Loaded被触发");
        this.ContentRendered += (s, e) => Console.WriteLine("4、MainWindow.ContentRendered 被触发");
        this.Deactivated += (s, e) => Console.WriteLine("5、MainWindow.Deactivated被触发");
        this.Closing+=(s,e)=>Console.WriteLine("6、MainWindow.Closing被触发");
        this.Closed += (s, e) => Console.WriteLine("7、MainWindow.Closed被触发");
        this.Unloaded+=(s,e)=>Console.WriteLine("8、MainWindow.Unloaded被触发");
    }
}

结果是这样的(启动和关闭):

大概流程是这样的(window周期):

有点晚了,先简单收尾,明天补充,广东不知啥天气,一冷一热感觉浑身难受,注意身体。

--------------2026、1、13-----------------------------------------------------

相关推荐
float_六七2 小时前
JS比较运算符:从坑点速记到实战口诀
开发语言·javascript·ecmascript
CoderCodingNo2 小时前
【GESP】C++五级练习(前缀和练习) luogu-P1387 最大正方形
开发语言·c++·算法
yong99902 小时前
信号分形维数计算方法与MATLAB实现
开发语言·人工智能·matlab
r_oo_ki_e_2 小时前
java23--异常
java·开发语言
数据大魔方2 小时前
【期货量化入门】股指期货量化入门:IF/IC/IH交易全攻略(TqSdk完整教程)
开发语言·python
无风听海2 小时前
C#中实现类的值相等时需要保留null==null为true的语义
开发语言·c#
ZouZou老师2 小时前
Linux Qt出现xcb异常问题解决办法
开发语言·qt
知乎的哥廷根数学学派2 小时前
基于多尺度特征提取和注意力自适应动态路由胶囊网络的工业轴承故障诊断算法(Pytorch)
开发语言·网络·人工智能·pytorch·python·算法·机器学习
lsx2024062 小时前
JavaScript Date(日期)
开发语言