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