none
关于textbox的录入值控制问题,求教大家! RRS feed

  • 问题

  •  

    我针对该录入框做了预处理。

    TextCompositionManager.AddPreviewTextInputStartHandler(ETextBox, new TextCompositionEventHandler(ETextBox_PreviewTextInput)); ETextBox.PreviewTextInput+=new TextCompositionEventHandler(ETextBox_PreviewTextInput);

      在ETextBox_PreviewTextInput方法体内做了正则的判定。

        RgeEdit = new Regex(ValueType);
                    if (!RgeEdit.IsMatch(e.Text))
                        e.Handled = true;
                    if (!RgeEdit.IsMatch(e.TextComposition.CompositionText))
                        e.Handled = true;
                 

    问题来了,winXp和win7是没有问题的,到了win8和win10,

    e.Text,e.textcomposition.compositiontext是无法获取输入法的输入内容的。

    例子:在中文输入法下,我输入z,则应该出现中文输入法选择字,有在,则,做==,并触发了上面的事件,

    如果不符合正则,则跳出,不做输入,符合,则正常输入。

    到底为什么这样改?不知道微软想通过什么方式解决?求教。给个解决方案,多谢各位

     

      
    2016年1月11日 9:20

答案

  • 您好 Simon施,

    在中文输入法下,当用户按下一个按键的时候,文本框里文本并不会立即跟着做改变。而是需要我们进一步选择对应的中文文字,对应的文字才会出现在e.Text属性中。 我们可以通过一个条件判断来解决这个问题。

    private void ETextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        if (string.IsNullOrEmpty(e.Text))
        {
            return;
        }
        else
        {
            RgeEdit = new Regex(ValueType);
            if (!RgeEdit.IsMatch(e.Text))
                e.Handled = true;
            if (!RgeEdit.IsMatch(e.TextComposition.CompositionText))
                e.Handled = true;
        }
    }

    另外,如果您只期望用户在这个文本框里输入英文,我们也可以在文本框获得焦点的时候,设置输入语言的类型。

    private void ETextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        InputLanguageManager.SetInputLanguage(ETextBox, new System.Globalization.CultureInfo("en-us"));
    }


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 Simon施 2016年1月13日 9:21
    2016年1月13日 2:25
    版主

全部回复

  • 您好 Simon施,

    在中文输入法下,当用户按下一个按键的时候,文本框里文本并不会立即跟着做改变。而是需要我们进一步选择对应的中文文字,对应的文字才会出现在e.Text属性中。 我们可以通过一个条件判断来解决这个问题。

    private void ETextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        if (string.IsNullOrEmpty(e.Text))
        {
            return;
        }
        else
        {
            RgeEdit = new Regex(ValueType);
            if (!RgeEdit.IsMatch(e.Text))
                e.Handled = true;
            if (!RgeEdit.IsMatch(e.TextComposition.CompositionText))
                e.Handled = true;
        }
    }

    另外,如果您只期望用户在这个文本框里输入英文,我们也可以在文本框获得焦点的时候,设置输入语言的类型。

    private void ETextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        InputLanguageManager.SetInputLanguage(ETextBox, new System.Globalization.CultureInfo("en-us"));
    }


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 Simon施 2016年1月13日 9:21
    2016年1月13日 2:25
    版主
  •  已经搞定。用这个更好点。我觉得。

    InputMethod.SetIsInputMethodEnabled(textBox1, false);
    InputMethod.SetPreferredImeState(textBox1, InputMethodState.Off);

     本来想用previewkeydown做的,发现限制太多了,不合理。PreviewTextInput处理更合理。

    总结:如果要控制输入内容,需要判断是否需要IME,不需要则可以屏蔽掉,例如数字和英文。

    主要在于搜狗之类的可以输入英文,但是你在处理的时候是拿不到IME的值的。为了保证代码通用性,

    previewkeydown还是尽量别用了或者比较简单的过滤。

      

    2016年1月13日 9:26