替代重新渲染
本文关键字:新渲染 | 更新日期: 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
)。