我对 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() 方法的末尾修改。
如何让它立即更新?
我尝试像这样使用调度程序:
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
模式通常是最简单的方法,但您可以在 4.0 中通过手动设置 Task
延续来获得相同的效果。
关于c# - 为什么控件的可见性属性不立即更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14683901/