Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 了解WPF窗口事件_C#_Wpf_Events - Fatal编程技术网

C# 了解WPF窗口事件

C# 了解WPF窗口事件,c#,wpf,events,C#,Wpf,Events,我看到Windows有一个加载的事件,但没有加载的事件(因为有关闭的和关闭的事件) 我的期望是,加载的事件将在窗口实际显示之前发生。但是,查看,它显示加载的事件发生在激活后事件 我在加载的事件中放入了一些初始化代码,在显示窗口之后和显示我的内容之前有一个延迟。那么,在显示窗口之前进行窗口初始化的最佳事件处理程序是什么呢?您可以覆盖App.xaml.cs中的OnStartup(),并在调用base.OnStartup(e)之前执行一些操作。我刚检查过,这是在窗口的构造函数之前触发的 或者,将窗口的

我看到Windows有一个
加载的
事件,但没有
加载的
事件(因为有
关闭的
关闭的
事件)

我的期望是,加载的
事件将在窗口实际显示之前发生。但是,查看,它显示
加载的
事件发生在
激活后
事件


我在加载的
事件中放入了一些初始化代码,在显示窗口之后和显示我的内容之前有一个延迟。那么,在显示窗口之前进行窗口初始化的最佳事件处理程序是什么呢?

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


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

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

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>

是否有什么东西阻止您从构造函数初始化窗口内容?@interstellarshadow:我需要访问窗口的元素,例如控件。我不希望从构造器那里得到。我认为这是我们有诸如加载的
事件之类的事件的主要原因。在显示窗口之前进行窗口初始化的最佳方法是在窗口的构造函数中设置窗口的
DataContext
,并让控件通过绑定、模板和,等等。任何其他的事情都是乱七八糟的。
ContentRendered
事件不是在
加载
事件之前触发的吗?如果您在加载过程中访问实际控件,那么可能有一种更优雅的方法来实现这一点。查看MVVM(模型-视图-视图-模型)模式。
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();
        }
    }
}