C# 触摸滚动在WPF中不起作用

C# 触摸滚动在WPF中不起作用,c#,.net,wpf,C#,.net,Wpf,我有一个WPF应用程序,在其中的一部分我有一张显示Javascript的卡片。我的问题是,我无法用鼠标在Javascript卡上滚动,因为它正在吞噬事件。我通过挂接UIElement发送的PreviewMouseWheel事件(此处描述)解决了这个问题: protected void AddListeners(BorderedCanvas borderedCanvas) { borderedCanvas.PreviewMouseWheel += PreviewMouseWheel; }

我有一个WPF应用程序,在其中的一部分我有一张显示Javascript的卡片。我的问题是,我无法用鼠标在Javascript卡上滚动,因为它正在吞噬事件。我通过挂接
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);
    }
}
现在,用鼠标滚动效果非常好

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

因此,我修改了
AddListeners

    protected void AddListeners(BorderedCanvas borderedCanvas)
    {
        borderedCanvas.PreviewMouseWheel += PreviewMouseWheel;
        borderedCanvas.PreviewTouchDown += new EventHandler<TouchEventArgs>(OnTouchDown);
        borderedCanvas.PreviewTouchMove += new EventHandler<TouchEventArgs>(OnTouchMove);
    }
但是,触摸滚动仍然不起作用

知道我做错了什么吗


对我来说,我似乎以类似的方式对待鼠标滚动和触摸滚动,但第一个工作,第二个不工作。

您需要设置ScrollViewer.PanningMode使其与触摸一起工作

<ScrollViewer PanningMode="Both"/>


PanningMode的默认值为None。

为什么要捕获这些事件并再次手动引发父控件的事件。如果您不处理父UI控件(
e.handled=true
),事件将自动冒泡到父UI控件。我尝试只设置
e.handled=true
,但在这种情况下滚动不起作用。因此,我将事件冒泡发送给父级,正如本文所述,这是有效的。我没有一些与此组件关联的
.xml
文件,因此我不确定在哪里设置
PanningMode
属性。您说您有一个WPF应用程序,您的看法是什么?不是,xaml?甚至连主机都没有?我正在使用这个库将React本机代码转换为WPF:。视图就在里面。我正在编写的这个组件只是库的一个包装器,应该可以确保滚动工作。据我的经验所知,它支持触摸滚动,我曾经遇到过这个问题,它确实解决了这个问题。我认为它们之间没有任何区别。您也可以将OnTouchDown作为回调直接传递,只要它的参数类型为TouchEventArgs。
<ScrollViewer PanningMode="Both"/>