理解WPF窗口事件

20

我看到Windows有一个Loaded事件,但没有一个Loading事件(就像有ClosingClosed事件一样)。

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

我把一些初始化代码放在Loaded事件中,但在窗口显示之后出现了延迟,直到我的内容出现之前。那么,在窗口显示之前进行窗口初始化的最佳事件处理程序是什么?


2
你是否有什么阻止你从构造函数中初始化窗口内容的问题? - Andrew Schade
1
@interstellarshadow:我需要访问窗口的元素,例如控件。我不希望从构造函数中访问它们。我认为这就是我们拥有“Loaded”事件的主要原因。 - Jonathan Wood
2
在窗口显示之前应该发生的窗口初始化最好的方法是在窗口的构造函数中设置窗口的 DataContext,并通过绑定、模板等让控件自行填充。其他任何方法都是不完美的解决方案。 - 15ee8f99-57ff-4f92-890c-b56153
“ContentRendered”事件不是在“Loaded”事件之前触发的吗? - ViVi
如果您在加载期间访问实际控件,则可能有更优雅的方法来完成此操作。请查看MVVM(Model-View-ViewModel)模式。 - Rodney Richardson
2个回答

1
你可以在App.xaml.cs中覆盖OnStartup()方法,在调用base.OnStartup(e)之前执行一些操作。我刚检查过,这个方法会在窗口的构造函数之前被触发。
或者,在窗口的xaml文件中将其可见性设置为Hidden,在构造函数中进行初始化,完成后再将其可见性设置为Visible。这不会消除延迟,但延迟只是由于初始化代码所做的操作引起的,因此除非采用异步方式,否则无法避免。

-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();
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接