6

次のような UserControl があります。

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

最小/最大サイズの制約に加えて、コントロールを常に で塗りつぶしWidth = Heightます。だから私はオーバーライドMeasureOverrideしてArrangeOverride:

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;
}

UserControl のすべての子に対してMeasureandを呼び出さなければならないことを理解しています。ArrangeDocPanel は UserControl の唯一の子であり、(私の理解では) UserControl のプロパティに格納されているため、この Content プロパティに対してandをContent呼び出すだけです。ただし、UserControl は表示されません。私は何を間違っていますか?MeasureArrange

4

1 に答える 1

3

UserControlをホストしている方法によっては、測定フェーズから返された値が使用されない場合があります。星の行/列または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 に答える