XAMLを使わないWPF入門11「1行入力ダイアログボックス」

コンピュータ

文字を入力するためのダイアログボックスを作成してみます。

プロジェクトの作成

cd (mkdir NoXAML12)
dotnet new wpf -f net8.0
rm *.xaml
rm MainWindow.xaml.cs

ソースコード

ファイル名:NoXAML12.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>NoXAML12.App</StartupObject>
  </PropertyGroup>

</Project>

ファイル名:App.xaml.cs

using System.Windows;

namespace NoXAML12;

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

ファイル名:MainWindow.cs

using System.Windows;
using System.Windows.Controls;

namespace NoXAML12;
public class MainWindow : Window
{
    public MainWindow()
    {
        Title = "入力ダイアログテスト";
        Width = 400;
        Height = 200;

        var button = new Button
        {
            Content = "名前を入力",
            Width = 120,
            Height = 30,
            HorizontalAlignment = HorizontalAlignment.Center,
            VerticalAlignment = VerticalAlignment.Center
        };

        button.Click += (_, _) =>
        {
            string? input = ShowInputDialog("あなたの名前を入力してください:");
            if (!string.IsNullOrWhiteSpace(input))
            {
                MessageBox.Show($"こんにちは、{input}さん!");
            }
        };

        Content = button;
    }

    public static string? ShowInputDialog(string prompt)
    {
        var window = new Window
        {
            Title = "入力",
            Width = 300,
            Height = 120,
            WindowStartupLocation = WindowStartupLocation.CenterOwner,
            ResizeMode = ResizeMode.NoResize,
            WindowStyle = WindowStyle.ToolWindow,
            Owner = Application.Current?.MainWindow
        };

        var stack = new StackPanel { Margin = new Thickness(10) };
        var label = new TextBlock { Text = prompt };
        var textBox = new TextBox { Margin = new Thickness(0, 5, 0, 5) };
        var button = new Button
        {
            Content = "OK",
            IsDefault = true,
            Width = 60,
            HorizontalAlignment = HorizontalAlignment.Right
        };

        button.Click += (_, _) => window.DialogResult = true;

        stack.Children.Add(label);
        stack.Children.Add(textBox);
        stack.Children.Add(button);
        window.Content = stack;

        bool? result = window.ShowDialog();
        return result == true ? textBox.Text : null;
    }
}

実行

dotnet run

・「名前を入力」のボタンを押す。

・1行入力のダイアログボックスが表示されるので入力する。

・入力した文字列が反映されたメッセージボックスが表示される。

コメント

  1. sheephuman より:

    これじゃWinformと変わんないな(笑)
    動的生成で作るときにこういうの書いたりするけど

    • 八 四 より:

      View部分をXAML抜きで書くと、ほとんどWinformになりますね。サクッと書けて、これはこれで良いのではないかと思います。