0

我知道有很多关于在不同线程中初始化东西的线程,所以你不需要冻结你的 UI。但在我的例子中,这个初始化涉及创建很多图(画布中的折线),所以它似乎需要冻结 UI。

隐藏正在初始化事物的框架(我已经在下面显示“正在加载..”消息)然后冻结 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

看起来Historics_showExperimentResults已经在 UI 线程上运行。尝试这个:

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

            new Thread(_ =>
            {
              // 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);
              });
            }).Start();
        }
于 2013-05-22T11:52:44.063 回答
0

我不会将此标记为答案,因为它不是..但仍然是我现在使用的解决方法。

我所做的是将淡出、初始化和淡入分割成几部分。

我创建了一个故事板,淡出并将下一步附加到 Finished 事件,因此,在某种伪代码中,它将是:

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

所以这部分被执行,paradigmFrame 消失,显示下面的“正在加载...”消息。然后 ..

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

当然,我在 aepPage 类中创建了 Finished 事件,并在初始化完成时触发了它。所以在所有这些过程中,用户界面都是冻结的。“正在加载...”消息是可见的,它并不可怕,但真正的解决方案不应该在这里冻结 UI...然后我显示它

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

这是我漫长而丑陋的解决方法......我仍然愿意接受新的解决方案!

谢谢 !

于 2013-05-24T17:24:10.303 回答