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

时间:2012-10-02 10:28:45

标签: .net wpf xaml xbap

我正在研究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中没有任何问题。

更新:我从页面或窗口的加载事件中理解的是,当页面或窗口被加载时它会被触发,并且在页面上加载组件和控件甚至它的样式将在此之后出现。 ..而且我似乎没有找到任何显示控件加载完成的事件......

UPDATE2:我的问题的一个更好的解决方案是使用BackgroundWorker或Dispatcher在后台运行繁重的进程。正如this帖子中讨论的那样。

3 个答案:

答案 0 :(得分:2)

Window课程提供Loaded事件:

  

在布置,渲染元素并准备好进行交互时发生。

连接处理程序并在那里执行代码:

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

答案 1 :(得分:2)

您需要在应用程序中实现线程化。如果你在页面加载方法中编写任何代码。在完全执行load方法之前,不会呈现您的页面。所以你可以使用Background Worker并在后台运行流程

答案 2 :(得分:1)

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

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

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

我完全不知道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的样子。