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

     2023-02-19     41

关键词:

【中文标题】为啥在 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,但这会将虚拟键盘的外观更改为旧版本,并且在按下另一个控件后键盘会停留在屏幕上。

【讨论】:

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

】为啥WPF样式在工具提示中显示验证错误适用于文本框但对组合框无效?【英文标题】:WhydoesWPFStyletoshowvalidationerrorsinToolTipworkforaTextBoxbutfailsforaComboBox?为什么WPF样式在工具提示中显示验证错误适用于文本框但对组合框无效?【... 查看详情

如何清除嵌套在 TabControl、TabPage 和 2 个面板中的文本框?

】如何清除嵌套在TabControl、TabPage和2个面板中的文本框?【英文标题】:HowtoclearTextBoxesnestedinsideaTabControl,TabPageand2Panels?【发布时间】:2019-11-2721:35:09【问题描述】:下图是我正在构建的一个插件。黄色=tabControl1;橙色=tabPage1;蓝色... 查看详情

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

】为啥WPF文本框DesiredHeight过早地为新行提供空间?【英文标题】:WhydoesaWPFTextboxDesiredHeightgivesspaceforanewlinetoosoon?为什么WPF文本框DesiredHeight过早地为新行提供空间?【发布时间】:2021-11-2207:19:47【问题描述】:我在左侧的UserContro... 查看详情

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

】MVVMWPF:为啥在运行应用程序时更新文本框中的文本后模型中的属性始终为空?【英文标题】:MVVMWPF:WhyisthepropertyintheModelalwaysnullevenafterupdatingthetextintextboxwhilerunningtheapplication?MVVMWPF:为什么在运行应用程序时更新文本框中的文... 查看详情

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

...发布时间】:2012-01-0604:16:24【问题描述】:我在表单中有tabControl。在其中一个tabItems我有文本框(myTextBox)。我们称之为tabItem1。当我在tabItem1中的这个文本框中写一些东西时,我想将文本框(searchTextBox)聚焦在tabItem2中。我把... 查看详情

为啥我的 WPF 转换器“错过”文本框中的最后一个字符?

】为啥我的WPF转换器“错过”文本框中的最后一个字符?【英文标题】:WhydoesmyWPFconverter“miss”thelastcharacterintheTextBox?为什么我的WPF转换器“错过”文本框中的最后一个字符?【发布时间】:2021-01-1211:10:15【问题描述】:我正在... 查看详情

c#软件中wpf里面使用[文本框].text中的text不能使用了,为啥?

例如privatevoidyes_Click(objectsender,RoutedEventArgse)MessageBox.Show("Hello,"+text.Text);里面的text.Text就出错了,说是没有.Text这个,再跳出来的提示里面也没有。今天使用就错了,昨天还好好的,没有更改什么东西。头文件这些都没有动... 查看详情

是否可以在 WPF TabControl 中左对齐标题?

】是否可以在WPFTabControl中左对齐标题?【英文标题】:IsitpossibletoLeft-AlignheadersinaWPFTabControl?【发布时间】:2010-11-3006:21:06【问题描述】:现在,我有一个WPF窗口,其中TabControl的所有选项卡标签都居中。我希望TabControl的标签级别... 查看详情

在 wpf 中应用样式时,用户控件内的组合框消失

】在wpf中应用样式时,用户控件内的组合框消失【英文标题】:comboboxinsideausercontroldisappearswhenstyleisappliedinwpf【发布时间】:2011-04-0904:06:28【问题描述】:我正在尝试将样式应用于组合框,但组合框本身消失了,而不是被应用。... 查看详情

获取所选列表框项目的名称(WPF C#)?

...图像名称(显示在图像旁边的文本块中)都存储在列表框内的水平堆栈面板中。我整个下午都在努力寻找一种在用户在列表框中选择图像名称时在文本框中显示图像名称的方法。听起来很简单 查看详情

如何在 WPF 文本框中选择多个文本段?

】如何在WPF文本框中选择多个文本段?【英文标题】:HowcanIselectmultipletextsegmentsinaWPFtextbox?【发布时间】:2011-02-1822:58:44【问题描述】:是否可以在WPF文本框中选择多个文本部分?例如,对于包含字符串THISISATEST的文本框,我希... 查看详情

在没有 itemsource 的情况下关闭 Tabcontrol 的虚拟化 - WPF

】在没有itemsource的情况下关闭Tabcontrol的虚拟化-WPF【英文标题】:TurningoffVirtualizationforTabcontrolwithoutitemsource-WPF【发布时间】:2015-02-1515:47:45【问题描述】:我有一个关于Tabcontrols和Oxyplot的错误。我的xaml的结构是这样的:我有一... 查看详情

WPF ComboBox SelectedItem 在 TabControl 开关上设置为 Null

】WPFComboBoxSelectedItem在TabControl开关上设置为Null【英文标题】:WPFComboBoxSelectedItemSettoNullonTabControlSwitch【发布时间】:2011-03-2715:25:28【问题描述】:我的WPF应用程序中遇到了一个简单的问题,我的头撞到了桌子上。我有一个TabContro... 查看详情

在 wpf 中的自定义样式上,文本框的文本始终为空

】在wpf中的自定义样式上,文本框的文本始终为空【英文标题】:Textofthetextboxisalwaysemptyonacustomizedstylinginwpf【发布时间】:2021-09-0818:30:37【问题描述】:嘿,我正在使用XAML代码为我的WPF应用程序中的文本框设计一种新样式。文... 查看详情

在 wpf 文本框中开始一个新行

】在wpf文本框中开始一个新行【英文标题】:Startanewlineinwpftextbox【发布时间】:2011-12-1312:03:40【问题描述】:我使用WPF创建了一个包含文本框的小型GUI。我希望用户能够开始新的生产线。如何让用户在WPF文本框中开始新行(使... 查看详情

呈现之前的 WPF 文本框高度

】呈现之前的WPF文本框高度【英文标题】:WPFtextboxheightbeforeitsrendered【发布时间】:2012-03-1923:53:35【问题描述】:如何在渲染对象之前获取文本框的实际高度在wpf中?以下代码可以在Windows中运行,但在WPF中等效的是什么?textBox1... 查看详情

在 WPF Tabcontrol 标题模板中显示 SelectedIndex

】在WPFTabcontrol标题模板中显示SelectedIndex【英文标题】:ShowSelectedIndexinWPFTabcontrolheadertemplate【发布时间】:2013-03-1107:12:02【问题描述】:我的应用程序中有1...n个选项卡控件,具有以下XAML设置:<TabControlName="ordersTabControl"ItemsSou... 查看详情

WPF TabControl在开始时没有选择的项目

】WPFTabControl在开始时没有选择的项目【英文标题】:WPFTabControlnoselectedItemonstart【发布时间】:2016-09-2218:12:24【问题描述】:我正在使用WPF选项卡控件来显示从视图模型绑定的项目。默认情况下,在开始时选择列表的第一项,但... 查看详情