【问题标题】:How to avoid losing the input focus on an HTML element inside a WebView?如何避免失去对 WebView 内 HTML 元素的输入焦点?
【发布时间】:2017-02-16 16:00:30
【问题描述】:

我目前正在尝试构建一个用于 UWP 应用的触摸键盘。我想出的解决方案之一是使用代理组件调用带有按钮的 SendKeys 功能(IsTabStop 设置为 false,ClickMode 设置为 Press,以防止输入控件失去焦点)。到目前为止,一切正常(在 TextBoxes 上测试它没有任何问题)。

问题:我在使用 WebView 控件时遇到了一些问题:当我单击按钮时,WebView 保持焦点,如预期的那样;但是,DOM 元素(例如 HTML 的 <input> 标记)会失去输入焦点(同时仍处于可视选择状态)。

我找到了解决这个问题的方法,方法是将焦点重新设置在 webview 上;但这发现了另一个问题。假设输入元素设置为在聚焦时选择其所有内容(字符串)。然后,每次我单击一个按钮时,都会选择内容并替换为我发送到 WebView 的新字母。

那么,我的问题是,有什么方法可以避免在单击 XAML 按钮时失去 DOM 对象的焦点?

注意:我确实知道 InputPane,但我不能将它用于此应用程序(由于客户端的一些限制)。另外,如果有不清楚的地方请告诉我,我会尽快修改。

NB2:我绝对无法访问将由 WebView 显示的页面的源代码,也不能依赖特定元素的存在。

【问题讨论】:

    标签: c# webview uwp


    【解决方案1】:

    周年更新为此场景引入了一个新属性FrameworkElement.AllowFocusOnInteraction。在您的 Button 上将其设置为 false ,并且单击 Button 时不会获得焦点。焦点将停留在 WebView 上,并且选择不应该被清除(如果没有,还有其他事情发生)。

    在此之前没有一个好的解决方案。我见过的最糟糕的是在 Button.Click 处理程序中调用 WebView.Focus() 以返回焦点,然后等待焦点事件完成,然后再继续单击处理程序。

    如果您需要针对周年更新之前的系统,那么您需要在使用 ApiInformation.IsPropertyPresent 检查它是否存在后从代码中设置 AllowFocusOnInteraction。您不能直接在 Xaml 中执行此操作,但可以将检查包装在可从 Xaml 调用的附加属性中。示例代码见我的博文ComboBox on a Flyout attached to an AppBarButton loses mouse input on 1607

    【讨论】:

    • 感谢您的帮助。此属性行为似乎非常接近 IsTabStop(至少,我确实得到了相同的结果)。至于 Button.Click 处理程序中的 Focus() 调用,这几乎是我到目前为止所做的,但它会导致一些问题,具体取决于网页如何处理输入元素。我尝试了您的解决方案,但不幸的是,对 WebView 本身的关注似乎不是问题。看起来某处有一个点击处理程序使控件失去输入焦点,即使焦点保持在 WebView 上(虽然不确定它是如何实际处理的)。
    • @Dragosh 你能解决吗?我也面临类似的问题。
    • 不,如果我没记错的话,我完全放弃了那个选项(不过那是前一段时间了,所以我不记得我做了什么)
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2013-10-02
    相关资源
    最近更新 更多