如何将KeyEventArgs与字符进行比较?

时间:2019-05-24 13:26:36

标签: c# wpf devexpress

我有一个TextEdit.PreviewKeyDown方法,我想检查输入字符是否等于我选择的特殊字符。

对于一个实例,我想检查用户的输入字符是否为“#”。我会用:

if(e.Key == Key.D3 && (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)

问题是我不知道当时的特殊字符,而且我无法对所有情况进行编程,所以我想要类似的东西:

string strSpecChar = GetSpecialCharacter();

if(strSpecChar = e.Key) {do_sth();}

这根本不起作用,因为如果按下例如“ 3”,则e.Key值将等于“ D3”,因此,如果我的strSpecChar值为“ 3”,则无法进入do_sth()

我浏览了System.Windows.Input.KeyEventArgs文档,却一无所获,还读了其他论坛上令人沮丧的帖子。

有什么办法可以比较PreviewKeyDown e和字符串strSpecChar?

private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
    string strNewLigneSign = String.Empty;
    if (InsertTextDialogHelper != null)
        strNewLigneSign = InsertTextDialogHelper.GetNewLineSign();

    if (e.Key.Equals(strNewLigneSign))
    {
        if (!String.IsNullOrEmpty(strNewLigneSign))
        {
            int strCaretPosition = TextBox.CaretIndex;
            e.Handled = true;

            string strNewText = "\r\n";
            CurrentDialogData.TextValue = CurrentDialogData.TextValue.Insert(strCaretPosition, strNewText);
            TextBox.CaretIndex = strCaretPosition + strNewText.Length;
        }
    }
}

编辑:

按照@ mm8的建议,我尝试在TextEdit.PreviewTextInput属性中实现它,如下所示:

XAML

<dxe:TextEdit Name="TextBox"
    PreviewTextInput="TextBox_PreviewTextInput" \">
</dxe:TextEdit>

C#

  private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
  {
     string strNewLigneSign = String.Empty;
     if(InsertTextDialogHelper != null)
        strNewLigneSign = InsertTextDialogHelper.GetNewLineSign();

     if(!String.IsNullOrEmpty(strNewLigneSign))
     {
        if(e.Text.Contains(strNewLigneSign))
        {
           int strCaretPosition = TextBox.CaretIndex;
           e.Handled = true;

           string strNewText = Unhashify(e.Text);
           CurrentDialogData.TextValue =  CurrentDialogData.TextValue.Insert(strCaretPosition, strNewText);
           TextBox.CaretIndex = strCaretPosition + strNewText.Length;
        }
     }
  }

但是,当我运行该应用程序并在该方法内的任何位置设置断点时,似乎永远都不会进入其中。 当我在wpf的TextBox中使用它时,完全相同的解决方案对我有用,但是一旦切换到devexpress,就不会调用TextBox_PreviewTextInput方法。

1 个答案:

答案 0 :(得分:2)

键是键,而不是字符。最终, 将其映射到一个字符,具体取决于输入设备。

您可能要考虑处理PreviewTextInput并检查Text[0]TextCompositionEventArgs的值,而不是处理PreviewKeyDown