Заставьте scrollviewer не получить вышедший контроль и управление прямо в WPF

У меня есть приложение WPF, где я определил пользовательские команды, которые используют ключевые жесты Ctrl + и Ctrl + . Мое окно имеет a TextBox и a ScrollViewer и когда TextBox фокусируется Ctrl + и Ctrl + перемещают курсор в начало следующего или предыдущего слова, которое прекрасно.

Но на ScrollViewer это заставляет горизонтальную прокрутку переместиться, как будто я нажал просто или . Что самый легкий путь состоит в том, чтобы позволить Ctrl + и Ctrl + события пузыриться от моего ScrollViewer к Окну, где Command определяется?

6
задан Jasper 14 September 2011 в 07:43
поделиться

2 ответа

Итак, я получил эту работу, выполнив следующие действия

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 по-прежнему был ложным, когда он вернулся на уровень окна.

6
ответ дан 10 December 2019 в 02:42
поделиться

Вы должны переопределить событие ScrollViewer PreviewKeyDown и установить e. Handled = true и передайте событие родителю, используя что-то вроде (this.Parent as FrameworkElement).RaiseEvent(e); если нажатые клавиши были одной из комбинаций клавиш, которые вы назначили своим командам.

3
ответ дан 10 December 2019 в 02:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: