Я хочу интерпретировать Enter key как клавишу Tab во всем моем приложении WPF, то есть везде в моем приложении, когда пользователь нажимает Enter. Я хочу сфокусировать следующий настраиваемый элемент управления, за исключением случаев, когда кнопка сфокусирована. Есть ли способ сделать это в круге жизненного цикла приложения? Может ли кто-нибудь привести мне пример?
Большое спасибо!
Интерпретировать ввод как вкладку WPF
Ответ 1
Вы можете использовать мой код приложения EnterKeyTraversal, если хотите. Добавьте его в контейнер верхнего уровня в окне WPF, и все внутри будет обрабатывать ввод как вкладку:
<StackPanel my:EnterKeyTraversal.IsEnabled="True">
...
</StackPanel>
Ответ 2
Чтобы изменить его во всем проекте, вам нужно сделать это
-
В 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)); } }
-
Compile. И сделал это. Теперь вы можете использовать ввод как вкладку. Примечание: Эта работа для элементов в сетке
Ответ 3
Я столкнулся с проблемой woodyiii, добавив в свой XAML файл FrameworkElement.Tag(значение которого IgnoreEnterKeyTraversal) для определенных элементов (кнопок, comboboxes или чего-то, что я хочу игнорировать обход ключа ввода). Затем я искал этот тег и значение в прикрепленном свойстве. Например:
if (e.Key == Key.Enter)
{
if (ue.Tag != null && ue.Tag.ToString() == "IgnoreEnterKeyTraversal")
{
//ignore
}
else
{
e.Handled = true;
ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}
Ответ 4
woodyiii. В UIElement
есть функция PredictFocus()
, которая по имени знает свою функцию, тогда вы можете проверить, включен ли этот элемент или нет, чтобы переместить фокус на него или нет...