[英]Why control's visibility property doesn't update immediately?
我有一个关于 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()方法结束时修改。
我如何让它立即更新?
我试过像这样使用 Dispatcher:
LEDInitializing.Dispatcher.BeginInvoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
LEDInitializing.Visibility = Visibility.Visible;
}
));
但这并不能解决我的问题。
任何帮助将不胜感激:)
通过在 UI 线程上运行Init
,您可以阻止您所做的任何 UI 更改运行,直到它完成并且butStartAllClick
退出之后。 根据Init
您可能只能在单独的线程上运行它(此处为 4.5,在 4.0 中使用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
});
}
如果Init
或以下代码正在执行任何需要与 UI 交互的操作,则您需要将其分解并使用对 UI 的回调来根据需要执行这些更新。 4.5 中的async/await
模式通常是执行此操作的最简单方法,但您可以通过手动设置Task
continuations 在 4.0 中获得相同的效果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.