我想知道是否有人可以帮我理解这里发生了什么。
在复杂的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()跟踪两个不同的代码路径。谢谢!
答案 0 :(得分:1)
第一个callstack意味着您的控件已经排列,并且之前的RenderSize与当前的不同。
第二个意味着无效的事情安排。可能有几件事:measure返回了不同的所需大小,显式调用了InvalidateArrange,或者更改了FrameworkPropertyMetadataOptions.AffectsArrange标志的任何属性。 它可能还有一些条件,但我认为这些是最常见的。
我还建议您浏览referencesource网站,这可能会有所帮助。