Я хотел бы настроить поведение 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
, но это не сработало (что имеет смысл, если поведение по умолчанию выполняется перед моим кодом).