WPF InputBinding Ctrl + MWheelUp / Down Возможно? - PullRequest
1 голос
/ 24 ноября 2010

Есть ли способ связать команду с Ctrl+MWheelUp/Down? Вы знаете, в браузере, вы можете сделать то же самое, чтобы увеличить / уменьшить размер шрифта? Я хочу повторить этот эффект в WPF. Возможный? Я смотрел на InputBinding > MouseBindings и MouseAction не поддерживает Mouse Scrolls.

* Кажется, я уже написал похожий вопрос, но больше не могу его найти

Ответы [ 4 ]

6 голосов
/ 27 января 2015

Это можно сделать с помощью очень простого пользовательского MouseGesture:

public enum MouseWheelDirection { Up, Down}

class MouseWheelGesture:MouseGesture
{
    public MouseWheelDirection Direction { get; set; }

    public MouseWheelGesture(ModifierKeys keys, MouseWheelDirection direction)
        : base(MouseAction.WheelClick, keys)
    {
        Direction = direction;
    }

    public override bool Matches(object targetElement, InputEventArgs inputEventArgs)
    {
        var args = inputEventArgs as MouseWheelEventArgs;
        if (args == null)
            return false;
        if (!base.Matches(targetElement, inputEventArgs))
            return false;
        if (Direction == MouseWheelDirection.Up && args.Delta > 0
            || Direction == MouseWheelDirection.Down && args.Delta < 0)
        {
            inputEventArgs.Handled = true;
            return true;
        }

        return false;
    }

}

public class MouseWheel : MarkupExtension
{
    public MouseWheelDirection Direction { get; set; }
    public ModifierKeys Keys { get; set; }

    public MouseWheel()
    {
        Keys = ModifierKeys.None;
        Direction = MouseWheelDirection.Down;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return new MouseWheelGesture(Keys, Direction);
    }
}

в xaml:

<MouseBinding Gesture="{local:MouseWheel Direction=Down, Keys=Control}" Command="..." />
1 голос
/ 24 ноября 2010

Хорошо, я сделал что-то подобное в моем ShellView : Window

this.KeyDown += (s, e) =>
{
    _leftCtrlPressed = (e.Key == Key.LeftCtrl) ? true : false;
};

this.MouseWheel += (s, e) =>
{
    if (_leftCtrlPressed) {
        if (e.Delta > 0)
            _vm.Options.FontSize += 1;
        else if (e.Delta < 0)
            _vm.Options.FontSize -= 1;
    }
};

Я думаю, что метод Поведения сделает вещи чище и более пригодными для повторного использования, но на самом деле я этого не понял. Будет здорово, если кто-нибудь объяснит это по-простому?

0 голосов
/ 19 января 2017

Я просто связываю команду с помощью Interaction.Triggers.

Вам нужно будет сослаться на пространство имен интерактивности выражения в XAML.

 <i:Interaction.Triggers>
    <i:EventTrigger EventName="PreviewMouseWheel">
        <cmd:InvokeCommandAction Command="{Binding MouseWheelCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

Затем в связанной команде.

 private void MouseWheelCommandExecute(MouseWheelEventArgs e)
    {
        if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
        {
            if (e.Delta > 0)
            {
                if (Properties.Settings.Default.ZoomLevel < 4)
                    Properties.Settings.Default.ZoomLevel += .1;
            }
            else if (e.Delta < 0)
            {
                if (Properties.Settings.Default.ZoomLevel > 1)
                    Properties.Settings.Default.ZoomLevel -= .1;
            }
        }

    }

Если Delta поднимается, мышь прокручивает вверх, а при падении прокручивает вниз.Я использую это в приложении, где прокрутка происходит в прокручиваемом контенте, но когда какая-либо из клавиш Ctrl не работает, приложение фактически увеличивает масштаб.

0 голосов
/ 24 ноября 2010

Окно имеет событие MouseWheel.Вы можете использовать магию связывания команд, которую затем можете привязать к свойству DataContext.Проверьте эту статью SO для подсказок: Нажатие клавиши внутри текстового поля MVVM .Также взгляните на эту статью: http://code.msdn.microsoft.com/eventbehaviourfactor

...