gpt4 book ai didi

wpf - 嵌套滚动区域

转载 作者:行者123 更新时间:2023-12-04 01:53:29 24 4
gpt4 key购买 nike

我为 WPF 创建了一个控件,我有一个问题要问 WPF 专家。

我希望我的控件能够扩展以适应可调整大小的窗口。

在我的控件中,我有一个列表框,我想用该窗口展开它。我还有围绕列表框的其他控件(按钮、文本等)。

我希望能够在我的控件上设置最小大小,但我希望通过创建用于查看控件的滚动条来缩小窗口的大小。

这将创建嵌套滚动区域:一个用于列表框和一个 ScrollViewer 包装整个控件。

现在,如果列表框设置为自动大小,它将永远不会有滚动条,因为它始终在 ScrollViewer 中以全尺寸绘制。

如果内容不能变小,我只希望控件滚动,否则我不想滚动控件;相反,我想滚动控件内的列表框。

如何更改 ScrollViewer 类的默认行为?我尝试从 ScrollViewer 类继承并覆盖 MeasureOverride 和ArrangeOverride 类,但我无法弄清楚如何正确测量和安排 child 。似乎该安排必须以某种方式影响 ScrollContentPresenter,而不是实际的内容子项。

任何帮助/建议将不胜感激。

最佳答案

我创建了一个类来解决这个问题:

public class RestrictDesiredSize : Decorator
{
Size lastArrangeSize = new Size(double.PositiveInfinity, double.PositiveInfinity);

protected override Size MeasureOverride(Size constraint)
{
Debug.WriteLine("Measure: " + constraint);
base.MeasureOverride(new Size(Math.Min(lastArrangeSize.Width, constraint.Width),
Math.Min(lastArrangeSize.Height, constraint.Height)));
return new Size(0, 0);
}

protected override Size ArrangeOverride(Size arrangeSize)
{
Debug.WriteLine("Arrange: " + arrangeSize);
if (lastArrangeSize != arrangeSize) {
lastArrangeSize = arrangeSize;
base.MeasureOverride(arrangeSize);
}
return base.ArrangeOverride(arrangeSize);
}
}

即使包含元素想要更大,它也将始终返回所需的大小 (0,0)。
用法:
<local:RestrictDesiredSize MinWidth="200" MinHeight="200">
<ListBox />
</local>

关于wpf - 嵌套滚动区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/198656/

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