WPF MeasureOverride不适用于我的自定义控件

时间:2013-03-15 17:09:58

标签: c# .net wpf layout

我有一个“托管”在自定义面板中的自定义控件(我的)。

我的自定义面板包含以下代码:

protected override Size MeasureOverride(Size availableSize)
{
  foreach (UIElement child in Children)
  {
     child.Measure(availableSize);

     // Do stuff with the Desired Size.  (This is an example)
     resultSize.Width += child.DesiredSize.Width;
     resultSize.Height = Math.Max(resultSize.Height, child.DesiredSize.Height);

  }
  //.. Other Measure Stuff
}

我放入面板的所有标准控件都可以正常工作。但是我的自定义控件将DesiredSize设置为非常小的宽度(5像素)。即使它上面有一个Label,至少需要40个像素才能显示。

所以我把这段代码放到我的自定义控件中:

protected override Size MeasureOverride(Size constraint)
{
    var baseSize = base.MeasureOverride(constraint);
    var labelTextWidth = GetStringWidth(label.Content.ToString(), label);

    if (baseSize.Width == 0)
        baseSize.Width = 100;

    if (baseSize.Width < labelTextWidth)
        baseSize.Width = labelTextWidth;

    return baseSize;
}

这会返回正确的Size。但在我的Panel的MeasureOverride中,child.DesiredSize并不反映我从子控件的MeasureOverride返回的内容。

任何想法为什么会这样做?我能做些什么来让我在DesiredSize中正确地将我计算出的Measure传递给面板?(你不能只设置DesiredSize。)

1 个答案:

答案 0 :(得分:0)

如果自定义控件的MeasureOverride返回正确的大小,但它没有反映在DesiredSize属性中,我只有一个建议。您的子元素由某个容器包装,您可以在自定义面板的MeasureOverride过程中检查子元素的类型。