2014-07-16 58 views
0

我有以下德兴控制:替代重新呈现

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

我现在是这样的:

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

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

同时调度处理被挂起不能执行此操作

我已经打开question关于这种情况(因此当我改变ContentControl的内容时,我使用null调用回调的原因)。

在我看来,解决方案也可以作为重新呈现内容的替代方法。或者可能进行一些检查以避免这种异常。

是否有任何其他方式来重新绘制(重新呈现)的内容或有没有什么办法来检查,当禁止使用调度(因为它已被暂停)?

我只能想到添加计时器,以延迟执行,以便内容将被重新渲染。这将分成两个逻辑:回调和定时器。而且看起来不太好看。

+1

为什么不直接在TextBlock上调用'Measure'然后得到它的'DesiredSize'? – Clemens

+0

您调用应该重新呈现控件的InvalidateVisual方法。你可以在这里阅读更多关于http://msdn.microsoft.com/en-us/library/system.windows.uielement.invalidatevisual(v=vs.110).aspx – Krishna

+0

@Krishna,'InvalidateVisual'不起作用。也许它工作异步(在wpf中的许多事情)。如果有一个事件'OnRendered',那么我可以使用它,但是这又会将我的逻辑分成2个peaces。仍然看起来比使用计时器好得多。 – Sinatr

回答

0

感谢@Clemens,想法使用Measure似乎是一个非常好的工作解决方案。此外,这主要能够克服许多其他问题(因为我接触wpf首次的时间,从来没有消失),我已经有2少...

简而言之:

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

工程就像一个魅力。 最好的部分是在家长控制上调用它,它会重新计算一切,考虑到它的孩子(就像我的情况一样,我称之为我的控制措施和测量更新 TextBlock.Text)。 必须单独要求儿童!