C#のWPFでフォーカスを移動する

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        … 下側のコントロールへ