gpt4 book ai didi

重写 MeasureOverride 和 ArrangeOverride 时不绘制 WPF UserControl

转载 作者:行者123 更新时间:2023-12-01 19:22:16 25 4
gpt4 key购买 nike

我有一个如下所示的用户控件:

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

除了最小/最大尺寸限制之外,我还希望控件始终使用Width = Height进行绘制。所以我覆盖 MeasureOverrideArrangeOverride:

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 的每个子项调用 MeasureArrange。由于 DocPanel 是我的 UserControl 的唯一子级,并且(根据我的理解)存储在 UserControl 的 Content 属性中,因此我只需调用 MeasureArrange 在此内容属性上。但是,不会显示 UserControl。我做错了什么?

最佳答案

根据您托管 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));
}

关于重写 MeasureOverride 和 ArrangeOverride 时不绘制 WPF UserControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2409410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com