「Avalonia UI - ダイアログ」の版間の差分

ナビゲーションに移動 検索に移動
224行目: 224行目:
AutomationProperties.NameやAutomationProperties.HelpTextを使用して、スクリーンリーダーのサポートを改善する。<br>
AutomationProperties.NameやAutomationProperties.HelpTextを使用して、スクリーンリーダーのサポートを改善する。<br>
<br>
<br>
==== 使用例 ====
==== 使用例 1 ====
以下の例では、Avalonia UIを使用してカスタムメッセージボックスを定義している。<br>
以下の例では、Avalonia UIを使用してカスタムメッセージボックスを定義している。<br>
<br>
<br>
259行目: 259行目:
       // [OK]ボタンがクリックされた時にウインドウを閉じるイベントハンドラを設定
       // [OK]ボタンがクリックされた時にウインドウを閉じるイベントハンドラを設定
       this.FindControl<Button>("OK").Click += (sender, args) => Close();
       this.FindControl<Button>("OK").Click += (sender, args) => Close();
    }
}
</syntaxhighlight>
<br>
==== 使用例 2 ====
以下の例では、Avalonia UIを使用して、カスタムメッセージボックスにアイコン、イメージ、複数のボタンを追加・定義している。<br>
<br>
* アイコンおよびイメージの追加
*: MessageBoxIcon enumを使用して、情報、警告、エラー、質問のアイコンを選択することができる。
*: アイコンはGrid内の左側に配置される。
*: アイコン画像は、"avares://"URIを使用して参照される。
*: 実際の使用時には、プロジェクト内の正しいパスに画像ファイルを配置する必要がある。
*: <br>
* 複数のボタンの追加
*: MessageBoxButton enumを使用して、OK、OKCancel、YesNo、YesNoCancelのボタン構成を選択することができる。
*: ボタンはStackPanel内に動的に追加されて、右下に配置される。
*: 各ボタンにはクリックイベントハンドラが設定され、適切な結果 (true、false、null) を返す。
<br>
<syntaxhighlight lang="c#">
using Avalonia;
using Avalonia.Controls;
using Avalonia.Layout;
using Avalonia.Media.Imaging;
using System;
using System.Threading.Tasks;
public class CustomMessageBox : Window
{
    public enum MessageBoxButton
    {
      OK,
      OKCancel,
      YesNo,
      YesNoCancel
    }
    public enum MessageBoxIcon
    {
      None,
      Information,
      Warning,
      Error,
      Question
    }
    private TaskCompletionSource<bool?> _resultTcs;
    public CustomMessageBox()
    {
      this.InitializeComponent();
    }
    private void InitializeComponent()
    {
      Title = "Message";
      SizeToContent = SizeToContent.WidthAndHeight;
      MinWidth  = 300;
      MinHeight = 100;
    }
    public static Task<bool?> Show(Window owner, string message, string title = "Message",
                                  MessageBoxButton buttons = MessageBoxButton.OK, MessageBoxIcon icon = MessageBoxIcon.None)
    {
      var messageBox = new CustomMessageBox
      {
          Title = title
      };
      var grid = new Grid
      {
          ColumnDefinitions = new ColumnDefinitions("Auto,*"),
          RowDefinitions = new RowDefinitions("*,Auto")
      };
      // アイコンの指定
      if (icon != MessageBoxIcon.None)
      {
          var iconImage = new Image
          {
            Width  = 32,
            Height = 32,
            Margin = new Thickness(10),
            VerticalAlignment = VerticalAlignment.Top
          };
          string iconPath = icon switch
          {
            MessageBoxIcon.Information => "avares://YourAssemblyName/Assets/information.png",
            MessageBoxIcon.Warning => "avares://YourAssemblyName/Assets/warning.png",
            MessageBoxIcon.Error => "avares://YourAssemblyName/Assets/error.png",
            MessageBoxIcon.Question => "avares://YourAssemblyName/Assets/question.png",
                _ => throw new ArgumentOutOfRangeException(nameof(icon))
          };
          iconImage.Source = new Bitmap(iconPath);
          Grid.SetColumn(iconImage, 0);
          Grid.SetRow(iconImage, 0);
          grid.Children.Add(iconImage);
      }
      // メッセージを指定
      var messageTextBlock = new TextBlock
      {
          Text        = message,
          TextWrapping = Avalonia.Media.TextWrapping.Wrap,
          Margin = new Thickness(10)
      };
      Grid.SetColumn(messageTextBlock, 1);
      Grid.SetRow(messageTextBlock, 0);
      grid.Children.Add(messageTextBlock);
      // ボタンの指定
      var buttonPanel = new StackPanel
      {
          Orientation        = Orientation.Horizontal,
          HorizontalAlignment = HorizontalAlignment.Right,
          Margin = new Thickness(0, 10, 10, 10)
      };
      void AddButton(string content, bool? dialogResult)
      {
          var button = new Button { Content = content, MinWidth = 60, Margin = new Thickness(5, 0, 0, 0) };
          button.Click += (_, __) =>
          {
            messageBox._resultTcs.SetResult(dialogResult);
            messageBox.Close();
          };
          buttonPanel.Children.Add(button);
      }
      switch (buttons)
      {
          case MessageBoxButton.OK:
              AddButton("OK", true);
              break;
          case MessageBoxButton.OKCancel:
              AddButton("OK", true);
              AddButton("Cancel", false);
              break;
          case MessageBoxButton.YesNo:
              AddButton("Yes", true);
              AddButton("No", false);
              break;
          case MessageBoxButton.YesNoCancel:
              AddButton("Yes", true);
              AddButton("No", false);
              AddButton("Cancel", null);
              break;
      }
      Grid.SetColumn(buttonPanel, 1);
      Grid.SetRow(buttonPanel, 1);
      grid.Children.Add(buttonPanel);
      messageBox.Content = grid;
      messageBox._resultTcs = new TaskCompletionSource<bool?>();
      if (owner != null)
      {
          messageBox.ShowDialog(owner);
      }
      else
      {
          messageBox.Show();
      }
      return messageBox._resultTcs.Task;
     }
     }
  }
  }

案内メニュー