GridSplitter行为

时间:2016-02-03 22:00:35

标签: c# wpf gridsplitter

我正在尝试将列和网格分割器添加到网格中,但无法获得确切的行为 在用户指定他想要显示垂直分割器的位置之后:

             // Get current Col0 width, size new col and existing Col0
            double col0Width = LayoutRoot.ColumnDefinitions[0].ActualWidth;
            double newCol0Width = col0Width - 5 - pt.X;
            LayoutRoot.ColumnDefinitions[0].Width = new GridLength(newCol0Width);

            // New Column 0
            var c = new ColumnDefinition();
            c.Width = new GridLength(pt.X);
            LayoutRoot.ColumnDefinitions.Insert(0, c);// Attach GridSplitter to left edge of existing first column
            var gss = new GridSplitter();
            gss.Background = new SolidColorBrush(Colors.DarkSlateBlue);
            gss.Width = 5;    gss.Cursor = Cursors.ScrollWE;
            gss.ResizeBehavior = GridResizeBehavior.BasedOnAlignment;
            gss.HorizontalAlignment = HorizontalAlignment.Left;

            LayoutRoot.Children.Add(gss);
            // Add to current left-most colunn
            Grid.SetColumn(gss, 0);

            // Create new column, insert
            // New Column 0
            var c = new ColumnDefinition();
            c.Width = new GridLength(pt.X);
            LayoutRoot.ColumnDefinitions.Insert(0, c);  

            // Move existing content from Col 0 to new Col 1.  

我可以重复这个并创建任意数量的垂直分割器。

所需的调整大小行为:移动拆分器仅调整immed列的大小。在分离器的左侧和右侧。
当前调整大小的行为:移动拆分器将拆分器右侧的所有内容视为一个对象,将列扩展或缩小到拆分器的左侧,同时将所有内容移动到右侧。也就是说,如果有3列,则移动最左侧的分离器似乎将第2列向右推并缩小第3列,而不调整第2列的大小。
(我希望我能够清楚地解释清楚。)
我已经尝试将GridSplitters放在他们自己的列中,并尝试了各种GridResizeBehaviors,但没有找到正确的组合。

任何提示都将不胜感激....

一个相关的问题:在GridSplitter的OnDragDelta的事件处理程序中,有没有办法阻止拆分器在某个方向上进一步移动?我想阻止它们将最右边的列缩小到一定宽度以下,同时允许它们将分离器向后移动到左边。
感谢。

1 个答案:

答案 0 :(得分:0)

正如我的评论所示,看起来列的大小必须为'*' 因此,在添加新的色谱柱和分离器之后,我修正了这样的宽度(在解决方案时首先进行了笨拙的切割):

 // Get all col widths, set appropriate '*' sizes.
        foreach (ColumnDefinition col in LayoutRoot.ColumnDefinitions)
        {
            colWidths.Add(col.Width);
            total += col.Width.Value;

            Debug.WriteLine($" Width : {col.Width}");
        }

        Debug.WriteLine($"{total}");

        for (int i = 0; i < LayoutRoot.ColumnDefinitions.Count; i++)
        {
            double d = colWidths[i].Value;
            double ratio = d / total;
            int ii = (int) (ratio * 100);

            LayoutRoot.ColumnDefinitions[i].Width = new GridLength(ii, GridUnitType.Star);
        }