2

我需要在自定义面板中计算Width每个。UIElement如果循环Children

foreach (UIElement child in Children) { ... }

我不能这样做child.DesiredSize.Width = myCalculatedWidth;DesiredSize并且DesiredSize.Width是只读的。

文档说Measure()更新了DesiredSizeUIElement所以我尝试了:

Size size = new Size(myCalculatedWidth, Double.PositiveInfinity);
child.Measure(size);

child.DesiredSize.Width不变。我该如何设置DesiredSize.Width

4

5 回答 5

2

如果您Measure直接调用,则 WPF 布局系统无需执行任何操作(因为它会缓存控件的状态并将其存储为类似的标志MeasureIsValid)。您应该调用InvalidateMeasure()此控件(它将控件标记为MeasureIsValid = false)然后UpdateLayout()强制更新布局。

于 2012-01-10T15:40:10.803 回答
2

试试看child.Width = myCalculatedWidth

于 2010-08-21T12:17:21.873 回答
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 的 Width 或 Height 为 Infinite,则抛出异常。

于 2014-12-16T03:35:19.900 回答
1

其他答案都不适合我。我需要做的是MeasureOverride在子控件中实现并在那里实现所需的布局行为。

于 2012-10-15T22:33:32.013 回答
1

打电话InvalidateArrange()。渲染系统将调用Arrange(Rect)并更新DesiredSizeUIElement 与您的大小。

于 2011-08-09T12:19:01.763 回答