为什么控件的可见性属性不会立即更新?

时间:2013-02-04 09:35:58

标签: c# xaml controls

我对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;
                                       }
                                       ));

但这并不能解决我的问题。

非常感谢任何帮助:)

1 个答案:

答案 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中获得相同的效果。