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の行を設定している行を削除し、それらをNumRowsにまたがるように設定すると、垂直スプリッターが表示されます。しかし、最終的には、スプリッターを備えたグリッドでは実行できないことを実行しようとしていると思います。個々のセルの幅と高さのサイズを変更することはできず、行と列全体のサイズを変更することはできません。

結局のところ、C0-R0の高さを高くすると、その行の残りの部分で何ができると思いますか?

于 2012-10-02T16:01:51.577 に答える