为啥在 tabcontrol 内的 WPF 文本框中单击时,Windows 10 键盘会出现并立即消失?

Posted

技术标签:

【中文标题】为啥在 tabcontrol 内的 WPF 文本框中单击时,Windows 10 键盘会出现并立即消失?【英文标题】:Why does windows 10 keyboard appear and immediately dissapear when clicking in WPF textbox inside tabcontrol?为什么在 tabcontrol 内的 WPF 文本框中单击时,Windows 10 键盘会出现并立即消失? 【发布时间】:2019-03-31 01:53:41 【问题描述】:

我们在 Windows 10(更新 1803 - Microsoft Surface Go)中的 WPF 应用程序出现了奇怪的行为。

在应用程序内部,我有一个 Tabcontrol,它的 ItemsSource 在代码隐藏中绑定到对象列表(基于用户控件)。

每当我在文本框内按时,Windows 10 键盘就会立即出现和消失。如果我再次单击文本框,键盘将正确显示。当我在另一个文本框中按下时,同样的情况再次发生(键盘出现/消失,我必须在同一个文本框中再次按下)。

在应用程序的其他部分,这不会发生。

奇怪的是,当我刚拿到平板电脑时,我会发誓这个问题没有发生。从那时起,windows 已经更新。

我怀疑这与其中一个 Windows 更新有关,因为相同的应用程序在具有另一个品牌的 Windows 10 的其他平板电脑上运行良好(我确信其中一个平板电脑具有 2016 年的 Windows 10 LTSB 版本)。

我已尝试删除尽可能多的更新,但无法删除 1803 累积更新。

我使用的 .Net 版本是 .Net 4.0,我尝试更新到 4.7.2 没有成功。正如此线程中所建议的:C# WPF Windows 10 (1803) TouchKeyboard unreliable Issue (Prism ClickOnce)

我看到另一个人抱怨他们只有在特定的 Windows 10 更新后才遇到类似的问题。 https://social.msdn.microsoft.com/Forums/en-US/b9efb4eb-e0a9-4bf0-9985-57a673c42f79/wpf-application-windows-10-touch-keyboard-flickering-issue?forum=wpf

我已尝试切换到平板电脑模式和桌面模式。在两者中都会发生相同的行为。所以,现在我已经默认为带有“控制面板”的桌面模式 - 如果没有连接物理键盘,键盘会出现在该设置中。


我发现的唯一解决方法如下:

    将 tabcontrol 放在 Grid 和 gridrow 中,并创建第二个 GridRow (height=0),里面有一个文本框(新的 Textbox 必须在 tabcontrol 之外)。当按下其中一个选项卡时,将焦点放在新创建的文本框上。

    Keyboard.Focus(焦点框);

当我这样做时,键盘不会在我第一次按下 tabcontrol 内的文本框时消失。

【问题讨论】:

您是否尝试使用 tabcontrol 创建一个简单的测试应用程序只是为了消除您自己的应用程序代码? 我已经考虑过了。但是知道该应用程序在“其他平板电脑/其他版本的 Windows 10”上确实可以按预期工作,并且在 tabcontrol 的用户控件中也有很多代码(这会使精确定位变得更加困难)并找到可能摆脱一些的解决方法阐明真正的问题......我还没有这样做。 只是想补充一点,这个问题在 2021 年仍然存在。同时使用带有 .Net 4.7.2 的 WPF,我可以确认该行为。可悲的是,原始问题中提供的解决方法也不适用于我。每次用户通过触摸输入聚焦文本框时,触摸键盘都会再次关闭,用户必须再次点击文本框。 【参考方案1】:

继承您的 TabControl 并覆盖 OnCreateAutomationPeer:

protected override AutomationPeer OnCreateAutomationPeer()

    return new FrameworkElementAutomationPeer(this);

由于某种原因,当我将其保留为默认 TabControlAutomationPeer 时,我遇到了同样的问题,即自动打开的触摸键盘(TabTip.exe)在按下 TabControl 的任何选项卡内的文本框后立即关闭。如果我将其更改为FrameworkElementAutomationPeer,它会完美运行。

但是,我不完全确定此解决方案的缺点是什么。是否有任何负面影响。

另一种解决方案可能是将注册表项 HKEY_CURRENT_USER\Software\Microsoft\TabletTip\1.7\DisableNewKeyboardExperience 设置为 1,但这会将虚拟键盘的外观更改为旧版本,并且在按下另一个控件后键盘会停留在屏幕上。

【讨论】:

以上是关于为啥在 tabcontrol 内的 WPF 文本框中单击时,Windows 10 键盘会出现并立即消失?的主要内容,如果未能解决你的问题,请参考以下文章

TabControl 内的 WPF ContentControl 不显示 DataTemplates

WPF文本框,无法编辑文本......即将放弃

为啥 WPF 文本框 DesiredHeight 过早地为新行提供空间?

为啥 WPF 样式在工具提示中显示验证错误适用于文本框但对组合框无效?

如何在 WPF 中的 tabItem 中集中控制

MVVM WPF:为啥在运行应用程序时更新文本框中的文本后模型中的属性始终为空?