前言

在WPF中使用WebView2时,发现无法在触摸屏中对WebView2打开的网页进行滑动操作,经过研究发现,WPF内置的触笔和触摸支持与WebView2中的触笔和触摸存在冲突,需要禁用掉WPF内置的触笔和触摸支持才能解决。

解决方案

方法一

使用AppContextSwitchOverrides禁用WPF内置的触笔和触摸支持

在你的应用程序的app.config​文件中添加以下配置,可以关闭WPF内置的实时触摸(RealTimeStylus)支持,从而改用Windows触摸消息(WM_TOUCH​):

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport=true" />
  </runtime>
</configuration>

方法二

使用反射禁用WPF的RealTimeStylus

public static void DisableWPFTabletSupport()
{
    // Get a collection of the tablet devices for this window.
    TabletDeviceCollection devices = System.Windows.Input.Tablet.TabletDevices;
    if (devices.Count > 0)
    {
        // Get the Type of InputManager.
        Type inputManagerType = typeof(System.Windows.Input.InputManager);
        // Call the StylusLogic method on the InputManager.Current instance.
        object stylusLogic = inputManagerType.InvokeMember("StylusLogic", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic, null, InputManager.Current, null);
        if (stylusLogic != null)
        {
            // Get the type of the stylusLogic returned from the call to StylusLogic.
            Type stylusLogicType = stylusLogic.GetType();
            // Loop until there are no more devices to remove.
            while (devices.Count > 0)
            {
                // Remove the first tablet device in the devices collection.
                stylusLogicType.InvokeMember("OnTabletRemoved", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, stylusLogic, new object[] { (uint)0 });
            }
        }
    }
}

注意

如果你的WPF程序中还包含了其他的需要滑动操作的控件,如果禁用了WPF内置的触笔输入会导致其他控件无法进行滑动操作,此方案仅适用于WPF程序中只有WebView2一个需要滑动操作的控件。