23

WPF アプリケーション全体で Enter キーを Tab キーとして解釈したい、つまり、ユーザーが Enter キーを押したときにアプリケーションのどこでも、ボタンがフォーカスされている場合を除いて、次のフォーカス可能なコントロールにフォーカスしたい。アプリケーションライフサークルでそれを行う方法はありますか? 誰かが私に例を挙げてもらえますか?
どうもありがとう!

4

5 に答える 5

39

必要に応じて、私のEnterKeyTraversal 添付プロパティコードを使用できます。これを WPF ウィンドウの最上位コンテナーに追加すると、内部のすべてがタブとして扱われます。

<StackPanel my:EnterKeyTraversal.IsEnabled="True">
    ...
</StackPanel>
于 2009-05-16T04:06:34.640 に答える
4

XAML の特定の要素 (ボタン、コンボボックス、または Enter キー トラバーサルを無視したいもの) に FrameworkElement.Tag (値は IgnoreEnterKeyTraversal) を追加することで、woodyiii の問題を回避しました。次に、添付プロパティでこのタグと値を探しました。そのようです:

    if (e.Key == Key.Enter)
    {
        if (ue.Tag != null && ue.Tag.ToString() == "IgnoreEnterKeyTraversal")
        {
            //ignore
        }
        else
        {
            e.Handled = true;
            ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        }
    }
于 2011-01-21T18:51:32.843 に答える
0

woodyiii、UIElement呼び出された関数にはPredictFocus()、その名前でその関数がわかっている関数があり、その要素が有効かどうかを確認して、フォーカスをそれに移動するかどうかを確認できます...

于 2010-09-04T12:45:54.247 に答える
0

Matt Hamilton のコードは、彼のサイトが明らかにダウンしているため、誰かが疑問に思っている場合です。

public class EnterKeyTraversal
{
    public static bool GetIsEnabled(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsEnabledProperty);
    }

    public static void SetIsEnabled(DependencyObject obj, bool value)
    {
        obj.SetValue(IsEnabledProperty, value);
    }

    static void ue_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        var ue = e.OriginalSource as FrameworkElement;

        if (e.Key == Key.Enter)
        {
            e.Handled = true;
            ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        }
    }

    private static void ue_Unloaded(object sender, RoutedEventArgs e)
    {
        var ue = sender as FrameworkElement;
        if (ue == null) return;

        ue.Unloaded -= ue_Unloaded;
        ue.PreviewKeyDown -= ue_PreviewKeyDown;
    }

    public static readonly DependencyProperty IsEnabledProperty =
        DependencyProperty.RegisterAttached("IsEnabled", typeof(bool),

        typeof(EnterKeyTraversal), new UIPropertyMetadata(false, IsEnabledChanged));

    static void IsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var ue = d as FrameworkElement;
        if (ue == null) return;

        if ((bool)e.NewValue)
        {
            ue.Unloaded += ue_Unloaded;
            ue.PreviewKeyDown += ue_PreviewKeyDown;
        }
        else
        {
            ue.PreviewKeyDown -= ue_PreviewKeyDown;
        }
    }
}
于 2020-02-22T16:53:05.260 に答える