gpt4 book ai didi

c# - WPF:在 ItemsControl 中定位项目并启用滚动

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:03 25 4
gpt4 key购买 nike

我有一个具有 X,Y 属性的对象列表。我想将集合放入 ItemsControl 并根据其 x 和 y 定位每个项目。

我不知道 X 或 Y 的最大值。

我尝试将 Canvas 用作 ItemsControl.ItemsPanel,但 Canvas 不会根据其子项更改其大小。因此 ScrollViewer 无法滚动 ItemsControl。

我检查了How to Visible ScrollBar In Items Panel With Canvas as ItemsPaneltemplate .第一种解决方案是使用 Grid 并设置 Margin。但是,Thickness.X 和 Thickness.Y 不是依赖属性并且不可绑定(bind)。第二种解决方案还可以,但涉及代码隐藏。最后一个解决方案也应该有效,但编写一个新类很费力。

如何在 ItemsControl 中定位项目并启用滚动?您更喜欢哪种解决方案?

最佳答案

虽然 Thickness.X 和 Thickness.Y 不是依赖属性,但 Margin 是。您只需要定义一个接受包含 X 和 Y 值的对象的 ValueConverter,或者定义一个接受 X 和 Y 值的 MultiValueConvert。两种实现都会返回厚度。

<YourElement.Margin>
<MultiBinding Converter="{StaticResource myMarginConverter}">
<Binding Path="X"/>
<Binding Path="Y"/>
</MultiBinding>
</YourElement.Margin>

.

public class NameConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
//Validate parameters...

Thickness margin = new Margin(values[0], values[1], 0d, 0d);

return margin;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
//Validate parameters...

double x = ((Thickness)value).Left;
double y = ((Thickness)value).Top;

return new object[]{x, y};
}
}

我还没有测试过这段代码,但你明白了。至于哪种方法更好,使用 Canvas 听起来更像是为您的预期目的设计的控件。但是,这取决于您要执行的操作的详细信息。我相信 canvas 有可能通过虚拟化提高效率,如果你期待很多点的话。如果它们不需要交互,您也可以将它们绘制成位图图像。

关于c# - WPF:在 ItemsControl 中定位项目并启用滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18680668/

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