我有一个WPF应用程序,它是在另一家公司的应用程序中托管的用户控件。
我创建的文本框将接受所有字符和数字,除了大写' S'。它们是MVVM绑定到字符串属性,可以处理除“S'”之外的任何其他字符。文本也改变了每个其他角色的事件。按键向下和向上将启动" S"虽然性格。文本框不显示字符。
我在某处看到有时托管用户控件发生冲突,它不接受某些输入,但我无法设置解决此问题所需的ElementHost属性,因为我没有对此主机窗口进行编程访问案件。该控件由另一个用户控件托管,该控件托管在我添加应用程序的第三方应用程序下。
我很傻眼,因为其他每一个关键都有效。我在另一台机器上检查了这个以找到同样的问题,因此它不依赖于硬件。
答案 0 :(得分:2)
我怀疑您订阅了 TextChanged 事件。如果是这种情况,只需订阅 PreviewKeyDown ,请应用您的过滤器并将e.Handled设置为true以将其下沉。
private void PreviewKeyDownFilter(object sender, KeyEventArgs e)
{
if (e.Key == Key.S && Keyboard.IsKeyDown(Key.LeftShift))
e.Handled = true;
}
答案 1 :(得分:1)
我想出了一个不那么干净的方法来处理它。我对解决方案不满意,因为我想了解根本原因,但这在功能上有效。
private void IOTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.S && (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)))
{
TextBox tb = sender as TextBox;
tb.Text = tb.Text + "S";
tb.CaretIndex = tb.Text.Length;
e.Handled = true;
}
}
如果其他人有更好的想法......
答案 2 :(得分:0)
尝试创建一个单独的WPF应用程序来执行相同的操作:虚拟应用程序托管一个托管控件的虚拟控件。如果一切正常,那么他们的应用程序有99%的机会有一些加速器快捷方式或其他类型的逻辑来吃掉那些" S"炭。