WPF 和用户界面冻结
WPF and user interface freeze
在我的主要 window 中,我有
- 左侧导航树视图
- 右边的内容主持人
- 某种显示加载 gif 的请稍等面板(宽度和高度大约为 50);此面板的可见性绑定到我的主要 window 的视图模型 bool 属性 IsBusy.
想法是在初始化内容呈现器时显示此面板。
正在树视图中选择一个项目:
- 将 bool 属性 IsBusy 设置为 true(因此等待面板与
加载 gif 显示)
- 设置内容主持人
为了初始化此内容,我在主 window 视图模型中使用了一个任务,以便 UI 保持响应。在此任务中,当我需要更新 UI 时,我使用 Application.Current.Dispatcher.BeginInvoke 来操作我的 UI 线程。这样,当任务在另一个线程中处理时,我的加载 gif 播放流畅。
现在,假设我的内容展示器中有一个包含二十列的数据网格,它绑定到我的主视图模型中的一个 ObservableCollection。在我的任务中,如果我向该集合添加 1000 个项目,当 UI 更新以显示内容时,它会在十分之几秒内变得无响应并且我的 gif 停止;基本上 UI 冻结了。
我怎样才能确保等待面板始终保持响应并且 gif 保持流畅播放?
好吧,我所要做的就是在另一个线程中创建内容呈现器的内容,然后在完成所有操作后将结果分配给我的内容呈现器(例如在 bgw RunWorkCompleted 中)。
在我的主要 window 中,我有
- 左侧导航树视图
- 右边的内容主持人
- 某种显示加载 gif 的请稍等面板(宽度和高度大约为 50);此面板的可见性绑定到我的主要 window 的视图模型 bool 属性 IsBusy.
想法是在初始化内容呈现器时显示此面板。
正在树视图中选择一个项目:
- 将 bool 属性 IsBusy 设置为 true(因此等待面板与 加载 gif 显示)
- 设置内容主持人
为了初始化此内容,我在主 window 视图模型中使用了一个任务,以便 UI 保持响应。在此任务中,当我需要更新 UI 时,我使用 Application.Current.Dispatcher.BeginInvoke 来操作我的 UI 线程。这样,当任务在另一个线程中处理时,我的加载 gif 播放流畅。
现在,假设我的内容展示器中有一个包含二十列的数据网格,它绑定到我的主视图模型中的一个 ObservableCollection。在我的任务中,如果我向该集合添加 1000 个项目,当 UI 更新以显示内容时,它会在十分之几秒内变得无响应并且我的 gif 停止;基本上 UI 冻结了。
我怎样才能确保等待面板始终保持响应并且 gif 保持流畅播放?
好吧,我所要做的就是在另一个线程中创建内容呈现器的内容,然后在完成所有操作后将结果分配给我的内容呈现器(例如在 bgw RunWorkCompleted 中)。