はじめに
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
にして線を表示しています。
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上に持っていって動かしてみました。
最後に
メッセージボックスの代わりにプロセス起動させれば、対象のアプリケーションが動くようになります。
Process p = Process.Start("C:/Program Files/aviutl110/aviutl.exe");
これから少しずつアプリケーションの登録設定や見た目や常駐化などを付け加えていきます。
自分のWineskinServer環境が悪かったとしても、それで動けば他の人の環境でも問題なく動くだろうと思って頑張ります。