我正在WPF中编写自定义控件。该控件具有几个属性,可以更新控件的逻辑树。这种形式有几种方法:
private static void OnXXXPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
((MyControl)obj).RebuildTree();
}
假设RebuildTree()
方法非常复杂和冗长,并且如果用户更改了多个属性,则会多次调用此方法,从而导致应用程序减速和挂起。
我想以Windows窗体的方式介绍类似BeginUpdate()
和EndUpdate()
方法的内容(以确保只调用一次更新),但在WPF中广泛不鼓励这种做法。
我知道渲染器的优先级较低,闪烁可能不会出现,但仍然可以通过多次调用相同的更新方法来破坏宝贵的运行时间?
是否有关于如何有效更新多个依赖项属性的官方最佳实践(在设置每个属性后不更新整个控件)?
答案 0 :(得分:2)
只要在任何这些属性发生更改时设置一个标志,并将刷新方法排队到Dispatcher一次。
private static void OnXXXPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
((MyControl)obj).NeedsRefresh = true;
((MyControl)obj).OnNeedsRefresh();
}
void OnNeedsRefresh()
{
Dispatcher.BeginInvoke((Action)(() =>
{
if (NeedsRefresh)
{
NeedsRefresh = false;
RebuildTree();
}
}),DispatcherPriority.ContextIdle);
}
这样,您的所有属性都将被更新,然后Dispatcher将调用您的BeginInvoke
,将标志设置为false并仅刷新一次。