我对UIElement.Visibility属性有疑问。
单击“StartAll”按钮时执行以下代码:
private void butStartAllClick(object sender, RoutedEventArgs e)
{
butStartAll.Content = "Running";
LEDInitializing.Visibility = Visibility.Visible;
lblInitializing.Visibility = Visibility.Visible;
Init();
//...rest of code
}
然后,Init启动一个冗长的初始化例程。我的问题是,仅在 Init() 方法的结束处修改了visibility属性。
如何让它立即更新?
我尝试过像这样使用Dispatcher:
LEDInitializing.Dispatcher.BeginInvoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
LEDInitializing.Visibility = Visibility.Visible;
}
));
但这并不能解决我的问题。
非常感谢任何帮助:)
答案 0 :(得分:2)
通过在UI线程上运行Init
,您可以阻止运行的任何UI更改,直到完成并butStartAllClick
退出。根据{{1}}中的内容,您可以在单独的线程上运行它(此处4.5,在4.0中使用Init
):
TaskFactory
如果private void butStartAllClick(object sender, RoutedEventArgs e)
{
butStartAll.Content = "Running";
LEDInitializing.Visibility = Visibility.Visible;
lblInitializing.Visibility = Visibility.Visible;
Task.Run(() =>
{
Init();
//...rest of code
});
}
或以下代码正在执行需要与UI交互的任何内容,则您需要将其分解并使用回调来UI以根据需要执行这些更新。 4.5中的Init
模式通常是最简单的方法,但您可以通过手动设置async/await
延续在4.0中获得相同的效果。