WPF UserControl не отображается при переопределении MeasureOverride и ArrangeOverride

У меня UserControl выглядит так:

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

В дополнение к ограничению размера min/max, я хочу, чтобы элемент управления всегда отображался 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;
}

Я понимаю, что я должен позвонить Measure а также Arrange на каждом дочернем элементе UserControl. Поскольку DocPanel является единственным дочерним элементом моего UserControl и (в моем понимании) хранится в Content свойство UserControl, я просто называю Measure а также Arrange на это свойство контента. Однако UserControl не отображается. Что я делаю неправильно?

1 ответ

В зависимости от того, как вы размещаете свой 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));
}
Другие вопросы по тегам