是否可以理解WPF窗口或页面控件加载何时完成



我正在开发一个WPF浏览器应用程序。我想知道我如何理解页面加载完成后,组件开始加载繁重的后台服务。否则,我只会看到一个白色页面几秒钟,直到所有服务都加载。。。有什么解决这个问题的建议吗?

这是我尝试过的东西:

public Page1()
{
InitializeComponent();
}
private void Page_Loaded_1(object sender, RoutedEventArgs e)
{
// Just some heavy process in the begining
int j = 1;
for (int i = 0; i < 10000000; i++)
{
for (int k = 0; k < 1000; k++)
j=j * 2;
}
MessageBox.Show("ready");
}

但是,直到page_loaded中的所有进程完成,页面组件才会加载到页面中。在没有加载page_loaded中繁重进程的情况下,每件事都加载得很快,所以UI没有任何问题。

更新:我从页面或窗口的loaded事件中了解到,当页面或窗口被加载时,它会被触发,页面上的组件和控件的加载,甚至它的样式都会在那之后发生。。。我似乎没有发现任何事件显示控件的加载已完成。。。

更新2:对于我的问题,一个更好的解决方案是使用BackgroundWorker或Dispatcher在后台运行繁重的进程。如本文所述。

为此,您需要在应用程序中实现线程。如果您在页面加载方法中编写任何代码。在完全执行加载方法之前,不会呈现页面。因此您可以使用后台工作程序并在后台中运行进程

Window类提供Loaded事件:

在元素布局、渲染并准备交互时发生。

连接一个处理程序并在那里执行您的代码:

<Window ... Loaded="Window_Loaded"/>

根据我对您问题的评论和都铎的回答,您需要在Page上使用Loaded事件。

<Page ... Loaded="Page_Loaded_1"/>

现在,从您的不同评论来看,Kinect初始化是作为PageUI渲染的一部分完成的。或者其他一些耗时的任务正在处理中。

我完全不知道Kinect是如何工作的,但我怀疑在您的代码中,它的初始化是从Visual Studio Designer在Page上添加的一个控件调用的。

例如:

<ContentControl DataContext="{Binding MyKinnectStuff}"/>

它可能更微妙。例如,在getter调用的初始化Kinect的方法的属性上使用数据绑定。仔细检查,事实并非如此。

从您在编辑中添加的代码示例中,确保与Kinect相关的所有内容(初始化、数据绑定等)都位于方法Page_Loaded_1中,并且不直接从UI中执行任何操作。还要确保在UI中不执行任何其他耗时的任务。最后,再次确保XAML中有<Page Loaded="Page_Loaded_1"/>而不是<Page Loaded="Something_Else"/>

您应该再次编辑您的问题,并向我们展示您的XAML外观。

最新更新