我需要在自定义面板中计算每个Width
的{{1}}。如果循环UIElement
:
Children
由于foreach (UIElement child in Children) { ... }
和child.DesiredSize.Width = myCalculatedWidth;
是只读的,我无法DesiredSize
。
文档说DesiredSize.Width
更新了Measure()
的{{1}},所以我尝试了:
DesiredSize
但是UIElement
没有变化。如何设置Size size = new Size(myCalculatedWidth, Double.PositiveInfinity);
child.Measure(size);
?
答案 0 :(得分:2)
如果直接调用Measure
,WPF布局系统无关(因为它会缓存控件的状态并将其存储为MeasureIsValid
等标志)。您应该为此控件(将控件标记为InvalidateMeasure()
和MeasureIsValid = false)
调用UpdateLayout()
,然后强制更新布局。
答案 1 :(得分:1)
试试child.Width = myCalculatedWidth
。
答案 2 :(得分:1)
致电InvalidateArrange()
。渲染系统将调用Arrange(Rect)
并使用您的尺寸更新UIElement的DesiredSize
。
答案 3 :(得分:1)
其他答案都不适合我。我需要做的是在子控件中实现MeasureOverride
并在那里实现所需的布局行为。
答案 4 :(得分:1)
一个人不能直接改变DesiredSize,因为只有UIElement可以写入DesiredSize,这发生在 UIElement.Measure()。但是,Measure()不会计算DesiredWidth,而是调用MeasurementCore。但即使MeasurementCore也不直接计算DesiredSize,而是使用MeasurementOverride的retunr值。这就是你必须覆盖MeasurementOverride()来改变DesiredChange的原因: - )
看起来像这样:
UIElement.Measure() calls
FrameworkElement.MeasureCore() calls
YourControl.MeasureOverwrite()
MeasureOverwrite()的返回值变为MeasureCore()的返回值,然后存储在UIElement.DesiredSize中。
请注意,MeasureOverwrite()返回的值不一定与DesiredSize中存储的值相同,因为Margin会被添加到返回值中! FrameworkElement.MeasurementCore()还确保DesiredSize分别在MinWidth,MaxWidth和Height范围内。如果返回值的宽度或高度是无限的isNaN,则抛出异常。