避免WPF自定义控件中的频繁更新

时间:2013-07-23 18:39:39

标签: wpf layout custom-controls updates

我正在WPF中编写自定义控件。该控件具有几个属性,可以更新控件的逻辑树。这种形式有几种方法:

private static void OnXXXPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
    ((MyControl)obj).RebuildTree();
}

假设RebuildTree()方法非常复杂和冗长,并且如果用户更改了多个属性,则会多次调用此方法,从而导致应用程序减速和挂起。

我想以Windows窗体的方式介绍类似BeginUpdate()EndUpdate()方法的内容(以确保只调用一次更新),但在WPF中广泛不鼓励这种做法。

我知道渲染器的优先级较低,闪烁可能不会出现,但仍然可以通过多次调用相同的更新方法来破坏宝贵的运行时间?

是否有关于如何有效更新多个依赖项属性的官方最佳实践(在设置每个属性后不更新整个控件)?

1 个答案:

答案 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并仅刷新一次。