1

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

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

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

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

我知道渲染器的优先级较低,可能不会出现闪烁,但是为什么要多次调用相同的更新方法来破坏宝贵的运行时间呢?

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

4

1 回答 1

3

只需在这些属性中的任何一个发生更改时设置一个标志,并且将刷新方法仅排队到 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 并仅刷新一次。

于 2013-07-23T19:05:38.100 回答