假设我定义了两个Window
和WindowA
的{{1}}。
WindowB
有一个名为WindowA
的{{1}}。
Button
有一个名为btn
的{{1}}。
当用户单击WindowB
中的按钮时,将显示Label
并执行一些逻辑。
processLbl
结果是显示WindowA
,但其标签的内容未更新。
我想这是可以预期的,因为WindowB
和WindowB windowB;
private void btn_Click(object sender, RoutedEventArgs e)
{
windowB = new WindowB();
windowB.Owner = Application.Current.MainWindow;
windowB.Show();
for (int i = 0; i < 100; i++)
{
// do something
Thread.Sleep(100);
updateLabel(i);
}
windowB.Close();
}
private void updateLabel(int value)
{
windowB.processLbl.Content = value;
}
都在同一线程上。
因此,使用windowB
是没有用的。
但是有没有办法做到这一点,或者我必须在另一个线程上显示windowA
。
如果这样做,如何从运行windowB
的线程访问Dispatcher.Invoke
的标签?
答案 0 :(得分:1)
尝试使用如下所示的Dispatcher Timer,
WindowB window;
DispatcherTimer timer = new DispatcherTimer();
private void Button_Click(object sender, RoutedEventArgs e)
{
window = new WindowB
{
Owner = Application.Current.MainWindow
};
window.Show();
timer.Tick -= Timer_Tick;
timer.Tick += Timer_Tick;
timer.Interval = new TimeSpan(0, 0, 1);
timer.Start();
}
int tickCount = 1;
private void Timer_Tick(object sender, EventArgs e)
{
if (tickCount == 100)
{
window.Close();
timer.Stop();
}
updateLabel(tickCount);
tickCount++;
}
private void updateLabel(int value)
{
window.lbl.Content = value;
}
正如评论中提到的克莱门斯,Thread.Sleep blocks the UI thread