如何防止ScrollViewer使用MouseWheel事件

时间:2010-09-04 14:33:42

标签: silverlight scrollbar zoom scrollviewer

我正在构建SL应用程序,用于在布局中进行缩放和平移。一切都工作正常,除了当我使用鼠标滚轮放大,一些缩放滚动条开始使用鼠标滚轮后,我可以滚动不缩放。如果我把滚动条放在最后或开始,我只能再次缩放。如何防止scrollviewer使用鼠标滚轮?我希望缩放只能通过滚轮操作。提前谢谢!

当我缩放内容时,这是我的MouseWheel方法代码:

protected override void OnMouseWheel(MouseWheelEventArgs e) 
    { 
        base.OnMouseWheel(e);             

        if (e.Delta > 0) 
        { 
            this.aniScaleX.To += 0.2; 
            this.aniScaleY.To += 0.2; 

            this.sbScale.Begin(); 
        } 
        else if (e.Delta < 0 && (this.aniScaleX.To > 1 && this.aniScaleY.To > 1)) 
        { 
            this.aniScaleX.To -= 0.2; 
            this.aniScaleY.To -= 0.2; 

            this.sbScale.Begin(); 
        } 

        Sizer.Width = Board.ActualWidth * (double)this.aniScaleX.To; 
        Sizer.Height = Board.ActualHeight * (double)this.aniScaleY.To; 

3 个答案:

答案 0 :(得分:4)

尝试设置:

e.Handled=true;

答案 1 :(得分:1)

  

MouseWheel事件是冒泡的   事件即可。这意味着如果多个   MouseWheel事件处理程序是   注册了一系列对象   由亲子关联   对象树中的关系,   每个人都可能收到一个事件   在这种关系中的对象。该   冒泡的比喻表明了   事件从源头开始并起作用   它在对象树上的方式。为一个   冒泡事件,发件人可用   到事件处理程序标识   处理事件的对象,而不是   必然是实际的对象   收到了输入条件   发起了这个活动。获得对象   发起事件,使用   事件的OriginalSource值   数据。 http://msdn.microsoft.com/en-us/library/system.windows.uielement.mousewheel(VS.95).aspx

就我而言,ScrollViewer之前总是收到事件,因为他位于可视化树的顶部。所以我刚刚在scrollviewer上注册了鼠标滚轮事件中的事件处理程序,并且总是当它发生时,我只是将它重定向到我的“原始”鼠标滚轮功能,它可以进行缩放。

我希望这能帮助那些像我一样“卡住”的人。谢谢大家的答案和建议。

答案 2 :(得分:1)

这花了我一段时间(WPF),但基本上你应该在任何有该事件的父UIElement中使用AddHandler。

对我来说,我是在MainWindow中做到的。所以我的代码看起来像:

public MainWindow()
{
    InitializeComponent();
    this.AddHandler(MainWindow.MouseWheelEvent, new RoutedEventHandler(this.MouseWheel_1), true);
}

这也意味着不会覆盖OnMouseWheelDown,而是创建一个匹配RoutedEventHandler委托并将e(将是RoutedEventArg)作为MouseWheelEventArg进行匹配的方法,以访问确定缩放所需的属性。

我希望这对你的情况有所帮助。