简体   繁体   English

在WPF中无法通过触摸滚动

[英]Scrolling with touch not working in WPF

I have a WPF application and over a part of it I had a card which displayed Javascript. 我有一个WPF应用程序,在其中的一部分上,我有一张显示Javascript的卡。 My problem was that I wasn't able to scroll with the mouse over the Javascript card, because it was swallowing the events. 我的问题是我无法用鼠标滚动Javascript卡,因为它吞没了事件。 I solved that by hooking into the PreviewMouseWheel event (described here) sent by UIElement : 我通过钩住UIElement发送的PreviewMouseWheel事件(在此描述)解决了这个问题:

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);
    }
}

Now, scrolling with the mouse works perfectly fine. 现在,使用鼠标滚动即可正常工作。

However, scrolling with touch doesn't work. 但是,触摸滚动不起作用。

So, I modified AddListeners : 因此,我修改了AddListeners

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

And I added these methods: 我添加了以下方法:

    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);
        }
    }

However, scrolling with touch still doesn't work. 但是,触摸滚动仍然不起作用。

Any idea what I did wrong? 知道我做错了什么吗?

To me it seems that I treated the mouse scroll and the touch scroll in a similar way, but the first works and the second doesn't. 对我来说,我似乎以类似的方式处理了鼠标滚动和触摸滚动,但是第一个有效而第二个无效。

You need to set the ScrollViewer.PanningMode for it to work with the touch. 您需要设置ScrollViewer.PanningMode使其能够与触摸一起使用。

<ScrollViewer PanningMode="Both"/>

The default value for the PanningMode is None. PanningMode的默认值为None。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM