【发布时间】:2010-11-06 09:57:06
【问题描述】:
与这个问题相关(但不是骗子!):Help with the WPF TextCompositionManager events
在使用 TextCompositionManager 时,我遇到了一个问题,如果 TextBox 等输入控件具有焦点,则 TextBox 会在我有机会采取行动之前“窃取”空格字符就可以了。
例如,我们有如下代码:
public Window1()
{
TextCompositionManager.AddPreviewTextInputStartHandler
(this, PreviewTextInputStartHandler);
}
private void PreviewTextInputHandler(object sender, TextCompositionEventArgs e)
{
CaptureTextBlock.Text += e.Text;
e.Handled = true;
}
Window1 的样子:
<!--standard window crap above here-->
<StackPanel>
<TextBlock Name="CaptureTextBlock" />
<TextBox Name="ThievingBastard" />
</StackPanel>
<!-- snip -->
现在,如果我运行此应用程序并立即输入“我喜欢小偷”,TextBlock 将包含文本“我喜欢小偷”,并且文本框将为空。
但是,如果我关注文本框(即文本框具有键盘焦点),则在键入上述行后,文本块将包含文本“Ihaetthievingbastards”,文本框将包含文本“”(3 个空格)。
我有两个问题:
1) 我可以仅使用 TextCompositionManager 提供的工具来防止这种情况发生吗?
2) 如果没有,我到底该在哪里插入文本输入堆栈,以便我可以完全控制我的 WPF 应用程序中的文本输入(甚至考虑 p/invoking 的负面点)(你只是想关于它,加了负分)?
更新
我正在使用一种 hacky 解决方法,我只为空格处理来自 InputManager 的隧道 KeyDown 事件。这种方法非常笨拙,效率低下,基本上很臭。仍在寻找更好的方法。
【问题讨论】:
-
你挂的是 PreviewTextInputStart 还是 PreviewTextInput?您的代码示例混合了两者(并且不会编译)。
标签: wpf textinput textcompositionmanager