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

相关推荐
hez201021 小时前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
雨落倾城夏未凉6 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫7 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫8 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m6258 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户91721561902118 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠9 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫11 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech11 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf13 天前
C#摸鱼实录——IoC与DI案例详解
c#