【问题标题】:ItemsPanel vs Grid vs GridSplitterItemsPanel vs Grid vs GridSplitter
【发布时间】:2011-01-20 21:10:02
【问题描述】:

我目前正在尝试为使用 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 控件并知道如何在布局方面处理它们。

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

【问题讨论】:

    标签: .net wpf grid itemscontrol gridsplitter


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 只有一个问题。我需要能够为拆分器部分编写控制模板。
    【解决方案2】:

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

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

    【讨论】:

    • 我认为你混淆了行和列。正如我所说,在上述场景中,我希望项目堆叠成一行(这里有很多列),我需要在项目的列之间添加很多网格分割器。当然,人们很容易想象同样的事情也适用于垂直方向。
    • 好的。然后切换行和列。我相应地改变了我的答案。
    • 我需要实际的 (Grid)Splitter 控件,以便为它们提供自定义 ControlTemplates。此外,我认为为单元格添加额外的布局功能(GridLengthUnitType、Stretch、Alignment)会非常方便。所以我想我需要一个自定义 ItemsControl(为每个项目生成拆分器)和一个自定义面板(其行为类似于一个单行/单列网格 - 所以不需要附加的 Grid.Row、Grid.Column 属性、.Orientation 会足够) 可以采用 Splitter 控件并知道如何在布局方面处理它们。
    • 我理解您所说的能够为 GridSplitter 使用 ControlTemplate。我同意你关于拉伸和对齐属性的看法。我看到的唯一问题是(再次)GridSplitter 会缩小一侧的单元格,因为它会扩展另一侧的单元格。听起来您希望 GridSplitter 一次只影响一个项目的大小(并将其余的向上或向下移动)。
    猜你喜欢
    • 2018-01-06
    • 2016-06-15
    • 2016-09-14
    • 2011-05-28
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多