ItemsPanel vs Grid vs GridSplitter

时间:2010-02-25 06:14:13

标签: .net wpf grid itemscontrol gridsplitter

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

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

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

如果使用简单的控件模板无法做到这一点,那么实现这样的事情会有什么常见且好的方法?我需要为此编写一个新的ItemsControl吗?

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

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

但这可能是编写自己的自定义容器的一个很好的理由。也许基于stackpanel而不是grid。我相信gridsplitter会影响它自身两侧的物品的大小(我想你想要的是它除了一个它正在调整大小之外的所有东西)。