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

标签 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() 方法的末尾修改。

如何让它立即更新?

我尝试像这样使用调度程序:

    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/

相关文章:

c# - XAML - MediaElement 没有播放我的音乐

winapi - Win32 API 中的 Treeview 控件 - 如何使用不同的字体显示单个 treeview 项目?

asp.net - asp.net 中的动态控件(文本框)

c# - 从 NetDrives 上的巨大目录中获取文件

c# - 在图像点击上在模拟器中打开图库

c# - 在 StaticResource Canvas 中为 Path 设置不同的大小或自动调整大小

c# - 是否有一个很好的工具可以从 XAML 中查找对属性的引用?

c# - 推荐的 c# winform 控件包

C# 正则表达式

c# - 如果结果是 MultiBulk,如何从 RedisResult 检索值