【问题标题】:WPF: position items in ItemsControl and enable scrollWPF:在 ItemsControl 中定位项目并启用滚动
【发布时间】:2013-09-08 05:17:20
【问题描述】:

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

【问题讨论】:

  • 将 Canvas Width 和 Height 属性绑定到 ViewModel 中的属性,并让 ViewModel 计算所需的值。这就是我所做的here,它就像一个魅力。
  • @Shoe 不能解决画布尺寸问题,你在说什么?
  • 《WPF控件开发释放:构建高级用户体验》一书中有一个雷达屏,它是基于一个ListBox和一个自研的ItemsPanel构建的。该面板根据项目的坐标定位项目,并根据这些坐标确定其首选大小。我相信你可以在某处找到下载源代码。

标签: c# wpf


【解决方案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 听起来更像是为您的预期目的设计的控件。但是,这取决于您要执行的操作的详细信息。如果您期望获得很多分数,我相信画布具有提高虚拟化效率的潜力。如果它们不需要交互,您也可以将它们绘制为位图图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    相关资源
    最近更新 更多