LoginSignup
4
2

More than 1 year has passed since last update.

【.NET】WPFのGridを動的に作成してボタンを追加する

Posted at

はじめに

Macに無料のWineskinServerを使用してWindowsアプリケーションを幾つか動かしています。ただ、WineskinServerを使うと1つのアプリケーションに1GByte近く容量が取られます。
それならば、1つのWineskinServerに複数のアプリケーションをインストールしてランチャーを使って起動するようにすればいいのではと思いました。ところがネット上で検索して見つけたランチャーソフト(CLaunchなど)をインストールしてみると、ことごとくエラーで動かない。
簡単なランチャーくらいなら自分で作ろうと、どうせならWinFormより高解像度対応なWPFにしようと思ったんですよね。

WPFでDataGridやListViewを使用し、Windows上で動いたのでWineskinServerに持っていって動かすと駄目なんですよね。
DataGridではアプリケーションが表示段階で落ちてしまうし、ListViewでは表示されたけどリストをクリックしても反応しない。
唯一GridにButtonを配置した状態なら動いたので、これを拡張していこうとしています。

※Wineは.NET系は苦手なのか、または自分の作成したWineskinServer環境の何かが悪さしているのかも。

Gridを動的に作成

ランチャーとして「CLaunch」に想定して作成したいので、Windowsのサイズを変更したらボタンの数も増えるようにしたい。ちょうどいい下記の記事を見つけました。

実装

参考サイトのプログラムを利用しています。ただ、ReactivePropertyは使用しないので、.Valueは一旦消しています。

<customgrid:CustomGrid x:Name="gridMain" 
                       GridColumnCount="{Binding GridColumnCount}"
                       ColumnDefinitionWidth="0"
                       GridRowCount="{Binding GridRowCount}"
                       RowDefinitionHeight="0"/>
public MainWindow()
{
    InitializeComponent();

    gridMain.GridRowCount = 3;
    gridMain.GridColumnCount = 4;
    gridMain.ShowGridLines = true;
}

実行結果

分かりやすようにShowGridLines = trueにして線を表示しています。
image.png

Grid内にボタンを追加

ボタンを動的に追加していきます。

実装

public MainWindow()
{
    InitializeComponent();

    gridMain.GridRowCount = 3;
    gridMain.GridColumnCount = 4;
    gridMain.ShowGridLines = true;

    int count = 1;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            Button MyControl = new Button();
            MyControl.Content = count.ToString();
            MyControl.Name = "Button" + count.ToString();
            MyControl.Click += new RoutedEventHandler(Button_Click);
            Grid.SetColumn(MyControl, j);
            Grid.SetRow(MyControl, i);

            gridMain.Children.Add(MyControl);

            count++;
        }
    }
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button b = (Button)sender;
    MessageBox.Show(b.Name);
}

実行結果

MacのWineskinServer上に持っていって動かしてみました。
スクリーンショット 2022-06-27 2.41.02.png

最後に

メッセージボックスの代わりにプロセス起動させれば、対象のアプリケーションが動くようになります。

Process p = Process.Start("C:/Program Files/aviutl110/aviutl.exe");

これから少しずつアプリケーションの登録設定や見た目や常駐化などを付け加えていきます。
自分のWineskinServer環境が悪かったとしても、それで動けば他の人の環境でも問題なく動くだろうと思って頑張ります。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2