我有一个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
方法。
答案 0 :(得分:2)
键是键,而不是字符。最终, 将其映射到一个字符,具体取决于输入设备。
您可能要考虑处理PreviewTextInput
并检查Text[0]
中TextCompositionEventArgs
的值,而不是处理PreviewKeyDown
。