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

これには、アプリケーションにスレッドを実装する必要があります。ページロードメソッドにコードを記述した場合。load メソッドが完全に実行されるまで、ページはレンダリングされません。バックグラウンドワーカーを使用してバックグラウンドでプロセスを実行できます

于 2012-10-09T11:57:23.997 に答える
2

このWindowクラスはLoadedイベントを提供します。

要素がレイアウトおよびレンダリングされ、操作の準備が整ったときに発生します。

ハンドラーをフックして、そこでコードを実行します。

<Window ... Loaded="Window_Loaded"/>
于 2012-10-02T10:33:01.900 に答える
1

あなたの質問に対する私のコメントとチューダーの答えによると、あなたはあなたのでLoadedイベントを使用する必要がありますPage

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

さまざまなコメントから、Kinectの初期化はPageUIレンダリングの一部として行われているようです。または、他の時間のかかるタスクが処理されていること。

Kinectがどのように機能するかは厳密にはわかりませんが、コードでは、VisualStudioDesignerPageから追加したコントロールの1つから初期化が呼び出されていると思われます。

たとえば、次のようなものです。

<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 に答える