c# - WPF UI 渲染问题

标签 c# wpf

我有一个基本的对话窗口,允许用户输入一些信息。当他们单击 AddButton 时,应用程序会验证用户信息并在操作失败时显示一条消息。按钮旁边有一个静态标签,最初是隐藏的。单击该按钮时,标签在验证操作开始之前 变得可见,并在操作结束之后 再次变得不可见。请注意,此验证操作发生在远程计算机上,因此 UI 在此期间卡住(这是设计使然)。

这是 XAML 代码:

<Label Name="lblStatus" Content="Verifying connection..." Visibility="Hidden" Grid.Column="0" />

<StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right">
   <Button Content="Add" Width="80" Margin="0,0,5,0" Click="AddButton_Click"/>
   <Button Content="Cancel" Width="80" IsCancel="True"/>
</StackPanel>

以及代码隐藏:

private void AddButton_Click(object sender, RoutedEventArgs e)
{
    lblStatus.Visibility = Visibility.Visible;

    // Validation occurs here. The UI is freezed for about 3 seconds
    Foo.Validate();

    lblStatus.Visibility = Visibility.Hidden;
}

问题是单击按钮时,在 UI 卡住之前标签不会变得可见。当操作失败时,弹出对话框显示。那时,您会看到标签,但那是 UI 唤醒的时候。这让我觉得 UI 没有足够的时间在调用 foo.Validate() 时重新呈现标签。我想知道我的理论是否正确,实现这一目标的“正确”方法是什么?

最佳答案

private void AddButton_Click(object sender, RoutedEventArgs e)
    {
        lblStatus.Visibility = Visibility.Visible;
        Task.Factory.StartNew(()=>
            {
                Foo.Validate();
                OnUi(() => lblStatus.Visibility = Visibility.Hidden);
            }
        };
    }


public static void OnUi (Action action)
{
    if (_dispatchService == null) _dispatchService = ServiceLocator.Current.GetInstance<IDispatchService>();

     if (_dispatchService.CheckAccess())
            action.Invoke ();
        else
            _dispatchService.Invoke(action);
    }

关于c# - WPF UI 渲染问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16991665/

相关文章:

WPF 启动画面,直到 Windows 结束加载

c# - 如何根据按钮点击设置Label的内容

c# - 如何使用 C# 在 cmd 中以管理员身份运行 msi 安装程序

C# 将包含 c 样式字符串的 byte[] 转换为字符串 - NOT Encoding.GetString(byte[])

c# - LINQ to Entities 无法识别方法 'System.Linq.IQueryable

c# - 从 chrome 扩展到用 C# 编写的 native 主机的 native 消息传递

c# - 在数据表中旋转图像(字节数组)

c# - 将用户最近访问的页面存储在cookie中

wpf - Caliburn.Micro WindowManager 和 Window 构造函数参数

带有单击事件处理程序的 WPF 命令