Текстовое поле преобразует отправленный ключ: Alt + Enter -> Enter - PullRequest
4 голосов
/ 15 ноября 2011

Я бы хотел иметь возможность изменять поведение текстового поля wpf без необходимости реализации нового класса.

Я хочу, чтобы в Excel было как поведение ввода / Alt + Enter, когда пользователь нажимает «Enter», текстовое поле проверяется (movefocus ...), но когда он нажимает «ALT + Enter», в текстовое поле необходимо добавить новый строка (мое текстовое поле поддерживает многострочный текст: AcceptsReturn имеет значение true).

Я пробовал (в текстовом поле PreviewKeyDown): - Повышение для создания KeyEventArgs и TextCompositionEventArgs по этой ссылке: Как программно генерировать события нажатия клавиш в C #? - Я пробовал SendKeys.SendWait ("{ENTER}"), но он отправляет много новых команд строки

Есть ли способ сделать это?

Спасибо

    private void m_MeasurementName_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        var tb = (sender as TextBox);

        if (Keyboard.Modifiers == ModifierKeys.Alt && Keyboard.IsKeyDown(Key.Enter))
        {
            // 1st try
            var key = "\n\r";
            var routedEvent = Keyboard.KeyDownEvent;
            tb.RaiseEvent(new TextCompositionEventArgs(InputManager.Current.PrimaryKeyboardDevice, new TextComposition(InputManager.Current, tb, key)) { RoutedEvent = routedEvent });

            // 2nd
            var key = Key.Enter;
            var routedEvent = TextCompositionManager.TextInputEvent;
            tb.RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, PresentationSource.FromVisual(tb), 0, key) { RoutedEvent = routedEvent });

            // 3rd
            System.Windows.Forms.SendKeys.SendWait("{ENTER}");

            // 4th Strangely works but not ... you know
            MessageBox.Show("ALT+ENTER");

            e.Handled = true;
        }
        else if (Keyboard.IsKeyDown(Key.Enter))
        {
            tb.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            e.Handled = true;
        }
    }

1 Ответ

7 голосов
/ 15 ноября 2011

Если пользователь нажимает Alt + Enter, просто добавьте новую строку в существующую TextBox.Text.Если они нажимают просто Enter, активируйте UpdateSource в текстовой привязке

private void m_MeasurementName_PreviewKeyDown(object sender, KeyEventArgs e)
{
    var tb = (sender as TextBox);

    if (Keyboard.Modifiers == ModifierKeys.Alt && Keyboard.IsKeyDown(Key.Enter))
    {
        tb.Text += "\r\n";
        tb.SelectionStart = tb.Text.Length;

        e.Handled = true;
    }
    else if (Keyboard.IsKeyDown(Key.Enter))
    {
        var textBinding = BindingOperations.GetBindingExpression(
            tb, TextBox.TextProperty);

        if (textBinding != null)
            textBinding.UpdateSource();

        e.Handled = true;
    }
}

Чтобы NewLine работал, убедитесь, что AcceptsReturn="True" на TextBox

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