我想在我的整个 WPF 应用程序中将 Enter 键解释为 Tab 键,也就是说,当用户按下 Enter 时,我的应用程序中的任何地方我都想关注下一个可聚焦的控件,除非按钮被聚焦。在应用程序生命周期中有没有办法做到这一点?谁能给我一个例子?
非常感谢!
问问题
15070 次
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
UIElement
woodyiii,被调用中有一个函数,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 回答