我试图在WPF中创建一个 View ,并且很难弄清楚如何设置它。这是我要构建的内容:

  • 我的ViewModel公开了一个名为Items
  • 的IEnumerable属性。
  • 每个项目都是时间轴上的一个事件,并且每个项目都实现ITimelineItem
  • 每个项目的ViewModel都有自己的DataTemplate来显示它
  • 我想显示由一条线连接的时间轴上的所有项目。我认为ListView内的WrapPanel可以很好地解决此问题。
  • 但是,每个项目的高度将根据显示的信息而有所不同。一些项目在行上将具有图形对象(例如圆形或菱形或其他形状),而某些项目在该行的上方或下方具有注释。

  • 所以对我来说似乎很复杂。似乎时间线上的每个项目都必须呈现其自己的线段。没关系。但是,项目顶部与线条(和项目底部与线条)之间的距离可能会有所不同。如果一个项目的行距顶部向下50 px,下一个项目的行距顶部向下100 px,则第一个项目需要50 px的填充,以便将线段相加。

    我想我可以解决这个问题,但是,如果这两个项目在WrapPanel中的同一行上,我们只需要添加填充即可!假设有5个项目,而屏幕上只有3个房间……WrapPanel会将其他两个放在下一行。没关系,但这意味着只有前三个需要垫在一起,而后两个则需要垫在一起。

    这让我头疼。我可以看看另一种方法吗?

    编辑:我倾向于使用从Canvas继承并覆盖MeasureOverride和ArrangeOverride方法的自定义面板替换WrapPanel。

    最佳答案

    对此的理想解决方案可能是使用装饰器。在AdornerLayer上,您将为面板上的每个项目都有一个自定义的Adorner(您可以在DataTemplate中定义它)。您将能够检索每个项目的位置尺寸(Adorner的边界框)。同样在AdornerLayer上,然后您将在这些边界框之间绘制线条。
    使用此解决方案,您可以按所需方式(使用所需的任何面板)对项目进行布局,并且项目仍将通过线连接。

    很久以前,我将这种方法用于图形可视化工具。可以以任何方式布置任意UIElement的节点。用线连接的项目。

    为了使所有项目完美对齐,可以在项目模板中使用“ Canvas ”作为根面板。 Canvas 可以是0x0单位大。然后,您将围绕该Canvas布置元素。 Canvas 成为您的引用点。该行顶部的所有内容都将为负Canvas.Top值。
    另一种方法是使用负边界,该边界与行周围的顶部和底部控件的高度绑定(bind)。使用IValueConverter(Height * -1)反转高度。

    关于wpf - 如何在水平WrapPanel中对齐WPF项,以便它们基于每个项中的任意垂直点对齐?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2888614/

    10-12 02:39