У меня есть приложение WPF, где я определил пользовательские команды, которые используют ключевые жесты Ctrl + ← и Ctrl + →. Мое окно имеет a TextBox
и a ScrollViewer
и когда TextBox
фокусируется Ctrl + ← и Ctrl + → перемещают курсор в начало следующего или предыдущего слова, которое прекрасно.
Но на ScrollViewer
это заставляет горизонтальную прокрутку переместиться, как будто я нажал просто ← или →. Что самый легкий путь состоит в том, чтобы позволить Ctrl + ← и Ctrl + → события пузыриться от моего ScrollViewer
к Окну, где Command
определяется?
Итак, я получил эту работу, выполнив следующие действия
public class MyScrollViewer : ScrollViewer
{
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyboardDevice.Modifiers == ModifierKeys.Control)
{
if (e.Key == Key.Left || e.Key == Key.Right)
return;
}
base.OnKeyDown(e);
}
}
Я думаю, уловка состоит в том, чтобы понять, что событие начинается сверху и работает снизу. Затем на обратном пути каждый «слой» проверяет логическое значение Handled, и, если оно не установлено в true, оно определяет, будет ли он что-то делать, и устанавливает его, если это так. Мне нужно было сократить это поведение для моих ярлыков, чтобы Handled по-прежнему был ложным, когда он вернулся на уровень окна.
Вы должны переопределить событие ScrollViewer
PreviewKeyDown
и установить e. Handled = true
и передайте событие родителю, используя что-то вроде (this.Parent as FrameworkElement).RaiseEvent(e);
если нажатые клавиши были одной из комбинаций клавиш, которые вы назначили своим командам.