WPFでTextBox内で上下キーでフォーカスを遷移
WPFでTextBoxにフォーカスが当たっているときに上下キーを押すとフォーカスを遷移できる仕組みを実装していた。
xamlにはTextBoxが複数並べた。
そのTextBoxにはKeyUpのイベントハンドラを設定している。
<TextBox HorizontalAlignment="Left" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" KeyUp="TextBox_KeyUpEvent"/>
コードビハインドでは以下のように設定を追加してみた。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp1 { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void TextBox_KeyUpEvent(object sender, KeyEventArgs e) { if (e.Key == Key.Down) { var direction = FocusNavigationDirection.Next; (FocusManager.GetFocusedElement(this) as FrameworkElement)?.MoveFocus(new TraversalRequest(direction)); } else if (e.Key == Key.Up) { var direction = FocusNavigationDirection.Previous; (FocusManager.GetFocusedElement(this) as FrameworkElement)?.MoveFocus(new TraversalRequest(direction)); } } } }
FocusNavigationDirection.Nextとか,FocusNavigationDirection.Previousとかはよいが,?を使った書法は参考ページにあったものだが,珍しい書き方だったので引用してしまった。
もし私がコーディングしたら以下のようになる(かな)
private void TextBox_KeyUpEvent(object sender, KeyEventArgs e) { if (e.Key == Key.Down) { var direction = FocusNavigationDirection.Next; FrameworkElement element = (FrameworkElement)FocusManager.GetFocusedElement(this); if (element != null) element.MoveFocus(new TraversalRequest(direction)); } else if (e.Key == Key.Up) { var direction = FocusNavigationDirection.Previous; FrameworkElement element = (FrameworkElement)FocusManager.GetFocusedElement(this); if (element != null) element.MoveFocus(new TraversalRequest(direction)); } }