1

尽管 UI 组件的 Visibility 绑定到 ViewModel 属性并且实现了该属性的 PropertyChanged,但 UI 是否有可能跳过自身更新?

查看/XAML:

 <Border Visibility="{Binding ShowLoadingPanel, Converter={StaticResource BoolToHiddenConverter}}">
      <TextBlock Text="LOADING..." />
 </Border>

视图模型:

Public Property ShowLoadingPanel As Boolean
    Get
        Return _showLoadingPanel
    End Get
    Set(value As Boolean)
        _showLoadingPanel = value
        OnPropertyChanged("ShowLoadingPanel")
    End Set
End Property

从 ViewModel 运行以下命令时:

 ShowLoadingPanel = True
 RunBigTask()  'runs a task that takes a long time
 ShowLoadingPanel = False

... XAML 中定义的边框不可见。

但是如果我添加一些需要用户交互的东西,例如:

 ShowLoadingPanel = True
 MsgBox("Click to continue")
 RunBigTask()  'runs a task that takes a long time
 ShowLoadingPanel = False

...然后边框根据需要变为可见。

这怎么可能?

4

3 回答 3

4

你真的应该在后台线程中运行你的长时间运行的任务,因为它会阻止你的 UI 线程更新Visibility......因为它Visibility 应该在长时间运行的任务完成时更新。

BackgroundWorker用户使用对象来执行此操作是很常见的。BackgroundWorker您可以在 MSDN 的Class页面上找到完整的工作示例。

一个常见的替代方法BackgroundWorker是使用Task对象异步运行长时间运行的进程。Task您可以在 MSDN的TaskClass页面上找到使用 a 的完整工作示例。

于 2013-10-30T13:27:19.410 回答
2

您正在阻止调度程序,阻止更新布局。当您打开一个消息框时,您推送一个嵌套消息循环,它允许调度程序继续处理其队列,直到消息框关闭。布局更新在此期间发生。

当您调用ShowDialog()常规 Window 时,也会发生同样的事情:您的代码会阻塞,但 Dispatcher 会继续运行,因此 UI 会按预期更新。在弹出嵌套消息循环之前,您的代码不会恢复,这会在您关闭模式对话框(如您的消息框)时自动发生。

于 2013-10-30T15:33:41.470 回答
0

我正在使用 C#,在我们的例子中,Visiblity 不是布尔值,而是一个枚举:System.Windows.Visibility,其值为 Hidden/Visible/Collapsed。

VB 也是如此:Public Property Visibility As Visibility

于 2018-05-14T07:53:35.463 回答