有没有办法可以将命令绑定到Ctrl+MWheelUp/Down
?你知道在浏览器中,你可以做同样的事情来增加/减少字体大小?我想在 WPF 中复制这种效果。可能的?我正在查看InputBinding > MouseBindings和MouseAction似乎不支持鼠标滚动。
* 我好像发过类似的问题,但是找不到了
有没有办法可以将命令绑定到Ctrl+MWheelUp/Down
?你知道在浏览器中,你可以做同样的事情来增加/减少字体大小?我想在 WPF 中复制这种效果。可能的?我正在查看InputBinding > MouseBindings和MouseAction似乎不支持鼠标滚动。
* 我好像发过类似的问题,但是找不到了
可以使用非常简单的自定义 MouseGesture 来完成:
public enum MouseWheelDirection { Up, Down}
public 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="..." />
好的,我在我的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;
}
};
我认为 Behavior 方法会使事情变得更清洁和更可重用,但我并没有真正理解。如果有人在这里以简单的方式解释它会很棒吗?
Window 有 MouseWheel 事件。您可以执行一些命令绑定魔术,然后将其绑定到 DataContext 属性。查看这篇 SO 文章以获取提示:Key press inside of textbox MVVM。也看看这篇文章:http ://code.msdn.microsoft.com/eventbehaviourfactor
我只是使用 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 键按下时,应用程序实际上会缩放。