Используйте SHIFT + ВВОД для многострочного текстового поля в UWP - PullRequest
0 голосов
/ 11 декабря 2018

Я хотел бы настроить поведение TextBox, чтобы SHIFT + ENTER на клавиатуре вставлял новую строку, а просто ВВОД выполняет другую команду (например, изменение фокуса или нажатие кнопки «отправить», как в приложениях обмена сообщениями).).

По умолчанию свойство AcceptsReturn для TextBox, для которого установлено значение true, вставляет новую строку при нажатии клавиши ENTER.Изменение AcceptsReturn на false, похоже, вообще не позволяет работать новой строке, даже если я вручную добавляю новую строку:

private void ContentTextBox_KeyUp(object sender, KeyRoutedEventArgs e)
{
    // NOTE - AcceptsReturn is set to false in XAML.
    if (e.Key == VirtualKey.Enter)
    {
        var keyState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
        if ((keyState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down)
        {
            // SHIFT is pressed, so add a new line.
            this.ContentTextBox.Text += "\r";
        }
        else
        {
            // SHIFT is not pressed, so execute my ENTER logic.
            this.Focus(FocusState.Programmatic);
        }
    }
}

Основываясь на этого поста , я былспособен придумать обходной путь, который функционально работает, но имеет визуальный побочный эффект.Я устанавливаю AcceptsReturn на true, а затем вручную удаляю новую строку, когда SHIFT нажата , а не , после чего выполняется код, который я хочу, когда нажимается только ENTER.Побочным эффектом является то, что текстовое поле расширяется, чтобы вместить новую строку, а затем сразу же снова сжимается, предполагая, что оно автоматически обрабатывает ввод ENTER еще до того, как мой обработчик будет запущен.Код для этого следующий:

private void ContentTextBox_KeyUp(object sender, KeyRoutedEventArgs e)
{
    // NOTE - AcceptsReturn is set to true in XAML.
    if (e.Key == VirtualKey.Enter)
    {
        // If SHIFT is pressed, this next IF is skipped over, so the
        //     default behavior of "AcceptsReturn" is used.
        var keyState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
        if ((keyState & CoreVirtualKeyStates.Down) != CoreVirtualKeyStates.Down)
        {
            // SHIFT is not pressed, so remove the new line.
            string textboxText = this.ContentTextBox.Text;
            textboxText = textboxText.Remove(textboxText.Length - 1);
            this.ContentTextBox.Text = textboxText;

            // Execute my ENTER logic.
            this.Focus(FocusState.Programmatic);
        }
    }
}

Есть ли другой способ сделать это или способ избавиться от этого побочного эффекта?Я попытался настроить значение e.IsHandled, но это не сработало (что имеет смысл, если поведение по умолчанию выполняется перед моим кодом).

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

(в продолжение комментария) Вы можете использовать PreviewKeyDown Событие как событие нажатия клавиши не будет срабатывать для клавиш с системной обработкой

  private void TextBox_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
        {
            if (Window.Current.CoreWindow.GetKeyState(VirtualKey.Shift).HasFlag(CoreVirtualKeyStates.Down)&& e.Key == Windows.System.VirtualKey.Enter)
            {
               //Add New Line
            }
            else if (e.Key == Windows.System.VirtualKey.Enter)
            {
                //This will prevent system from adding new line
                e.Handled = true;
            }
            else
            {
                e.Handled = false;
            }
        }
0 голосов
/ 11 декабря 2018

Обработка события PreviewKeyDown и пометка события как «обработанного» предотвращает добавление новой строки в первую очередь (и, таким образом, также предотвращает побочный эффект).Полный рабочий код:

private void ContentTextBox_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
    // NOTE - AcceptsReturn is set to true in XAML.
    if (e.Key == VirtualKey.Enter)
    {
        // If SHIFT is pressed, this next IF is skipped over, so the
        //     default behavior of "AcceptsReturn" is used.
        var keyState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
        if ((keyState & CoreVirtualKeyStates.Down) != CoreVirtualKeyStates.Down)
        {
            // Mark the event as handled, so the default behavior of 
            //    "AcceptsReturn" is not used.
            e.Handled = true;
        }
    }
}

private void ContentTextBox_KeyUp(object sender, KeyRoutedEventArgs e)
{
    // NOTE - AcceptsReturn is set to true in XAML.
    if (e.Key == VirtualKey.Enter)
    {
        // If SHIFT is pressed, this next IF is skipped over, so the
        //     default behavior of "AcceptsReturn" is used.
        var keyState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
        if ((keyState & CoreVirtualKeyStates.Down) != CoreVirtualKeyStates.Down)
        {
            // SHIFT is not pressed, so execute my ENTER logic.
            this.Focus(FocusState.Programmatic);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...