WPF文本更改事件未触发' S'

时间:2018-06-11 19:57:11

标签: c# wpf

我有一个WPF应用程序,它是在另一家公司的应用程序中托管的用户控件。

我创建的文本框将接受所有字符和数字,除了大写' S'。它们是MVVM绑定到字符串属性,可以处理除“S'”之外的任何其他字符。文本也改变了每个其他角色的事件。按键向下和向上将启动" S"虽然性格。文本框不显示字符。

我在某处看到有时托管用户控件发生冲突,它不接受某些输入,但我无法设置解决此问题所需的ElementHost属性,因为我没有对此主机窗口进行编程访问案件。该控件由另一个用户控件托管,该控件托管在我添加应用程序的第三方应用程序下。

我很傻眼,因为其他每一个关键都有效。我在另一台机器上检查了这个以找到同样的问题,因此它不依赖于硬件。

3 个答案:

答案 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"炭。