0

我在加载数据时使用 radbusyindicator。但它不能正常工作。下面是代码

      public MainPage()
       {
          InitializeComponent();
          DataContext = App.Model;   
          this.Dispatcher.BeginInvoke(new Action(() =>
            {
            radbusyIndicator.IsRunning = true;
            SampleData.Data.getInfo();
            SampleData.Data.getData();

        }));

        radbusyIndicator.IsRunning = false;   
    }

如果我这样做会发生什么是指标继续运行。看起来控件在 radbusyIndi​​cator.IsRunning = false 之后转到调度程序;被执行。但是我不知道如何在加载数据后禁用它。尝试了很多方法,但无法使其工作。任何帮助,将不胜感激

4

1 回答 1

0

调度程序回调可能 100% 的情况下会在

radbusyIndicator.IsRunning = false

线。

请尝试以下操作:

public MainPage()
{
    InitializeComponent();
    DataContext = App.Model;   
    this.Dispatcher.BeginInvoke(new Action(() =>
    {
        radbusyIndicator.IsRunning = true;
        SampleData.Data.getInfo();
        SampleData.Data.getData();
        radbusyIndicator.IsRunning = false;   
    }));
}

这是因为编组对 UI 线程的调用的行为需要一些 CPU 周期,而原来radbusyIndicator.IsRunning = false的几乎是下一行要运行的。

无论如何都没有关系,因为您要么会得到一个短暂的忙碌指示器闪烁,要么它会永远留在屏幕上,因为你在工作完成后不隐藏它,你会立即隐藏它

编辑:

是的,忽略最后一个 - 意识到它不起作用:

如果方法是异步的,指示器将立即隐藏,如果它们不是异步的,UI 线程将在它们工作时被阻塞

如果您的方法是同步的,您需要在另一个线程上完成工作,并使用调度程序将 UI 更新编组到 UI 线程

您可以使用BackgroundWorker在另一个线程上工作:

http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx

BackgroundWorker bw = new BackgroundWorker();

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    this.Dispatcher.BeginInvoke(new Action(() =>
    {
        radbusyIndicator.IsRunning = true;
    }));

    SampleData.Data.getInfo();
    SampleData.Data.getData();

    this.Dispatcher.BeginInvoke(new Action(() =>
    {
        radbusyIndicator.IsRunning = false;   
    }));
}

然后在你的构造函数中:

bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync();
于 2013-04-21T09:39:56.017 回答