我正在加载数据时使用radbusyindicator。但它不能正常工作。 以下是代码
public MainPage()
{
InitializeComponent();
DataContext = App.Model;
this.Dispatcher.BeginInvoke(new Action(() =>
{
radbusyIndicator.IsRunning = true;
SampleData.Data.getInfo();
SampleData.Data.getData();
}));
radbusyIndicator.IsRunning = false;
}
如果我这样做会发生什么,指标会一直运行。看起来控件在radbusyIndicator.IsRunning = false之后转到调度程序;被执行。 但是我不知道如何在加载数据后禁用它。尝试了很多方法,但无法使其发挥作用。任何帮助将不胜感激
答案 0 :(得分: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();