首页 > 解决方案 > 触摸滚动在 WPF 中不起作用

问题描述

我有一个 WPF 应用程序,其中一部分我有一张显示 Javascript 的卡片。我的问题是我无法用鼠标在 Javascript 卡上滚动,因为它正在吞噬事件。我通过挂钩PreviewMouseWheel发送的事件(在此处描述)解决了这个问题UIElement

protected void AddListeners(BorderedCanvas borderedCanvas)
{
    borderedCanvas.PreviewMouseWheel += PreviewMouseWheel;
}

protected void RemoveListeners(BorderedCanvas borderedCanvas)
{
    borderedCanvas.PreviewMouseWheel -= PreviewMouseWheel;
}

protected static void PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    if (!e.Handled)
    {
        e.Handled = true;

        var eventArg =
            new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
            {
                RoutedEvent = UIElement.MouseWheelEvent,
                Source = sender
            };

        var parent = VisualTreeHelper.GetParent((UIElement)sender) as UIElement;
        parent?.RaiseEvent(eventArg);
    }
}

现在,用鼠标滚动效果很好。

但是,触摸滚动不起作用。

所以,我修改了AddListeners

    protected void AddListeners(BorderedCanvas borderedCanvas)
    {
        borderedCanvas.PreviewMouseWheel += PreviewMouseWheel;
        borderedCanvas.PreviewTouchDown += new EventHandler<TouchEventArgs>(OnTouchDown);
        borderedCanvas.PreviewTouchMove += new EventHandler<TouchEventArgs>(OnTouchMove);
    }

我添加了这些方法:

    protected static void OnTouchDown(object sender, TouchEventArgs e)
    {
        if (!e.Handled)
        {
            e.Handled = true;

            var eventArg =
                new TouchEventArgs(e.TouchDevice, e.Timestamp)
                {
                    RoutedEvent = UIElement.TouchDownEvent,
                    Source = sender
                };

            var parent = VisualTreeHelper.GetParent((UIElement)sender) as UIElement;
            parent?.RaiseEvent(eventArg);
        }
    }

    protected static void OnTouchMove(object sender, TouchEventArgs e)
    {
        if (!e.Handled)
        {
            e.Handled = true;

            var eventArg =
                new TouchEventArgs(e.TouchDevice, e.Timestamp)
                {
                    RoutedEvent = UIElement.TouchMoveEvent,
                    Source = sender
                };

            var parent = VisualTreeHelper.GetParent((UIElement)sender) as UIElement;
            parent?.RaiseEvent(eventArg);
        }
    }

但是,触摸滚动仍然不起作用。

知道我做错了什么吗?

对我来说,我似乎以类似的方式处理鼠标滚动和触摸滚动,但第一个有效,第二个无效。

标签: c#.netwpf

解决方案


您需要设置 ScrollViewer.PanningMode 以使其与触摸一起使用。

<ScrollViewer PanningMode="Both"/>

PanningMode 的默认值为无。


推荐阅读