2010-02-25 50 views
0

目前我正在试图建立一个控件模板的使用网格作为其ItemsPanel,其中每个项目的水平堆叠,并且具有GridSplitter分隔的一个ItemsControl。ItemsPanel VS电网VS GridSplitter

的基本目标是拥有一个动态绑定ItemsControl的所有项目在一排和其中每个项目可以用分路器来调整叠起来。

有两件事情我不能绕到我的头:在GridSplitter应该如何各项目之间自动结束?如何为每个项目设置Grid.Column。

如果不能用一个简单的控件模板做的事情是执行这样的一个共同的好办法?我需要为此编写一个新的ItemsControl吗?

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

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

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

回答

0

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

虽然这可能是编写自己的自定义容器的好理由。也许基于堆叠面板而不是网格。我相信网格分割器会影响它自身两侧的项目大小(我认为你想要的是除了它正在调整大小的一个之外,它将移动所有项目)。

+0

我想你混合了行和列。正如我所说的,在上述情况下我想要的物品堆积,在一排(所以很多列在这里),我需要添加大量的项目列之间gridsplitters的。当然,人们可以很容易想象,垂直方向也适用同样的事情。 – bitbonk 2010-03-19 11:43:31

+0

好的。然后切换行和列。我相应地改变了我的答案。 – 2010-03-19 15:04:41

+0

我需要实际的(Grid)Splitter控件,以便可以为它们定制ControlTemplates。此外,我认为它可以非常方便地为单元格提供额外的布局功能(GridLengthUnitType,Stretch,Alignment)。所以我想我需要一个自定义ItemsControl(为每个项目生成分隔符)和一个自定义面板(其行为像一个onowow/onecolumn网格 - 因此不需要附加的Grid.Row,Grid.Column属性,.Orientation会足够),可以采取Splitter控制,并知道如何处理它们的布局。 – bitbonk 2010-03-20 09:16:26

2

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

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

因此,调整大小逻辑将不得不自定义面板上实现,这是想最大的缺点,但IMO非常值得,因为它是只在一个地方局促。您不需要在ItemsControl/ItemTemplate/ItemContainerStyle中执行任何特殊操作,而不是将此Panel用作itemshost。

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

+0

只有一个问题。我需要能够为分离器部分编写控制模板。 – bitbonk 2010-03-24 21:09:15

+0

啊,我看到...我不认为使用ItemsControl是一个选项,然后... – Bubblewrap 2010-03-25 09:22:42