我有一个包含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不是依赖项属性,不可绑定。第二个解决方案是OK,但涉及代码隐藏。最后的解决方案也应该有效,但写一个新类很费力。
如何在ItemsControl中定位项目并启用滚动?你更喜欢什么解决方案?
答案 0 :(得分:1)
虽然Thickness.X和Thickness.Y不是依赖属性,但Margin是。您只需要定义一个ValueConverter接受包含X和Y值的对象,或者接受一个接受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可以提高虚拟化的效率。如果他们不需要互动,您也可以将它们绘制成位图图像。