我有一个看起来像这样的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的每个子节点上调用Measure和Arrange。由于DocPanel是我的UserControl的惟一子对象,并且(据我所知)存储在UserControl的Content属性中,因此我只对该内容属性调用Measure和Arrange。但是,不会显示UserControl。我做错了什么?
发布于 2011-02-24 10:36:05
根据您托管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));
}https://stackoverflow.com/questions/2409410
复制相似问题