首页 文章

ItemsPanel vs Grid vs GridSplitter

提问于
浏览
0

我目前正在尝试为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

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

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

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

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

  • 2

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

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

相关问题