鼠标绑定鼠标滚轮以放大WPF和MVVM

Kag*_*age 8 data-binding wpf mouse mvvm cinch

好的,我已经弄清楚如何使用LayoutTransform和ScaleTransform让我的UI元素网格进行缩放.我不明白的是我如何让我的View响应CTRL + MouseWheelUp\Down来做到这一点,以及如何使代码适应MVVM模式.

我的第一个想法是将ZoomFactor存储为属性,并绑定到命令来调整它.

我看的是:

<UserControl.InputBindings>
 <MouseBinding Command="{Binding ZoomGrid}" Gesture="Control+WheelClick"/>
</UserControl.InputBindings>
Run Code Online (Sandbox Code Playgroud)

但我看到2个问题:

1)我认为没有办法判断车轮是上升还是下降,我也不知道如何确定车轮的数量.我见过MouseWheelEventArgs.Delta,但不知道怎么弄它.

2)绑定到viewmodel上的命令似乎不对,因为它严格来说是View事物.

由于缩放只是严格的UI视图,我认为实际的代码应该放在代码隐藏中.

你们怎么实现这个?

ps,我使用Cinch for MVVM使用.net\wpf 4.0.

Lie*_*ero 10

真正的anwser是编写自己的MouseGesture,这很容易.

<MouseBinding Gesture="{x:Static me:MouseWheelGesture.CtrlDown}"  
              Command="me:MainVM.SendBackwardCommand" />
Run Code Online (Sandbox Code Playgroud)


oll*_*SFT 4

我建议您在VM中实现通用缩放命令.该命令可以使用新的缩放级别进行参数化,或者(或许甚至更简单)可以实现IncreaseZoomCommandDecreaseZoomCommand.然后使用视图的代码在处理鼠标滚轮事件的事件参数后调用这些命令.如果增量为正,则放大,如果负缩小.

通过使用几行代码解决这个问题没有任何害处.MVVM的主要思想是,您可以在不依赖于UI的对象中跟踪和修改几乎完整的视图状态(增强可测试性).因此,作为缩放结果的新视口的计算应该在VM中完成,而不是在后面的代码中完成.

隐藏在代码中的可测试性的小差距可以被忽略或被自动UI测试覆盖.但是,自动UI测试可能非常昂贵.