替代重新渲染

本文关键字:新渲染 | 更新日期: 2023-09-27 18:13:05

我可以控制以下设计:

  • 有依赖属性Text;
  • 这个文本被设置为内部TextBlock,然后控制是自动大小(以适合)。
  • 当这个属性改变时,回调被执行;
  • 在回调中,我需要两者:当前控件外观和一个后改变文本(动画)。

我现在得到的是:

// ... do something
textBlock.Text = Text;
ContentText.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, (Action)delegate() { });
// ... do something

不幸的是,说的行(强制渲染)将抛出InvalidOperationException

调度程序处理挂起时无法执行此操作

我已经打开了关于这种情况的问题(由于某些原因,当用我的控件改变ContentControl内容时,会调用null回调)。

在我看来,解决方案也可以是另一种方式来重新渲染内容。或者通过一些检查来避免这个异常。

是否有任何其他方法来重新绘制(重新渲染)内容或有任何方法来检查,当使用调度程序被禁止(因为它被暂停)?

我只能想到添加计时器来延迟执行,以便内容将被重新呈现。这将把逻辑划分为2个和平:回调和定时器。看起来不太好看

替代重新渲染

感谢@Clemens,使用Measure的想法似乎是一个非常好的工作解决方案。此外,这个原则允许克服许多其他问题(自从我第一次触摸wpf以来从未消失),我已经少了2个…

简而言之:

  • 如果不确定渲染大小,调用父容器的RenderSize参数Measure();
  • 则使用DesiredSize代替RenderSize (ActualWidth/ActualHeight)。

很有魅力。最好的部分是在父控件上调用它,它将重新计算所有内容,考虑到它的子控件(就像在我的情况下,我为我的控件调用measure及其测量更新的TextBlock.Text)。必须为孩子单独调用!