Как сравнить KeyEventArgs с персонажем? - PullRequest
0 голосов
/ 24 мая 2019

У меня есть метод 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 никогда не вызывался.

1 Ответ

2 голосов
/ 24 мая 2019

Ключ - это ключ, а не символ. в конечном итоге сопоставляется с символом в зависимости от устройства ввода.

Возможно, вы захотите рассмотреть обработку PreviewTextInput и проверить значение Text[0] TextCompositionEventArgs вместо обработки PreviewKeyDown.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...