解释输入标签WPF

时间:2009-05-16 03:27:35

标签: wpf keyboard-input

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

5 个答案:

答案 0 :(得分:37)

如果您愿意,可以使用我的EnterKeyTraversal attached property代码。将其添加到WPF窗口的顶级容器中,内部的所有内容都将输入为tab:

<StackPanel my:EnterKeyTraversal.IsEnabled="True">
    ...
</StackPanel>

答案 1 :(得分:4)

我通过在XAML中向某些元素(按钮,组合框或任何我想忽略的输入键遍历)添加FrameworkElement.Tag(其值为IgnoreEnterKeyTraversal)来解决woodyiii的问题。然后我找了这个标签&amp;附属物的价值。像这样:

    if (e.Key == Key.Enter)
    {
        if (ue.Tag != null && ue.Tag.ToString() == "IgnoreEnterKeyTraversal")
        {
            //ignore
        }
        else
        {
            e.Handled = true;
            ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        }
    }

答案 2 :(得分:4)

要在整个项目中更改它,您需要执行此操作

  • 在App.xaml.cs中:

    protected override void OnStartup(StartupEventArgs e)
    {           
        EventManager.RegisterClassHandler(typeof(Grid), Grid.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));
        }
    }
    
  • 编译。 并完成了它。现在您可以使用enter like tab。 注意:此工作适用于网格中的元素

答案 3 :(得分:0)

woodyiii,UIElement中有一个名为PredictFocus()的函数,通过其名称知道它的功能,然后你可以检查是否启用了该元素,以便将焦点移动到它或不...

答案 4 :(得分: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;
        }
    }
}