3

我有一个单列网格,在 WPF 应用程序中具有不同高度的行。网格中的项目是动态生成的,将在运行时添加和删除。

对于添加的每一行,我希望在每个元素之间插入一个 GridSplitter 行。

我目前通过 ItemControl 绑定模型数据,并使用 AttachedProperties 来获取元素行数(显然最终的解决方案将有更多的行数来包含 GridSplitters):

<ItemsControl ItemsSource="{Binding MyModel}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid local:GridHelpers.RowCount="{Binding MyModel.RowCount}" local:GridHelpers.ColumnCount="1"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

MyModel 变量是一个包含 ViewModel 对象的 ObservableCollection。RowCount 是一个成员变量,它返回集合中元素的数量。

如何在每行之间插入 GridSplitter?

我希望从模板生成每个元素和 GridSplitter。但是,如果 GridSplitter 包含在模板中,则由于存在 ContentPresenter 作为其父级而不是 Grid,因此它不起作用。除了创建自己的 UI 元素之外,我的想法已经用完了,它有自己的拆分器组件是从头开始编写的。肯定还有别的办法!

非常感谢您的帮助。

4

2 回答 2

1

我假设定义属性的GridHelpers静态类负责为.RowCountRowDefinitionItemsSource

对于第二个项目和所有后续项目,RowDefinition您的代码应该添加两个行定义,而不是添加一个行定义 - 一个用于项目,一个用于拆分器。然后代码还应该添加一个gridsplitter,其Grid.Row 值是您动态添加的两个RowDefinition 中的第一个。总是很奇怪。

    var gs = new GridSplitter();
    gs.SetValue(Grid.RowProperty, x); //x = the RowDefinition you are generating
    gs.ResizeBehavior = GridResizeBehavior.PreviousAndNext;
    gs.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
    gs.VerticalAlignment = System.Windows.VerticalAlignment.Top;
    gs.Height = 3; //or whatever other height you desire.

然后为项目本身添加另一个 RowDefinition。不要忘记将项目的 Grid.Row 属性设置为偶数行定义

于 2012-10-22T00:39:17.250 回答
0

好吧,经过大量阅读,我想我已经找到了最好的解决方案,对于那些可能希望做同样事情的人。

我实现了类似于 ColumnResizerAdorner 在核心 WPF 库中的工作方式。还可能值得查看 MSDN 的 WPF 示例中的 ResizingAdorner 示例。

我有一个装饰类,它将拇指添加到 VisualCollection。用于处理拇指拖动事件的类。此类知道 Grid 行定义,并相应地调整它们的大小。

于 2012-11-10T15:21:55.600 回答