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

时间:2013-09-08 05:17:21

标签: c# wpf

我有一个包含XY属性的对象列表。我想将集合放入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中定位项目并启用滚动?你更喜欢什么解决方案?

1 个答案:

答案 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可以提高虚拟化的效率。如果他们不需要互动,您也可以将它们绘制成位图图像。