我有具有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不是依赖属性,也不是可绑定的。第二种解决方案还可以,但是涉及代码隐藏。最后的解决方案也应该起作用,但是编写新的类很费力。

如何在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/

10-10 18:40
查看更多