WPF UserControl не отображается при переопределении MeasureOverride и ArrangeOverride - PullRequest
6 голосов
/ 09 марта 2010

У меня есть 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;
}

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

1 Ответ

3 голосов
/ 24 февраля 2011

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