【发布时间】:2021-06-27 07:12:24
【问题描述】:
我正在开发一个 UWP 应用,该应用托管一个在单独进程中运行的 WebView。
var webView = new Windows.UI.Xaml.Controls.WebView(WebViewExecutionMode.SeparateProcess)
这会导致一种行为,即如果 WebView 具有焦点,则包含应用程序无法通过简单地尝试将焦点放在 UI 元素上来自行重新获得焦点。
应用程序支持键盘快捷键,这可能会导致不同的元素获得焦点,但当焦点被 WebView 捕获时,它无法正常工作。目标元素似乎获得了焦点,但似乎进程本身没有被激活(因为真正的焦点位于不同的进程中,我想......)。
我目前正尝试通过协议注册以编程方式激活应用程序,以重新获得焦点。
我在应用清单中添加了一个自定义协议 mycustomprotocol 的声明以及以下激活重载
protected override void OnActivated(IActivatedEventArgs args)
{
if (eventArgs.Uri.Scheme == "mycustomprotocol")
{ }
}
以下代码调用激活:
var result = await Windows.System.Launcher.LaunchUriAsync(new Uri("mycustomprotocol:"));
似乎只在某些计算机上工作,在其他计算机上(不是在调试应用程序时,仅在未附加执行时)而不是重新获得焦点,应用程序的任务栏图标只是闪烁橙色。
我创建了一个示例项目来显示问题和半工作解决方案here
任何关于这方面的见解都会很棒。
【问题讨论】:
-
你的意思是当webview捕获焦点时,你不能让这个页面上的其他元素获得焦点,对吧?我用 WebViewExecutionMode.SeparateProcess 创建了 webview,代码运行良好。一开始,我使用 FocusManager.TryFocusAsync() 来聚焦 Webview,然后我可以通过代码或鼠标操作轻松聚焦其他元素。那么您能否详细解释一下这个问题并提供您的代码 sn-p?
-
我添加了一个示例项目,您可以使用它来查看问题,注意任务栏闪烁只是有时会发生
-
我已经测试了您的示例,代码运行良好。我还没有看到任务栏闪烁。此外,无论应用程序是否被激活,文本框都会获得焦点。所以你不需要使用 Launcher.LaunchUriAsync() 来激活应用程序。
-
再试一次,按下“安排焦点计时器”按钮,然后将焦点设置在 webview 内,例如 bing 的搜索栏。然后在 3 秒后你会看到焦点移动到目标上,但是这个过程没有焦点,所以如果你尝试在键盘上输入一些东西,你仍然会看到 webview 有真正的焦点。对另一个按钮执行相同操作,您会看到它已解决。正如我所说,闪烁只发生在某些计算机上,它非常不可预测。