如何在 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);
}
}
}
有没有办法禁用 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);
}
}
}