如何在 CefSharp.Wpf 中禁用 'fling/flick scrolling'?

How can the 'fling/flick scrolling' be disabled in CefSharp.Wpf?

有没有办法禁用 CefSharp.Wpf 中的 'touch fling scrolling' 行为(或可能通过 Cef、Chromium 等)?

我很感激这是一个不寻常的请求,因为触摸滑动滚动是一项很棒的功能。但不幸的是,我需要与一个狡猾的触摸屏 hw/driver 集成,它非常适合拖动……但在轻弹滚动时会失败,因为它始终如一 'over scrolls'。例如在屏幕上轻弹一下会使页面内容滚动多页(而不是仅仅几行)。

没有 CefSharp/Cef/Chromium 标志或 public 方法可用于取消 Chromium 的投递行为。

幸运的是,Chromium 确实会在某些情况下在内部取消 fling 行为(参考 Chromium 的 fling_controller.cc)。一种这样的场景是用户触摸事件。

所以诀窍是模拟触地取消事件对。因为 CefSharp 没有为用户提供 'post touch down' 事件来实现逻辑(即太多的边缘情况),最简单的方法是通过派生的 class.[=12= 来实现该功能]

这是一个完整的示例(具有依赖性 属性 绑定),以防其他人寻找相同的解决方案..

public class ChromiumWebBrowserEx : ChromiumWebBrowser
{
    public static readonly DependencyProperty IsFlingDisabledProperty = DependencyProperty.Register("IsFlingDisabled", typeof(bool), typeof(ChromiumWebBrowserEx));

    public bool IsFlingDisabled
    {
        get => (bool) GetValue(IsFlingDisabledProperty);
        set => SetValue(IsFlingDisabledProperty, value);
    }

    protected override void OnTouchUp(TouchEventArgs e)
    {
        base.OnTouchUp(e);

        if (IsFlingDisabled)
            CancelFling(e);
    }

    private void CancelFling(TouchEventArgs e)
    {
        // cancel the fling by creating a pseudo touch down followed by a cancellation
        var touchPoint = e.GetTouchPoint(this);
        if (touchPoint.Action == TouchAction.Up)
        {
            var touchEvent = new TouchEvent
                {
                    Id = e.TouchDevice.Id,
                    X = (float) touchPoint.Position.X,
                    Y = (float) touchPoint.Position.Y,
                    PointerType = PointerType.Touch,
                    Modifiers = WpfExtensions.GetModifierKeys(),
                    Type = TouchEventType.Pressed
                };

            GetBrowser().GetHost().SendTouchEvent(touchEvent);

            touchEvent.Type = TouchEventType.Cancelled;
            GetBrowser().GetHost().SendTouchEvent(touchEvent);
        }
    }
}