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

コメント
コメントを投稿