WPF中MainWindow、Window_Loaded、Window_Initialized的执行顺序

本文探讨了WPF程序中界面刷新的问题,特别是在程序启动时如何有效更新用户控件。通过对比不同方式调用UpdatePipeline函数的效果,揭示了WPF界面刷新机制的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于编写的WPF程序中,在程序启动时需要对用户控件进行刷新一次,就写在了Window_Loaded函数中,但是发现对界面改变并没有什么效果,于是开始debug……

 	    public MainWindow()
        {
            InitializeComponent();
            //......
            Console.WriteLine("MainWindow end");
        }
		private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            UpdatePipeline();
            Dispatcher.Invoke(new Action(() =>
            {
                UpdatePipeline();
            }));
            new Thread(new ThreadStart(() =>
            {
                Dispatcher.Invoke(new Action(() =>
                {
                    UpdatePipeline();
                }));
            })).Start();//创建一个线程1000ms后运行一次UpdatePipeline
            Console.WriteLine("Window_Loaded end");
        }
    	private void Window_Initialized(object sender, EventArgs e)
        {
            Console.WriteLine("Window_Initialized end");
        }
		private void UpdatePipeline()
        {
			//......
            Console.WriteLine("UpdatePipeline()");
        }

调试输出结果顺序如下(删除了部分系统输出):

Window_Initialized end
MainWindow end
......
UpdatePipeline()
UpdatePipeline()
Window_Loaded end
“Effluent.exe”(CLR v4.0.30319: Effluent.exe): 已加载“Microsoft.GeneratedCode”。
UpdatePipeline()
线程 0xa4 已退出,返回值为 0 (0x0)。

可以看到,其执行顺序是Window_Initialized->MainWindow->Window_Loaded
而在Window_Loaded中调用了三次UpdatePipeline函数,虽然三次都成功的改写了空间中的属性值(颜色),但是前两次调用(直接调用,委托调用)并没有改变显示效果,只有第三次通过创建线程的方式,才成功修改了实际显示效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值