0

我正在开发 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 在后台运行繁重的进程。如本文所述

4

3 回答 3

2

该类Window提供Loaded事件:

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

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

<Window ... Loaded="Window_Loaded"/>
于 2012-10-02T10:33:01.900 回答
2

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

于 2012-10-09T11:57:23.997 回答
1

根据我对您问题的评论和 Tudor 的回答,您需要LoadedPage.

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

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

我完全不知道 Kinect 是如何工作的,但我怀疑在您的代码中,它的初始化是从您在PageVisual Studio 设计器中添加的控件之一调用的。

例如这样的:

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

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

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

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

于 2012-10-02T16:01:41.277 回答