6

我有一个看起来像这样的 UserControl:

<UserControl
    MaxHeight="32"
    MaxWidth="32"
    MinHeight="25"
    MinWidth="25">
    <DockPanel>
        <!-- some stuff -->
    </DockPanel>
</UserControl>

除了最小/最大尺寸约束之外,我还希望控件始终使用Width = Height. 所以我覆盖MeasureOverrideArrangeOverride

protected override Size MeasureOverride(Size availableSize)
{
    var resultSize = new Size(0, 0);
    ((UIElement)Content).Measure(availableSize);
    var sideLength = Math.Min(((UIElement)Content).DesiredSize.Width, ((UIElement)Content).DesiredSize.Height);

    resultSize.Width = sideLength;
    resultSize.Height = sideLength;

    return resultSize;
}

protected override Size ArrangeOverride(Size finalSize)
{
    ((UIElement)Content).Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height));
    return finalSize;
}

我知道我必须调用UserControlMeasureArrange每个子项。由于 DocPanel 是我的 UserControl 的唯一子项,并且(在我的理解中)存储在 UserControl 的属性中,Content因此我只需调用此 Content 属性即可。但是不显示 UserControl。我究竟做错了什么?MeasureArrange

4

1 回答 1

3

根据您托管 UserControl 的方式,可能不会使用从 Measure 阶段返回的值。如果您将其设置在带有星形行/列的网格或 DockPanel 中,则最终大小可能会完全不同。

您需要将类似的逻辑应用于排列阶段,因此它将有效地忽略它给出的任何额外空间。

以下代码应该可以工作,并且更简洁:

protected override Size MeasureOverride(Size availableSize) {
    var desiredSize = base.MeasureOverride(availableSize);
    var sideLength = Math.Min(desiredSize.Width, desiredSize.Height);

    desiredSize.Width = sideLength;
    desiredSize.Height = sideLength;

    return desiredSize;
}

protected override Size ArrangeOverride(Size finalSize) {
    var sideLength = Math.Min(this.DesiredSize.Width, this.DesiredSize.Height);
    return base.ArrangeOverride(new Size(sideLength, sideLength));
}
于 2011-02-24T02:36:05.127 回答