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-----------------------------------------------------

相关推荐
wfserial2 小时前
c#使用微软自带speech选择男声仍然是女声的一种原因
microsoft·c#·speech
人道领域2 小时前
SSM框架从入门到入土(AOP面向切面编程)
java·开发语言
铅笔侠_小龙虾2 小时前
Flutter 实战: 计算器
开发语言·javascript·flutter
2的n次方_2 小时前
Runtime 执行提交机制:NPU 硬件队列的管理与任务原子化下发
c语言·开发语言
2501_944711433 小时前
JS 对象遍历全解析
开发语言·前端·javascript
凡人叶枫3 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
Tony Bai3 小时前
再见,丑陋的 container/heap!Go 泛型堆 heap/v2 提案解析
开发语言·后端·golang
小糯米6013 小时前
C++顺序表和vector
开发语言·c++·算法
froginwe113 小时前
JavaScript 函数调用
开发语言
阔皮大师4 小时前
INote轻量文本编辑器
java·javascript·python·c#