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