如何设置UIElement的DesiredSize.Width?

时间:2009-11-30 17:56:27

标签: wpf size width uielement measureoverride

我需要在自定义面板中计算每个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);

5 个答案:

答案 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,则抛出异常。