【问题标题】:Understand WPF Window Events了解 WPF 窗口事件
【发布时间】:2026-02-09 14:35:01
【问题描述】:

我看到 Windows 有 Loaded 事件,但没有 Loading 事件(因为有 ClosingClosed 事件)。

我的期望是Loaded 事件会在窗口实际显示之前发生。但是,查看Window Lifetime Events,它表明Loaded 事件发生在Activated 事件之后。

我在Loaded 事件中放入了一些初始化代码,在窗口显示之后和我的内容出现之前有一个延迟。那么在窗口显示之前应该发生的用于窗口初始化的最佳事件处理程序是什么?

【问题讨论】:

  • 是否有什么阻止您从构造函数初始化窗口内容?
  • @interstellarshadow:我需要访问窗口的元素,例如控件。我不希望可以从构造函数中获得。我认为这是我们有诸如Loaded 事件之类的事件的主要原因。
  • 在窗口显示之前进行窗口初始化的最佳方法是在窗口的构造函数中设置窗口的DataContext,并让控件通过绑定、模板等来填充自己。其他任何东西都是杂物。
  • ContentRendered 事件不是在Loaded 事件之前触发的吗?
  • 如果您在加载期间访问实际控件,那么可能有一种更优雅的方式来执行此操作。看看 MVVM(模型-视图-视图模型)模式。

标签: c# wpf events


【解决方案1】:

这是我所做工作的简化版本(删除了错误处理)。如果初始化需要一段时间,您可能希望在执行操作时显示启动画面。

App.xaml:

<Application x:Class="MyProgram.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="App_StartUp" >
</Application>

App.xaml.cs:

namespace MyProgram
{
    public partial class App : Application
    {
        private void App_StartUp(object sender, StartupEventArgs e)
        {
            // Create the model and MainWindow
            MyModel model = CreateModel();
            MainViewModel viewModel = new MainViewModel(model);
            MainWindow = new MainWindow(viewModel); // Sets the DataContext

            // Do things, like initialize your model
            model.Initialize();

            // Now show your window
            MainWindow.Show();
        }
    }
}

【讨论】:

    【解决方案2】:

    您可以在 App.xaml.cs 中覆盖 OnStartup(),并在调用 base.OnStartup(e); 之前做一些事情。我刚刚检查过,这是在窗口的构造函数之前触发的。

    或者,在其 xaml 文件中将窗口的可见性设置为隐藏,在构造函数中进行初始化,然后在完成后将可见性设置为可见。这不会消除延迟,但延迟只是由您的初始化代码正在执行的操作引起的,因此除非您使用异步,否则这是不可避免的。

    【讨论】: