2

我有一个具有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 中定位项目并启用滚动?你更喜欢什么解决方案?

4

1 回答 1

1

虽然 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 具有提高虚拟化效率的潜力。如果它们不需要交互,您也可以将它们绘制到位图图像上。

于 2013-09-17T17:26:30.423 回答