2

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

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

任何帮助将不胜感激:)

4

1 回答 1

2

通过Init在 UI 线程上运行,您可以防止您所做的任何 UI 更改在它完成并butStartAllClick退出之前运行。根据您的内容,Init您可能只能在单独的线程上运行它(此处为 4.5,TaskFactory在 4.0 中使用):

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延续获得相同的效果。

于 2013-02-04T17:40:29.720 回答