首页 文章

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

提问于
浏览
0

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

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

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

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

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

Is there any official best practice on how to make efficient update of multiple dependency properties (without updating the entire control after setting each one)?

1 回答

  • 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并仅刷新一次 .

相关问题