6.8 アクセステキスト
6.8.1 アクセスキー
通常のアプリケーションのコントロールは、マウスからではなく、キーボードからも操作することができるようにアクセスキーが割り当てられています。例えば、ボタンコントロールはマウスのクリックだけに依存するべきではありません。マウスが接続されていない環境も考慮し、キーボードの何らかのキーとボタンを関連付けて、キーボードからもボタンを押せるように設計するべきです。
多くの Windows のボタンやメニュー項目には、アクセスキーが設定されています。アクセスキーが設定されているコントロールは、キーを表すアンダーライン付きのアルファベットが表示されています。日本語環境で一般的なメニューに「ファイル(F)」「編集(E)」などがありますが、これらのアンダーライン付きのアルファベットはアクセスキーを表しています。
アクセスキーを持つコントロールは、Alt + キーで対象のボタンを押すことができます。例えば「ファイル(F)」というメニュー項目は Alt + F キーを押すことでクリックすることができます。
アクセスキーを表示させるには 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
このクラスのオブジェクトを、ボタンやメニュー項目のコンテンツとして設定することで、アクセスキー付きのテキストを表示することができます。アクセスキー以外は、通常のテキストと変わりません。
このクラスのコンストラクタは、パラメータを受け取りません。
public AccessText ()
AccessTest オブジェクトに、アクセスキー付きの任意のテキストを設定するには Text プロパティを使います。
public string Text { get; set; }
Text プロパティには、アクセスキー付きのテキストを表す任意の文字列を設定することができます。この文字列の中で最初に出現したアンダーライン _ の次の 1 文字が対象のアクセスキーとなります。例えば、F をアクセスキーとする「ファイル(F)」ボタンを作りたい場合、AccessText オブジェクトの Text プロパティに "ファイル(_F)" という文字列を設定することになります。
AccessKey オブジェクトに設定されているアクセスキーを取得したい場合は 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は、アクセスキー付きのボタンを表示するプログラムです。「次へ(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 クラスのオブジェクトを生成する必要はありません。