C#のWPFで狙ったコントロールにフォーカスを当てる方法について解説します。
ウィンドウを開いたときのデフォルトフォーカス
ウィンドウを開いたとき、特定のコントロールにフォーカスを当てたい場合はXAMLから指定できます。
<Window x:Class="WpfTest1.TestWindow1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfTest1" mc:Ignorable="d" Title="TestWindow1" Height="300" Width="300" FocusManager.FocusedElement="{Binding ElementName=SampleTextBox}"> <StackPanel Margin="50"> <TextBox x:Name="SampleTextBox"/> </StackPanel> </Window>
最初にフォーカスを当てたいコントロールに名前を付けます。(11行目)
Windowのプロパティ「FocusManager.FocusedElement」にフォーカスを当てるコントロールをバインディングします。BindingでElementNameを使ってコントロール名を指定すればOKです。(9行目)
コードから特定のコントロールにフォーカスを移動
コードからコントロールにフォーカスを移動させるには Focusメソッドを使います。
public partial class TestWindow1 : Window { public TestWindow1() { InitializeComponent(); SampleTextBox.Focus(); //←フォーカスを設定してる } }
XAMLでコントロールに名前を付けていれば、その名前でコントロールにアクセスできます。
コントロールのFocusメソッドを呼び出せば、そのコントロールにフォーカスが移動します。
コードから次のコントロールにフォーカスを移動
タブキーを押すとフォーカスが次々に移動していきますよね。
そのような動きをコードから制御することができます。
例えば、テキストボックスでEnterキーが押されたら次のコントロールにフォーカスを移動させる場合は以下のようなコードで実現できます。
<StackPanel Margin="50"> <TextBox KeyDown="TextBox_KeyDown"/> </StackPanel>
private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { if (e.Key == Key.Enter) { var request = new TraversalRequest(FocusNavigationDirection.Next); var element = (FrameworkElement)sender; element.MoveFocus(request); } }
キーダウンイベントでは引数senderにイベントを発生させたコントロールが入ってきます。
コントロールのMoveFocusメソッドを呼び出して、そのコントロールを基準に任意の方向へフォーカスを移動できます。
MoveFocusメソッドへ渡す変数はTraversalRequestクラスです。
TraversalRequestクラスのコンストラクタで移動させる方向が指定できます。
- FocusNavigationDirection.Next … 次のコントロールへ
- FocusNavigationDirection.Previous … 前のコントロールへ
- FocusNavigationDirection.First … 最初のコントロールへ
- FocusNavigationDirection.Last … 最後のコントロールへ
- FocusNavigationDirection.Left … 左側のコントロールへ
- FocusNavigationDirection.Right … 右側のコントロールへ
- FocusNavigationDirection.Up … 上側のコントロールへ
- FocusNavigationDirection.Down … 下側のコントロールへ
コメントをお書きください