【问题标题】:Scrolling with touch not working in WPF触摸滚动在 WPF 中不起作用
【发布时间】:2018-06-12 07:28:54
【问题描述】:

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

我添加了这些方法:

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

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

知道我做错了什么吗?

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

【问题讨论】:

  • 为什么要捕获这些事件并再次手动引发事件以进行家长控制。如果您不处理,事件将自动冒泡到父 UI 控件 (e.handled = true)。
  • 我尝试设置e.handled = true,但在这种情况下滚动不起作用。因此,我将事件冒泡给父母,如此处所述 stackoverflow.com/questions/1585462/… 并且有效。

标签: c# .net wpf


【解决方案1】:

您需要设置 ScrollViewer.PanningMode 才能使用触摸。

<ScrollViewer PanningMode="Both"/>

PanningMode 的默认值为 None。

【讨论】:

  • 我没有一些与此组件关联的.xml 文件,所以我不确定在哪里设置PanningMode 属性。
  • 你说你有一个WPF应用程序,你有什么看法?不是 .xaml?连主持人都没有?
  • 我正在使用这个库来将 React Native 代码转换为 WPF:github.com/Microsoft/react-native-windows。意见在里面。我正在编写的这个组件只是库的一个包装器,它应该确保滚动正常工作。
  • 根据我的经验,它启用了触摸滚动,曾经遇到过这个问题,并且确实解决了它。
  • 我认为它们没有任何区别。只要参数参数类型为 TouchEventArgs,您也可以直接将 OnTouchDown 作为回调传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多