我有一个基本的对话窗口,允许用户输入一些信息。当他们单击 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/