Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:在ItemsControl中定位项目并启用滚动_C#_Wpf - Fatal编程技术网

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

C# WPF:在ItemsControl中定位项目并启用滚动,c#,wpf,C#,Wpf,我有一个具有X,Y属性的对象列表。我想将集合放入ItemsControl中,并根据其x和y来定位每个项 我不知道X或Y的最大值 我尝试将Canvas用作ItemsControl.ItemsPanel,但Canvas不会根据其子项更改其大小。因此,ScrollViewer无法滚动ItemsControl 我查过了。第一种解决方案是使用网格并设置边距。但是,Thickness.X和Thickness.Y不是依赖属性,不可绑定。第二个解决方案是可以的,但涉及代码隐藏。最后一个解决方案也应该有效,但是编

我有一个具有
X
Y
属性的对象列表。我想将集合放入
ItemsControl
中,并根据其x和y来定位每个项

我不知道X或Y的最大值

我尝试将
Canvas
用作ItemsControl.ItemsPanel,但Canvas不会根据其子项更改其大小。因此,ScrollViewer无法滚动ItemsControl

我查过了。第一种解决方案是使用网格并设置边距。但是,Thickness.X和Thickness.Y不是依赖属性,不可绑定。第二个解决方案是可以的,但涉及代码隐藏。最后一个解决方案也应该有效,但是编写一个新类是很费力的


如何在ItemsControl中定位项目并启用滚动?您喜欢哪种解决方案?

虽然Thickness.X和Thickness.Y不是依赖属性,但Margin是。您只需要定义一个接受包含X和Y值的对象的ValueConverter,或一个接受X和Y值的多值Convert。两种实现都将返回一个厚度

<YourElement.Margin>
    <MultiBinding Converter="{StaticResource myMarginConverter}">
      <Binding Path="X"/>
      <Binding Path="Y"/>
    </MultiBinding>
</YourElement.Margin>

我还没有测试过这个代码,但你已经明白了。至于哪种方法更好,使用画布听起来更像是为您的预期目的而设计的控件。然而,这取决于你试图做什么的细节。我相信,如果您对虚拟化有很多期望,那么canvas具有更高效率的潜力。如果它们不需要交互,您也可以将它们绘制到位图图像。

将画布的宽度和高度属性绑定到ViewModel中的属性,并让ViewModel计算所需的值。这就是我所做的,它就像一个魔咒。@不能解决画布大小问题的鞋子,你在说什么?在“WPF控件开发释放:构建高级用户体验”一书中有一个雷达屏幕,该书基于列表框和自行开发的ItemsPanel构建。此面板根据项目坐标对项目进行定位,并根据这些坐标确定其首选大小。我相信你会在某处找到可供下载的源代码。
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};
    }
}