VB のたまご

作成日: 2017/04/06, 更新日: 2017/04/29



エンターキーによるフォーカス遷移

  •  ここでは、Enter キー押下によるフォーカス遷移を学習します。 実現手段は、以下のリンク先を元に作成しています。

  • Stackoverflow
    Enter キー押下によるフォーカス遷移の方法
    Moving to next control on Enter keypress in WPF
    http://stackoverflow.com/questions/8203329/moving-to-next-control-on-enter-keypress-in-wpf
    
    WPF での 修飾キー(Modifier。Shift + A など)の扱い方
    How to detect modifier key states in WPF?
    http://stackoverflow.com/questions/5750722/how-to-detect-modifier-key-states-in-wpf
    
    WPF では KeyDown イベントでは、Enter キー判定ができない(Enter キー押してもイベント発生しない) の対応
    KeyDown EventHandler ignored when pressing 'Enter'
    https://social.msdn.microsoft.com/Forums/vstudio/en-US/84aaf9a5-d88c-4bc9-9ca9-961f98ddae7d/keydown-eventhandler-ignored-when-pressing-enter?forum=wpf
    KeyDown/KeyUp は使わないで、PreviewKeyDown/PreviewKeyUp を使ってね。とのこと
    

  •  それでは見てみましょう。以下は、.NET 標準のアプリケーションで作成してします。

  • <Window x:Class="Window1"
            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:w04_MoveFocusByEnterKey"
            mc:Ignorable="d"
            Title="Window1" Height="350" Width="525">
    
        <StackPanel FocusManager.FocusedElement="{Binding ElementName=button1}">
    
            <Button Name="button1" Content="Enter キー押下によるフォーカス遷移" PreviewKeyDown="Control_PreviewKeyDown" />
            <TextBox PreviewKeyDown="Control_PreviewKeyDown" />
            <TextBox PreviewKeyDown="Control_PreviewKeyDown" />
            <TextBox PreviewKeyDown="Control_PreviewKeyDown" />
    
    
        </StackPanel>
    
    </Window>
    

    ' Stackoverflow
    ' Enter キー押下によるフォーカス遷移の方法
    ' Moving to next control on Enter keypress in WPF
    ' http://stackoverflow.com/questions/8203329/moving-to-next-control-on-enter-keypress-in-wpf
    
    
    ' WPF での 修飾キー(Modifier。Shift + A など)の扱い方
    ' How to detect modifier key states in WPF?
    ' http://stackoverflow.com/questions/5750722/how-to-detect-modifier-key-states-in-wpf
    
    
    ' WPF では KeyDown イベントでは、Enter キー判定ができない(Enter キー押してもイベント発生しない) の対応
    ' KeyDown EventHandler ignored when pressing 'Enter'
    ' https://social.msdn.microsoft.com/Forums/vstudio/en-US/84aaf9a5-d88c-4bc9-9ca9-961f98ddae7d/keydown-eventhandler-ignored-when-pressing-enter?forum=wpf
    ' KeyDown/KeyUp は使わないで、PreviewKeyDown/PreviewKeyUp を使ってね。とのこと
    
    
    
    Public Class Window1
    
        Private Sub Control_PreviewKeyDown(sender As Object, e As KeyEventArgs)
    
            Dim b1 = e.Key = Key.Enter
            Dim b2 = Keyboard.IsKeyDown(Key.LeftShift) OrElse Keyboard.IsKeyDown(Key.RightShift)
    
            If b1 AndAlso Not b2 Then
                Me.MoveNextControl(e)
            ElseIf b1 AndAlso b2 Then
                Me.MovePreviousControl(e)
            End If
    
        End Sub
    
        Private Sub MoveNextControl(e As KeyEventArgs)
    
            Dim direction = FocusNavigationDirection.Next
            Dim request = New TraversalRequest(direction)
            Dim element = TryCast(Keyboard.FocusedElement, UIElement)
    
            If element Is Nothing Then
                Return
            End If
    
            If element.MoveFocus(request) Then
                e.Handled = True
            End If
    
        End Sub
    
        Private Sub MovePreviousControl(e As KeyEventArgs)
    
            Dim direction = FocusNavigationDirection.Previous
            Dim request = New TraversalRequest(direction)
            Dim element = TryCast(Keyboard.FocusedElement, UIElement)
    
            If element Is Nothing Then
                Return
            End If
    
            If element.MoveFocus(request) Then
                e.Handled = True
            End If
    
        End Sub
    
    End Class
    

  •  Enter キーによるフォーカス遷移は、PreviewKeyDown イベントで入力キーを捕まえて、実現しています。 Enter キーだけなら「次のコントロールに遷移」、Shift + Enter キーの組み合わせなら「前のコントロールに遷移」をします。

  •  修飾としての Shift キーが押されているかどうかは、Keyboard クラスの IsKeyDown メソッドで確認します。

  •  現在フォーカスを持つコントロールは、同じく Keyboard クラスの FocusedElement プロパティから取得して、 現在フォーカスを持つコントロールの次(または前、他)のコントロールにフォーカス移動させます。MoveFocus メソッドです。 フォーカス移動の指示は、TraversalRequest クラスが担当します。このクラス内で移動方法を設定します。

  •  このサンプルでは、Shift キーが押されていない場合は、次のコントロールへ(Next)。 Shift キーが押されている場合は、前のコントロールへ(Previous)を指示しています。

  •  フォーカス移動が成功した場合は、e.Handled = True をセットして後続のルーティングイベント発生を抑制します。