【发布时间】:2019-12-11 11:34:24
【问题描述】:
我有一个带有文本框的窗口,该窗口在键入时不会引发 textInput 事件。
我一直在用 Snooper 研究它。只有 KeyDown 和 KeyUp 事件被抛出。
它是响应几个键:空格、退格、插入、主页、删除、结束
它响应复制和粘贴命令,以及全选
它不响应任何字符、符号或数字
这里是关键:这个窗口是通过一个从代码中两个不同位置调用的共享方法打开的。当从一个位置调用时,文本框可以正常工作,而从其他位置调用时则不能。
我已经排除了绑定、数据转换器、样式、控件位置。 我将窗口剥离为一个没有绑定的纯文本框,但问题仍然存在。
我已经尽我所能来追查这个神秘的错误。在 previewTextInput 甚至被抛出之前,我看不到什么可以处理我的事件,或者为什么它可能只发生一半。
任何关于此错误原因的想法,或我可以尝试追踪事件的其他工具将不胜感激!
编辑:添加一些代码来演示。这已被精简为所需的最简单代码,但问题仍然存在。
<Window x:Class="EventViewEmail"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="880" Height="600">
<TextBox VerticalAlignment="Top"/>
</Window>
请注意缺少绑定、样式或任何其他可能干扰控件的内容
Public Class EventViewEmail
'all code removed from the view-behind'
End Class
这是构建窗口的静态类。对此类的两个单独调用以不同的方式构建参数。我已经删除了使用参数的代码,以表明它们不会影响手头的问题。
Public Class EventManager
Public Shared Sub Show(e As EventEdit, p As WorkplanPageViewModel)
Dim w = New EventViewEmail
If w Is Nothing Then Return
'removed datacontext for testing'
'w.DataContext = e '
'w.Tag = p'
w.Show()
End Sub
End Class
我唯一可以添加的另一件事是调用 Show() 子的代码来自两个不同的解决方案。不确定在我删除所有参数后可能会产生什么影响
编辑 2: 我一直在尝试跟踪事件序列以缩小事件处理的范围。到目前为止,我可以看到在 keyDown 和 keyUp 事件之间,有一系列应该发生的事件不是:
- PreviewInputReport / InputReport(无来源)
- 预览TextInputStart / TextInputStart(文本框)
- 预览文本输入/文本输入(文本框)
- PreviewInputReport / InputReport (textboxView)
keydown 事件没有被处理,所以我不确定为什么 PreviewInputReport 没有被触发
【问题讨论】:
-
请发布相关代码和/或一些示例,以便我们为您提供帮助,以便我们尝试重现问题;现在成为会员 10 多年了,您应该知道这一点 :)
-
“当以一种方式打开时,文本框可以完美地工作,当以另一种方式打开时,它不会。” 啊,一种方式。但反过来呢?很好读。
-
@Shaboboo 我建议从 .net 框架下载调试符号并从最底层开始。
-
如果您想要一些想法,这是我的一个想法 - 也许您在处理此事件的解决方案之一中具有全局
Window样式?尝试在您的Show方法中设置w.Style = New Style。 -
寻找像
EventManager.RegisterClassHandler(typeof(TextBox), UIElement.PreviewTextInputEvent, ...)这样的全局事件处理程序和/或行为。您是否使用任何第三方 UI 库?看看他们的代码。
标签: wpf routed-events wpf-textbox