0

別のスレッドでのものを初期化することに関するスレッドがたくさんあることを知っているので、UIをフリーズする必要はありません。しかし、私の場合、この初期化には多くのプロット (キャンバス内のポリライン) の作成が含まれるため、UI をフリーズする必要があるようです。

物事が初期化されているフレームを非表示にして (下に "loading.." メッセージを既に表示しています)、UI をフリーズしてから (数秒)、フレームを再度表示するだけで十分です。

これは私がこれまでに持っているものです。しかし、機能していません...何も非表示にする前にUIをフリーズし、完全に初期化されたフレームをロードした後にフリーズを解除します。そうでなければ、それは魅力のように機能します。

void Historics_showExperimentResults(object sender, EventArgs e)
    {
        aepPage = new AEPPage();
        resultsPage = new AEPResultSet();

        // I try to hide the frame. Below there is a "Loading..." nice text.
        // not sure if it's the best way but it works if I dont show anything at the end
        ParadigmFrame.Dispatcher.Invoke((Action)delegate
        {
            ParadigmFrame.Content = null;
            ParadigmFrame.UpdateLayout();
        });

        // This is the initialization that needs to have the GUI thread
        //because it draw some plots and polylines
        aepPage.Dispatcher.Invoke((Action)delegate
        {
            aepPage.init(resultSet);
        });

        //Then I want to go and visualize the initialized page with the plots
        ParadigmFrame.Dispatcher.Invoke((Action)delegate
        {
            ParadigmFrame.Navigate(aepPage);
        });
    }

どんな手掛かり???私が言ったように、initを別のスレッドに入れ、終了時にイベントを追加しようとしましたが、このスレッドはキャンバス内のポリラインを初期化するためにUIを制御する必要があるため..動作しません:(

前もって感謝します !

4

2 に答える 2

0

ではないので、これを回答としてマークしません..しかし、それでも私が現在使用している回避策です。

私がしたことは、フェードアウト、初期化、フェードインをバラバラに分割することです。

ストーリーボードを作成し、フェードアウトして、次のステップを Finished イベントにアタッチします。そのため、ある種の擬似コードでは次のようになります。

StoryBoard sb = new StoryBoard;
OnClick(object sender blabla)
{
    storyBoard.add(fade out animation over ParadigmFrame);
    storyBoard.Completed += performInit;
    storyBoard.Begin();
}

したがって、この部分が実行され、paradigmFrame が消えて、「Loading...」というメッセージが表示されます。それで ..

private blabla performInit()
{
    aepPage.Dispatcher.Invoke((Action)delegate
          {
              aepPage.Finished += initFinished; 
              aepPage.init(resultSet);
          });
}

確かに、 aepPage クラスで Finished イベントを作成し、初期化が完了したときにそれを発生させました。したがって、このすべてのプロセスの間、UI はフリーズします。「読み込み中...」メッセージが表示され、ひどいものではありませんが、実際のソリューションはここで UI をフリーズするべきではありません...そして、私はそれを表示します

private void initFinished()
{
    storyBoard.add(fade in animation over ParadigmFrame);
    storyBoard.Completed -= performInit;
    storyBoard.Begin();
}

これは私の長く醜い回避策です...私はまだ新しい解決策を受け入れています!!!

ありがとう !

于 2013-05-24T17:24:10.303 に答える