1

我需要编写一个 C# WPF 程序,以便让用户使用鼠标单独修改网格的宽度和高度。经过一番阅读,我发现 WPF 具有 GridSplitter 控件,这似乎是解决我的问题的可能方法。到目前为止,这是我的方法:

private const int NumCols = 5;
    private const int NumRows = 7;

    private void CreateDynamicWPFGrid()
    {
        // Create the Grid
        var dynamicGrid = new Grid();

        for (int i = 0; i < NumCols - 1; ++i )
        {
            // Define 2 * (NumCols - 1) columns. For every two columns, the first one will hold a label
            // whereas the second one will hold a vertical splitter.

            var gridColDefA = new ColumnDefinition();
            // The gridColDefB is for the splitter.
            var gridColDefB = new ColumnDefinition();
            gridColDefB.Width = new GridLength(1, GridUnitType.Auto);

            dynamicGrid.ColumnDefinitions.Add(gridColDefA);
            dynamicGrid.ColumnDefinitions.Add(gridColDefB);
        }
        {
            // The last column only needs a cell for holding a label. No splitter whatsoever.
            var gridColDef = new ColumnDefinition();
            dynamicGrid.ColumnDefinitions.Add(gridColDef);
        }

        for (int j = 0; j < NumRows - 1; ++j)
        {
            var gridRowDefA = new RowDefinition();
            var gridRowDefB = new RowDefinition();
            // The gridRowDefB is for the splitter.
            gridRowDefB.Height = new GridLength(1, GridUnitType.Auto);

            dynamicGrid.RowDefinitions.Add(gridRowDefA);
            dynamicGrid.RowDefinitions.Add(gridRowDefB);
        }
        {
            // The last row only needs a cell for holding a label. No splitter whatsoever.
            var gridRowDef = new RowDefinition();
            dynamicGrid.RowDefinitions.Add(gridRowDef);
        }

        for (int i = 0; i < NumCols - 1; ++i )
        {
            for(int j = 0; j < NumRows - 1; ++j )
            {
                // Insert the label.
                var label = new Label();
                label.Content = "C" + i + "-R" + j;
                label.Background = new SolidColorBrush(Colors.Azure);
                Grid.SetColumn(label, 2 * i);
                Grid.SetRow(label, 2 * j);
                dynamicGrid.Children.Add(label);

                // Insert the horizontal splitter.
                var horizontalGridSplitter = new GridSplitter();
                horizontalGridSplitter.Height = 1;
                horizontalGridSplitter.Background = new SolidColorBrush(Colors.DarkSlateBlue);
                horizontalGridSplitter.HorizontalAlignment = HorizontalAlignment.Stretch;
                horizontalGridSplitter.VerticalAlignment = VerticalAlignment.Center;
                Grid.SetColumn(horizontalGridSplitter, 2 * i );
                Grid.SetRow(horizontalGridSplitter, 2 * j + 1);
                Grid.SetRowSpan(horizontalGridSplitter, 1);
                Grid.SetColumnSpan(horizontalGridSplitter, 1);
                dynamicGrid.Children.Add(horizontalGridSplitter);

                // Insert the vertical splitter.
                var verticalGridSplitter = new GridSplitter();
                verticalGridSplitter.Width = 1;
                verticalGridSplitter.Background = new SolidColorBrush(Colors.DarkSlateBlue);
                verticalGridSplitter.HorizontalAlignment = HorizontalAlignment.Center;
                verticalGridSplitter.VerticalAlignment = VerticalAlignment.Stretch;
                Grid.SetColumn(verticalGridSplitter, 2 * i + 1);
                Grid.SetRow(verticalGridSplitter, 2 * j + 1);
                Grid.SetRowSpan(verticalGridSplitter, 1);
                Grid.SetColumnSpan(verticalGridSplitter, 1);
                dynamicGrid.Children.Add(verticalGridSplitter);
            }
        }

        // Display grid into a Window
        Content = dynamicGrid;
    }

我得到的输出如下:

默认输出

请注意,我只能调整行的大小(不知道为什么不显示垂直拆分器),并且由于某种原因,当我抓住水平拆分器时,它会调整整行的大小,而不仅仅是单个单元格。有任何想法吗?请参阅以下屏幕截图以查看正在调整大小:

在此处输入图像描述

如果我调整单元格 (0,0) 的大小(图像已由我手动编辑),这就是我所期望的:

在此处输入图像描述

提前致谢!

4

1 回答 1

2

如果您删除为您的 verticalGridSplitter 设置行的行并将它们设置为 span NumRows,您将看到您的垂直拆分器。但最终,我认为您正在尝试做一些带有分离器的网格无法做到的事情。您不能调整单个单元格的宽度和高度,只能调整整行和整列。

毕竟,如果你让 C0-R0 更高,你希望那排的其他人做什么?

于 2012-10-02T16:01:51.577 回答