Сделайте так, чтобы scrollviewer не захватывал управление влево и управление вправо в WPF - PullRequest
6 голосов
/ 21 июня 2010

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

Но на ScrollViewer горизонтальная прокрутка перемещается так, как если бы я нажал только или.Как проще всего позволить Ctrl + и Ctrl + всплыть из моего ScrollViewer в окногде определяется Command?

Ответы [ 2 ]

6 голосов
/ 22 июня 2010

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

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

3 голосов
/ 21 июня 2010

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

...