WisdomSoft - for your serial experiences.

6.8 アクセステキスト

入力可能なコントロールのコンテンツにアクセステキストを設定することで、Alt + 任意のキーでコントロールを選択できるようになります。

6.8.1 アクセスキー

通常のアプリケーションのコントロールは、マウスからではなく、キーボードからも操作することができるようにアクセスキーが割り当てられています。例えば、ボタンコントロールはマウスのクリックだけに依存するべきではありません。マウスが接続されていない環境も考慮し、キーボードの何らかのキーとボタンを関連付けて、キーボードからもボタンを押せるように設計するべきです。

多くの Windows のボタンやメニュー項目には、アクセスキーが設定されています。アクセスキーが設定されているコントロールは、キーを表すアンダーライン付きのアルファベットが表示されています。日本語環境で一般的なメニューに「ファイル(F)」「編集(E)」などがありますが、これらのアンダーライン付きのアルファベットはアクセスキーを表しています。

アクセスキーを持つコントロールは、Alt + キーで対象のボタンを押すことができます。例えば「ファイル(F)」というメニュー項目は Alt + F キーを押すことでクリックすることができます。

アクセスキーを表示させるには System.Windows.Controls.AccessText クラスを使います。

System.Windows.Controls.AccessText クラス
System.Object 
   System.Windows.Threading.DispatcherObject 
     System.Windows.DependencyObject 
       System.Windows.Media.Visual 
         System.Windows.UIElement 
           System.Windows.FrameworkElement 
            System.Windows.Controls.AccessText
[ContentPropertyAttribute("Text")] 
public class AccessText : FrameworkElement, IAddChild

このクラスのオブジェクトを、ボタンやメニュー項目のコンテンツとして設定することで、アクセスキー付きのテキストを表示することができます。アクセスキー以外は、通常のテキストと変わりません。

このクラスのコンストラクタは、パラメータを受け取りません。

AccessText クラスのコンストラクタ
public AccessText ()

AccessTest オブジェクトに、アクセスキー付きの任意のテキストを設定するには Text プロパティを使います。

AccessText クラス Text プロパティ
public string Text { get; set; }

Text プロパティには、アクセスキー付きのテキストを表す任意の文字列を設定することができます。この文字列の中で最初に出現したアンダーライン _ の次の 1 文字が対象のアクセスキーとなります。例えば、F をアクセスキーとする「ファイル(F)」ボタンを作りたい場合、AccessText オブジェクトの Text プロパティに "ファイル(_F)" という文字列を設定することになります。

AccessKey オブジェクトに設定されているアクセスキーを取得したい場合は AccessKey プロパティを使います。

AccessText クラス AccessKey プロパティ
public char AccessKey { get; }

このプロパティは、現在のオブジェクトに設定されているアクセスキーの文字を返します。

コード
using System;
using System.Windows;
using System.Windows.Controls;

class Test : Window {
	[STAThread]
	public static void Main() {
		Window wnd = new Test();
		Application app = new Application();
		app.Run(wnd);
	}

	private Label label;
	private Button nextButton, previousButton;

	public Test() {
		label = new Label();
		label.Content = "アクセスキーからボタンを押すことができます";

		AccessText nextKey = new AccessText();
		nextKey.Text = "次へ(_N)";

		AccessText previousKey = new AccessText();
		previousKey.Text = "前へ(_P)";

		nextButton = new Button();
		nextButton.Content = nextKey;
		nextButton.Click += nextButtonClick;

		previousButton = new Button();
		previousButton.Content = previousKey;
		previousButton.Click += previousButtonClick;

		StackPanel panel = new StackPanel();
		panel.Children.Add(label);
		panel.Children.Add(nextButton);
		panel.Children.Add(previousButton);
		
		Content = panel;
	}

	private void nextButtonClick(Object sender, RoutedEventArgs e) {
		label.Content = "「次へ」ボタンが押されました";
	}
	private void previousButtonClick(Object sender, RoutedEventArgs e) {
		label.Content = "「前へ」ボタンが押されました";
	}
}
実行結果
コード1 実行結果

コード1は、アクセスキー付きのボタンを表示するプログラムです。「次へ(N)」ボタンは、カーソルでクリックする以外に Alt + N キーを押すことでも Click イベントを発生させることができます。同様に「前へ(P)」ボタンは Alt + P キーでクリックすることができます。

AccessText オブジェクトを生成してアクセスキー付きのテキストを設定することができますが、これらは必ずしも必要な作業ではありません。AccessText クラスの Text プロパティに設定した文字列と同じものを、コントロールの Content プロパティに設定することで同じ効果を得ることができます。プログラム側で AccessText を統合的に管理しなければならないような場合を除けば、通常の開発では文字列を直接指定する方が簡単です。

nextButton = new Button();
nextButton.Content = "次へ(_N)";
nextButton.Click += nextButtonClick;

previousButton = new Button();
previousButton.Content = "前へ(_P)";
previousButton.Click += previousButtonClick;

実は、コード1のコンストラクタを上記のように書き換えることができます。この方法であれば、AccessText クラスのオブジェクトを生成する必要はありません。