Chapter 37

ステップ10-2: 続き

Apterygiformes-zenn
Apterygiformes-zenn
2022.01.27に更新

プロジェクトの作成

1)

今度は同じアプリをWindows App SDKWinUI 3で作成します。
WinUI 3Windows 10以降で利用できます。WPFWindows 10より前のOSでも利用可能です。
興味がない人はこのステップ10-2を読み飛ばしてかまいません。

まずはWindows App SDKをインストールします。

2)

ワークロードの.NET デスクトップ開発はインストール済みのはずなので変更は不要です。

以下のサイトのVersion:1.0 安定行の、
ダウンロード拡張機能 (VSIX):C# Visual Studio 2022 拡張機能リンクを選択してダウンロードします。

https://docs.microsoft.com/ja-jp/windows/apps/windows-app-sdk/downloads

Visual Studioがすべて終了していることを確認し、ダウンロードしたファイルを起動します。

チェックボックスにチェックが入っていることを確認し、Modifyボタンを押します。

インストールが完了したらCloseボタンで閉じます。

以下のサイトのVersion:1.0 安定行の、
インストーラーと MSIX パッケージ:インストーラーと MSIX パッケージのダウンロードリンクを選択してダウンロードします。

https://docs.microsoft.com/ja-jp/windows/apps/windows-app-sdk/downloads

ダウンロードしたファイルを右クリックし、すべて展開を選択します。

スタートボタンを右クリックし、Windows ターミナル (管理者)を選択します。

zip展開したWindowsAppSDK-Installer-x64フォルダのWindowsAppRuntimeInstall.exeをWindowsターミナルで実行します。
All install operations successful.と表示されれば成功です。

3)

Visual Studio 2022を起動します。
新しいプロジェクトの作成でプロジェクトの種類にWinUIを選択し、
空のアプリ、パッケージ化 (デスクトップの WinUI 3)を選択し、
次へボタンを押します。

プロジェクト名にConsoleGUI_2を入力して作成ボタンを押します。

↓↓↓↓↓

4)

ソリューションエクスプローラーでプロジェクトをダブルクリックします。
PropertyGroupタグの中に以下を追加します。

<Nullable>enable</Nullable>
<WindowsPackageType>None</WindowsPackageType>

TargetFrameworkが.NET 6以降になっていることも確認します。

ソリューションエクスプローラーでPackage.appxmanifestを削除します。

ソリューションを右クリックし、ソリューションの NuGet パッケージの管理を選択します。

更新があればアップデートしておきます。

App.xaml.csを開き、OnLaunchedメソッドのm_windowActivateメソッド呼び出しに?を付け、
m_window定義の型のWindow?を付けます。

ソリューションエクスプローラーでPropertiesフォルダの中のlaunchSettings.jsonを開き、
(Package)の項目を削除します。

↓↓↓↓↓

launchSettings.jsonを保存します。

デバッグ実行のボタンが Unpackaged になっていることを確認します。

デバッグ実行してみます。
起動できました。

Releaseモードに変更してメニューのビルド > ソリューションのリビルドを選択します。

exeを直接起動してみます。

ファイルサイズはこのくらいです。

モードをDebugに戻しておきます。

画面の作成

App.xamlOther app resources hereの下に以下を定義します。

<!-- ボタンの既定スタイル -->
<Style TargetType="Button">
    <Setter Property="Margin"
            Value="10,10,0,10" />
    <Setter Property="Padding"
            Value="20,5" />
</Style>

MainWindow.xamlStackPanelを削除します。

tagと入力し、

TABキーを押します。

Enterを2回押します。

tagと入力してTABキーを押します。

開始タグの部分が選択されている状態のままGrid.RowDefinitionsと入力し、Enterを数回押します。

Grid.RowDefinitionsタグの中でrdと入力し、

TABキーを押します。

Heightの設定値が選択されている状態のままAutoと入力します。

Enterを2回押します。

rdと入力し、TABキーを押し、Enterを押します。

Gridの中に以下を入力します。

<StackPanel Orientation="Horizontal">
    <Button x:Name="IpConfigButton"
            Content="ipconfig"
            Click="IpConfigButton_Click" />
    <Button Content="Button" />
    <Button Content="Button" />
</StackPanel>

<!-- コマンド実行結果 -->
<TextBox x:Name="CmdResult"
            Grid.Row="1"
            Margin="10,0,10,10"
            Padding="5"
            AcceptsReturn="True"
            IsReadOnly="True"
            FontFamily="BIZ UDGothic" />

ロジックの作成

ipconfigボタンのClickイベント、IpConfigButton_Clickの部分にテキストカーソルを置いてF12キーを押します。

myButton_Clickの処理は丸ごと削除します。
IpConfigButton_Clickに以下を書きます。

try
{
    IpConfigButton.IsEnabled = false;

    var psi = new ProcessStartInfo()
    {
        // 起動するアプリケーション
        FileName = "ipconfig.exe",
        // コマンドライン引数
        Arguments = "/all",
        // プロセス用の新しいウィンドウを作成せずにプロセスを起動するか
        CreateNoWindow = true,
        // プロセスの起動にOSのシェルを使用するかどうか
        UseShellExecute = false,
        // アプリケーションのテキスト出力を StandardOutput ストリームに書き込むか
        RedirectStandardOutput = true,
    };

    // コマンド実行
    Process? cmdProcess = Process.Start(psi);
    if (cmdProcess is null)
    {
        return;
    }
    // 標準出力読み取り
    string? output = await cmdProcess.StandardOutput.ReadToEndAsync();

    CmdResult.Text = output;
}
catch (Exception ex)
{
    var dlg = new ContentDialog
    {
        Title = "エラー",
        Content = ex.ToString(),
        CloseButtonText = "OK",
    };
    dlg.XamlRoot = Content.XamlRoot;
    // エラーメッセージ表示
    await dlg.ShowAsync();
}
finally
{
    IpConfigButton.IsEnabled = true;
}

IpConfigButton_Clickasyncを付け足します。

実行

実行してみます。