XAMLを使わないWPF入門13「Gridコントロール-動的」

コンピュータ

格子状に領域を分割するGridコントロールを試してみます。左クッリクでGirdの分割数を増やすプログラムになっています。XAMLを使わないプログラミングなので、動的にGridの格子数を増減させてみます。

プロジェクトの作成

cd (mkdir NoXAML13)
dotnet new wpf -f net8.0
rm *.xaml

ソースファイル

ファイル名:NoXAML13.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net8.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UseWPF>true</UseWPF>
    <StartupObject>NoXAML13.App</StartupObject>
  </PropertyGroup>

</Project>

ファイル名:App.xaml.cs

using System.Windows;

namespace NoXAML13;

public partial class App : Application
{
    [STAThread]
    public static void Main()
    {
        var app = new App();
        var window = new MainWindow();
        app.Run(window);
    }
}

ファイル名:MainWindow.xaml.cs

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;

namespace NoXAML13;

public partial class MainWindow : Window
{
    private Grid _grid;
    private int _cellCount = 1;

    public MainWindow()
    {
        Title = "Grid Sample (No XAML)";
        Width = 400;
        Height = 400;

        _grid = new Grid();
        Content = _grid;

        UpdateGrid();

        MouseDown += OnMouseDown;
    }

    private void OnMouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.ChangedButton == MouseButton.Left)
        {
            _cellCount++;
        }
        else if (e.ChangedButton == MouseButton.Right)
        {
            _cellCount = Math.Max(1, _cellCount - 1);
        }

        UpdateGrid();
    }

    private void UpdateGrid()
    {
        _grid.Children.Clear();
        _grid.RowDefinitions.Clear();
        _grid.ColumnDefinitions.Clear();

        for (int i = 0; i < _cellCount; i++)
        {
            _grid.RowDefinitions.Add(new RowDefinition());
            _grid.ColumnDefinitions.Add(new ColumnDefinition());
        }

        for (int row = 0; row < _cellCount; row++)
        {
            for (int col = 0; col < _cellCount; col++)
            {
                var rect = new Border
                {
                    Background = new SolidColorBrush(Color.FromRgb(
                        (byte)(100 + row * 10),
                        (byte)(100 + col * 10),
                        200)),
                    BorderBrush = Brushes.Black,
                    BorderThickness = new Thickness(1)
                };

                Grid.SetRow(rect, row);
                Grid.SetColumn(rect, col);
                _grid.Children.Add(rect);
            }
        }
    }
}

実行

dotnet run

起動時(グリッド数1×1)

左クリック1回目(グリッド数2×2)

左クリック2回目(グリッド数3×3)

左クリック3回め(グリッド数4×4)

感想

動的に格子が増減するようになってはいますが、増減のたびにGridの中身をクリアして再度格子を作り直していて、実用的ではない感じがします。Gridは静的な使い方をしたほうが無難そうだなぁと感じました。

コメント