我有具有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不是依赖属性,也不是可绑定的。第二种解决方案还可以,但是涉及代码隐藏。最后的解决方案也应该起作用,但是编写新的类很费力。
如何在ItemsControl中放置项目并启用滚动?您喜欢哪种解决方案?
最佳答案
尽管Thickness.X和Thickness.Y不是依赖属性,但Margin是依赖属性。您只需要定义一个ValueConverter即可接受包含X和Y值的对象,或者定义一个MultiValueConvert即可接受X和Y值。两种实现都将返回“厚度”。
<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/