我目前正在尝试为ItemsControl构建一个ControlTemplate,它使用网格作为其ItemsPanel,其中每个项目都水平堆叠,并使用GridSplitter分隔。
基本目标是拥有一个动态可绑定的ItemsControl,其中所有项都堆叠在一行中,并且每个项都可以使用拆分器调整大小。
有两件事我不能理解: GridSplitter应该如何在每一项之间自动结束?如何为每个项目设置Grid.Column。
如果这不能用一个简单的控件模板来完成,那么实现这样的东西有什么常见且好的方法呢?我需要为此编写一个新的ItemsControl吗?
我需要实际的(网格)拆分器控件,以便可以有自定义的ControlTemplates为他们。另外,我认为如果能为单元格添加额外的布局功能(GridLengthUnitType、Stretch、Alignment),那将非常方便。
因此,当滚动我自己的时,我想我需要一个自定义的ItemsControl (它为每个项目生成拆分器)和一个自定义的面板(它的行为就像一个一行/一列的网格-所以不需要附加的Grid.Row,Grid.Column属性,.Orientation就足够了),它可以接受拆分器控件,并知道如何在布局方面处理它们。
你对这种方法有什么看法?是首选方法还是好方法?
发布于 2010-03-24 23:30:00
我的理解是,ItemsControl是基于这样一种想法,即对于每个项目,它只创建一个控件并将其添加到项目主机中。为每个项目同时创建一个GridSplitter和默认的项目容器违反了这一原则。
由于您只有一列,并且只想垂直调整大小,我建议您编写自己的面板,它的行为类似于StackPanel,但始终在子元素之间留出几个像素的间隙。如果鼠标位于此间隙上,并且用户开始拖动,则面板可以调整最近的子元素的大小。
因此,调整大小的逻辑必须在自定义面板上实现,这被认为是最大的缺点,但我认为这是值得的,因为它只隐藏在一个地方。除了使用这个面板作为itemshost之外,你不需要在ItemsControl/ItemTemplate/ItemContainerStyle中做任何特殊的事情。
您还可以使用标准的StackPanel并向其添加实现调整大小逻辑的鼠标处理程序。但是,你必须在你的ItemContainerStyle中设置一个页边距来创建空白处。
发布于 2010-03-19 11:55:41
您需要将网格拆分器放在它自己的列中。假设网格只有一行,则不需要为任何项设置Grid.Row。但是,如果您愿意,可以将其设置为0(第一行)。
不过,这可能是编写您自己的自定义容器的一个很好的理由。也许基于堆叠面板而不是网格。我相信网格拆分器会影响它自身两边项目的大小(我认为你想要的是让它移动除正在调整大小的项目以外的所有项目)。
https://stackoverflow.com/questions/2332038
复制相似问题