C# WPF:在ItemsControl中定位项目并启用滚动
我有一个具有C# WPF:在ItemsControl中定位项目并启用滚动,c#,wpf,C#,Wpf,我有一个具有X,Y属性的对象列表。我想将集合放入ItemsControl中,并根据其x和y来定位每个项 我不知道X或Y的最大值 我尝试将Canvas用作ItemsControl.ItemsPanel,但Canvas不会根据其子项更改其大小。因此,ScrollViewer无法滚动ItemsControl 我查过了。第一种解决方案是使用网格并设置边距。但是,Thickness.X和Thickness.Y不是依赖属性,不可绑定。第二个解决方案是可以的,但涉及代码隐藏。最后一个解决方案也应该有效,但是编
X
,Y
属性的对象列表。我想将集合放入ItemsControl
中,并根据其x和y来定位每个项
我不知道X或Y的最大值
我尝试将Canvas
用作ItemsControl.ItemsPanel,但Canvas不会根据其子项更改其大小。因此,ScrollViewer无法滚动ItemsControl
我查过了。第一种解决方案是使用网格并设置边距。但是,Thickness.X和Thickness.Y不是依赖属性,不可绑定。第二个解决方案是可以的,但涉及代码隐藏。最后一个解决方案也应该有效,但是编写一个新类是很费力的
如何在ItemsControl中定位项目并启用滚动?您喜欢哪种解决方案?虽然Thickness.X和Thickness.Y不是依赖属性,但Margin是。您只需要定义一个接受包含X和Y值的对象的ValueConverter,或一个接受X和Y值的多值Convert。两种实现都将返回一个厚度
<YourElement.Margin>
<MultiBinding Converter="{StaticResource myMarginConverter}">
<Binding Path="X"/>
<Binding Path="Y"/>
</MultiBinding>
</YourElement.Margin>
我还没有测试过这个代码,但你已经明白了。至于哪种方法更好,使用画布听起来更像是为您的预期目的而设计的控件。然而,这取决于你试图做什么的细节。我相信,如果您对虚拟化有很多期望,那么canvas具有更高效率的潜力。如果它们不需要交互,您也可以将它们绘制到位图图像。将画布的宽度和高度属性绑定到ViewModel中的属性,并让ViewModel计算所需的值。这就是我所做的,它就像一个魔咒。@不能解决画布大小问题的鞋子,你在说什么?在“WPF控件开发释放:构建高级用户体验”一书中有一个雷达屏幕,该书基于列表框和自行开发的ItemsPanel构建。此面板根据项目坐标对项目进行定位,并根据这些坐标确定其首选大小。我相信你会在某处找到可供下载的源代码。
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};
}
}