23

我想在我的整个 WPF 应用程序中将 Enter 键解释为 Tab 键,也就是说,当用户按下 Enter 时,我的应用程序中的任何地方我都想关注下一个可聚焦的控件,除非按钮被聚焦。在应用程序生命周期中有没有办法做到这一点?谁能给我一个例子?
非常感谢!

4

5 回答 5

39

如果您愿意,可以使用我的EnterKeyTraversal 附加属性代码。将其添加到 WPF 窗口的顶级容器中,其中的所有内容都将 enter 视为选项卡:

<StackPanel my:EnterKeyTraversal.IsEnabled="True">
    ...
</StackPanel>
于 2009-05-16T04:06:34.640 回答
8

基于 Richard Aguirre 的回答,它比所选的易于使用的答案更好,恕我直言,您可以通过简单地将 Grid 更改为 UIElement 来使其更通用。

要在整个项目中更改它,您需要这样做

  • 在 App.xaml.cs 中:

     protected override void OnStartup(StartupEventArgs e)
     {           
         EventManager.RegisterClassHandler(typeof(UIElement), UIElement.PreviewKeyDownEvent, new KeyEventHandler(Grid_PreviewKeyDown));
         base.OnStartup(e);
     }
    
     private void Grid_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
     {
         var uie = e.OriginalSource as UIElement;
    
         if (e.Key == Key.Enter)
         {
             e.Handled = true;
             uie.MoveFocus(
             new TraversalRequest(
             FocusNavigationDirection.Next));
         }
     }
    
  • 编译。并做到了。现在你可以使用像标签一样的输入。注意:这适用于网格中的元素

于 2016-07-31T21:01:13.197 回答
4

我通过将 FrameworkElement.Tag(其值为 IgnoreEnterKeyTraversal)添加到我的 XAML 中的某些元素(按钮、组合框或任何我想忽略输入键遍历的东西)来解决 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

UIElementwoodyiii,被调用中有一个函数,PredictFocus()其名称知道它的功能,然后您可以检查该元素是否启用,以便将焦点移至它...

于 2010-09-04T12:45:54.247 回答
0

这是马特汉密尔顿的代码,如果有人想知道,因为他的网站显然已经关闭:

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 回答