如何在WPF中防止Winforms WebBrowser上的触摸反馈?

4
我正在使用WinForms版本的<WebBrowser>在我的WPF应用程序中,类似于<WindowsFormsHost>,因为通常情况下它比Windows.Controls版本更好。然而,我遇到了一个与触摸屏有关的问题。
通常情况下,我会在控件上设置ManipulationBoundaryFeedback事件处理程序来立即处理该事件,从而防止任何边界反馈,并且我已经尝试使用以下代码进行设置:

MainWindow.xaml

<WindowsFormsHost IsManipulationEnabled="True" ManipulationBoundaryFeedback="WindowsFormsHost_OnManipulationBoundaryFeedback">
    <forms:WebBrowser />
</WindowsFormsHost>

MainWindow.xaml.cs

private void WindowsFormsHost_OnManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e)
{
    e.Handled = true;
}

通常情况下,在普通的WPF控件中,这是可行的。所谓的“可行”,是指如果您在触摸屏幕上使用手指向上或向下拖动,您不会得到触摸屏幕惯性的效果;也就是说,一旦您达到边界,它不会将整个窗口上下移动。

这里有一张图片来说明发生了什么:

animated gif of touch screen issue

如您所见,如果我在浏览器中向下拖动,它会将整个窗口一起拉动。有什么方法可以防止这种情况发生?


你尝试使用 OnManipulationBoundaryFeedback 了吗? - Enfyve
@Night5h4d3,你的评论里有错别字吗?因为那正是我所用的。 - soapergem
抱歉;您尝试将事件处理程序添加到Web浏览器标记了吗? - Enfyve
该控件的Windows Forms版本没有ManipulationBoundaryFeedback事件;操纵事件是WPF的一部分(而WinForms早于此)。 - soapergem
在这种情况下,您需要编写特殊处理 WM_Gesture 消息 的代码。此链接此链接 可能会有所帮助。 - Enfyve
2个回答

0

您可以关闭整个系统的此行为:

打开注册表(运行regedit命令)并将 HKEY_CURRENT_USER\Software\Microsoft\Wisp\Touch 中的 Bouncing 设置为 0; 如果 HKEY_CURRENT_USER\Software\Microsoft\Wisp\Touch 不存在 Bouncing 项,则添加它(DWORD类型,不是QWORD或字符串),并将其值设置为 0

然而,这不是一个好的方法,即使它解决了我的问题。请参考 manipulationboundaryfeedback-does-not-work-in-webbrowser-in-wpf


不知道为什么有人给了负一的评价.. 这正是我们的自助应用所需的。没有需要使用hacky代码。感谢作者,向其他人推荐 - 给这个点赞! - aZtraL-EnForceR

0

不确定您是否仍需要此答案,但为了防止这种不必要的行为,只需继承WindowsFormsHost类并像这样覆盖OnManipulationBoundaryFeedback

public class MyClass : WindowsFormsHost
{

    // Override is optional to remove unnecessary behavior
    protected override void OnManipulationBoundaryFeedback(ManipulationBoundaryFeedbackEventArgs e)
    {
        // uncomment this to use base class implementation
        //base.OnManipulationBoundaryFeedback(e); 
        e.Handled = true;
    }
}

已编辑

我进行了一个小测试,并为我的控件添加了这段代码。

protected override void OnManipulationBoundaryFeedback(ManipulationBoundaryFeedbackEventArgs e)
{
    Debug.WriteLine("OnManipulationBoundaryFeedback");
}

private void MyControl_ManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e)
{
    Debug.WriteLine("MyControl_ManipulationBoundaryFeedback");
}

并且输出如下:

OnManipulationBoundaryFeedback

MyControl_ManipulationBoundaryFeedback

OnManipulationBoundaryFeedback

MyControl_ManipulationBoundaryFeedback

OnManipulationBoundaryFeedback

MyControl_ManipulationBoundaryFeedback

OnManipulationBoundaryFeedback

MyControl_ManipulationBoundaryFeedback

因此,您可以看到OnManipulationBoundaryFeedback首先启动,然后调用ManipulationBoundaryFeedbackEvent处理程序。


这个不起作用。我在原始描述中提到ManipulationBoundaryFeedback事件处理程序不能处理WindowsFormsHost元素(或任何继承的元素),我在对Enfyve的评论中再次提到这一点,而且我刚刚匆忙地制作了一个快速测试项目,只是为了确保我没有疯掉。这肯定不起作用。 - soapergem
重写OnManipulationBoundaryFeedback并不等同于添加ManipulationBoundaryFeedbackEvent事件处理程序。我知道它百分之百地有效,因为今天我遇到了这个问题,并且是这样解决的。 - TƎИ. developer
观看这个视频以查看此代码的工作情况:https://vimeo.com/237103516 - TƎИ. developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接