WPF ContextLayoutManager生成两个不同的代码路径

时间:2014-10-13 15:35:03

标签: .net wpf

我想知道是否有人可以帮我理解这里发生了什么。

在复杂的WPF自定义控件中,对ContextLayoutManager.UpdateLayout()的调用最终会调用OnRenderSizeChanged方法:

MyControl.WPF.dll!MyNameSpace.MyControl.OnRenderSizeChanged(System.Windows.SizeChangedInfo sizeInfo) Line 1838  C#
PresentationCore.dll!System.Windows.ContextLayoutManager.fireSizeChangedEvents() + 0x6b bytes   
PresentationCore.dll!System.Windows.ContextLayoutManager.UpdateLayout() + 0x6e2 bytes   
PresentationCore.dll!System.Windows.UIElement.UpdateLayout() + 0x14 bytes

更改对复杂WPF自定义控件的调用,现在调用ContextLayoutManager.UpdateLayout()最终调用OnRender方法:

MyControl.WPF.dll!MyNameSpace.MyControl.OnRender(System.Windows.Media.DrawingContext drawingContext) Line 1851  C#
PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect) + 0x606 bytes  
PresentationCore.dll!System.Windows.ContextLayoutManager.UpdateLayout() + 0x22a bytes   
PresentationCore.dll!System.Windows.UIElement.UpdateLayout() + 0x14 bytes

我正在找人帮我理解这个复杂的WPF控件可以做些什么来使ContextLayoutManager.UpdateLayout()跟踪两个不同的代码路径。谢谢!

1 个答案:

答案 0 :(得分:1)

第一个callstack意味着您的控件已经排列,并且之前的RenderSize与当前的不同。

第二个意味着无效的事情安排。可能有几件事:measure返回了不同的所需大小,显式调用了InvalidateArrange,或者更改了FrameworkPropertyMetadataOptions.AffectsArrange标志的任何属性。 它可能还有一些条件,但我认为这些是最常见的。

我还建议您浏览referencesource网站,这可能会有所帮助。