Как поддерживать боковую прокрутку с помощью трекпада / колеса горизонтальной прокрутки?

У меня есть SciChartSurface, где я поддерживаю масштабирование следующим образом:

  • Масштабирование оси x при обычной прокрутке.
  • Масштабировать ось Y при прокрутке + CTRL
  • Панорамировать ось X при прокрутке + Shift

Я также хотел бы включить панорамирование в направлении X, когда пользователь либо прокручивает горизонтальную прокрутку на трекпаде, либо использует колесо горизонтальной прокрутки (колесо большого пальца). Однако я не уверен, как это сделать.

Вот расширенный MouseWheelZoomModifier, который я использовал. Могу ли я как-то отправить ему информацию о моем поведении прокрутки? Могу ли я как-то рассматривать боковую/горизонтальную прокрутку как Shift + прокрутка? Спасибо!

/// <summary>
/// Extended <see cref="MouseWheelZoomModifier"/> which modifies zoom
/// behavior based on modifier keys so that scrolling while holding CTRL 
/// zooms vertically and doing so while holding SHIFT pans horizontally.
/// </summary>
class MouseWheelZoomModifierEx : MouseWheelZoomModifier {
    public override void OnModifierMouseWheel(ModifierMouseArgs e) {
        switch (e.Modifier) {
            case MouseModifier.Ctrl:
                ActionType = ActionType.Zoom;
                XyDirection = XyDirection.YDirection;
                break;
            case MouseModifier.Shift:
                ActionType = ActionType.Pan;
                XyDirection = XyDirection.XDirection;
                break;
            default:
                ActionType = ActionType.Zoom;
                XyDirection = XyDirection.XDirection;
                break;
        }

        // e.Modifier is set to None so that the base implementation of 
        // OnModifierMouseWheel doesn't change ActionType and XyDirection again.
        e.Modifier = MouseModifier.None;
        base.OnModifierMouseWheel(e);
    }
}

person paul.frivold    schedule 29.06.2017    source источник


Ответы (1)


В SciChart вы можете добавить любое пользовательское поведение масштабирования и панорамирования, используя API ChartModifierBase.

Помимо стандартных методов, которые вы можете переопределить (например, OnModifierMouseWheel, OnModifierMouseDown, OnModifierMouseUp), вы также можете подписаться на события непосредственно на ParentSurface.

Взгляните на эту статью базы знаний: Пользовательские модификаторы диаграммы — Часть 2 — Пользовательский ZoomPanModifier и масштабирование при нажатии клавиши.

Актуальный сопровождающий исходный код находится здесь .

Поэтому я предлагаю взять SimpleZoomInOutModifier и изменить его, чтобы он реагировал на события колесика мыши, а не на ключевые события.

Это помогает?

person Dr. Andrew Burnett-Thompson    schedule 29.06.2017
comment
Спасибо за быстрый и полезный ответ! Это кажется хорошим решением, однако я обнаружил, что моя основная проблема заключается в том, что событие горизонтальной прокрутки мыши нигде не регистрируется в приложении... Мне просто нужно провести еще несколько исследований. Обновлю этот пост, если найду ответ. - person paul.frivold; 01.07.2017
comment
Привет, Пол, в примере выше, которым я поделился, мы подключаемся к событиям нажатия клавиш, которые не подписаны в приложении. Вы можете использовать ту же технику для горизонтального колесика мыши. С уважением, Эндрю - person Dr. Andrew Burnett-Thompson; 01.07.2017
comment
В этой статье базы знаний я имею в виду SimpleZoomInOutModifier. support.scichart.com/index.php?/Knowledgebase/Article/View/ Обратите внимание, как мы подписываемся на ключевые события в родительском окне. Вы можете сделать то же самое с горизонтальным колесиком мыши. - person Dr. Andrew Burnett-Thompson; 01.07.2017
comment
К сожалению, я изо всех сил пытаюсь найти событие Horizonal Mouse Wheel в родительском окне, а не только в scchart. - person paul.frivold; 02.07.2017
comment
Как подписаться на события горизонтальной прокрутки в WPF звучит как тема другого вопроса Stackoverflow;) codeproject.com/Articles/220255/ - person Dr. Andrew Burnett-Thompson; 02.07.2017