替代重新渲染

时间:2014-07-16 08:16:28

标签: c# wpf dispatcher

我控制了以下设计:

  • 有依赖属性Text;
  • 此文本设置为内部TextBlock,然后控件自动调整大小(以适应)。
  • 当此属性更改时,执行回调;
  • 回调中的
  • 我需要两个:当前控件外观和一个更改后的文本(用于动画)。

我现在拥有的是:

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

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

  

暂停调度程序处理时无法执行此操作

我已针对该案例打开question(由于某些原因,在使用我的内部控件更改null内容时,使用ContentControl调用回调。)

在我看来,解决方案也可以是重新呈现内容的替代方式。或者也许是一些检查来避免这种异常。

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

我只能考虑添加计时器,以延迟执行,以便重新呈现内容。这将在两个和平中分裂逻辑:在回调和计时器中。并不是真的很好看。

1 个答案:

答案 0 :(得分:0)

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

简而言之:

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

像魅力一样工作。 最好的部分是在父控件上调用它,这将重新计算所有内容,考虑到其子项(就像在我的情况下,我称为控制测量和测量更新TextBlock.Text)。必须单独为孩子们打电话!