0

我目前正在尝试为使用 Grid 作为其 ItemsPanel 的 ItemsControl 构建 ControlTemplate,其中每个项目水平堆叠并用 GridSplitter 分隔。

基本目标是拥有一个动态可绑定的 ItemsControl,其中所有项目堆叠成一行,并且每个项目都可以使用拆分器调整大小。

有两件事我无法理解: GridSplitter 应该如何在每个项目之间自动结束?如何为每个项目设置 Grid.Column。

如果这不能用一个简单的控制模板来完成,那么实现这样的东西的常见和好的方法是什么?我需要为此编写一个新的 ItemsControl 吗?

我需要实际的 (Grid)Splitter 控件,因此可以为它们提供自定义 ControlTemplates。此外,我认为为单元格添加额外的布局功能(GridLengthUnitType、Stretch、Alignment)会非常方便。

因此,当我自己滚动时,我想我需要一个自定义 ItemsControl(为每个项目生成拆分器)和一个自定义面板(其行为类似于 onerow/onecolumn 网格 - 所以不需要附加的 Grid.Row、Grid.Column 属性, .Orientation 就足够了)可以采用 Splitter 控件并知道如何在布局方面处理它们。

您如何看待这种方法?是首选还是好方法?

4

2 回答 2

2

我的理解是 ItemsControl 是基于这样的想法,即它只为每个项目创建并向 itemshost 添加一个控件。为每个项目创建一个 GridSplitter 和默认的 itemcontainer 违背了这个原则。

由于您只有一列,并且只想垂直调整大小,因此我建议您编写自己的面板,其行为类似于 StackPanel,但始终在子元素之间留下几个像素的间隙。如果鼠标在这个间隙上,并且用户开始拖动,面板可以调整最近的子元素的大小。

所以调整大小的逻辑必须在自定义面板上实现。这被认为是最大的缺点,但 IMO 非常值得,因为它只藏在一个地方。除了将此面板用作项目主机之外,您无需在 ItemsControl/ItemTemplate/ItemContainerStyle 中执行任何特殊操作。

您还可以使用标准 StackPanel 并向其添加实现调整大小逻辑的鼠标处理程序。但是您必须在 ItemContainerStyle 中设置边距以创建间隙。

于 2010-03-24T15:29:59.827 回答
0

您需要将 gridsplitter 放在它自己的列中。假设网格只有一行,则无需为任何项目设置 Grid.Row。但是,如果您愿意,可以将其设置为 0(第一行)。

不过,这可能是编写您自己的自定义容器的一个很好的理由。也许基于堆栈面板而不是网格。我相信 gridsplitter 会影响其自身任一侧的项目的大小(我认为你想要的是它改变所有的东西,除了它正在调整大小的那个)。

于 2010-03-19T03:55:40.900 回答