У меня есть метод 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;
}
}
}
EDIT:
В соответствии с предложением @ mm8 я попытался реализовать его в свойстве TextEdit.PreviewTextInput
следующим образом:
1025 * 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;
}
}
}
Однако, когда я запускаю приложение и устанавливаю точки останова где-нибудь внутри этого метода, кажется, что он никогда не входит внутрь него.
То же самое решение вернулось ко мне, когда я использовал его в TextBox от wpf, но как только я переключился на devexpress, метод TextBox_PreviewTextInput
никогда не вызывался.