WPF TextBox и сохранение вкладок - PullRequest
0 голосов
/ 23 ноября 2018

Есть ли какой-нибудь элегантный способ разрешить вставку в WPF TextBox, для которого AcceptsTab установлено значение false, при сохранении вкладок в вставленном тексте?

Когда AcceptsTab имеет значение true, пользователь не может использовать вкладки для перехода кСледующий элемент управления, который не желателен моими пользователями.Но они хотят иметь вставленные вкладки, которые в настоящее время заменяются пробелами.

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Другой подход - установить AcceptsTab на true и переместить фокус при нажатии клавиши (Shift).

Приятным побочным эффектом является то, что все сценарии копирования / вставки все еще будут работать, но пользователь не сможет печатать вкладку.

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Tab)
    {
        var textBox = sender as TextBox;
        if (textBox != null)
        {
            var direction =
                e.KeyboardDevice.IsKeyDown(Key.LeftShift) || e.KeyboardDevice.IsKeyDown(Key.RightShift)
                    ? FocusNavigationDirection.Previous
                    : FocusNavigationDirection.Next;
            textBox.MoveFocus(new TraversalRequest(direction));
        }
    }
}
0 голосов
/ 23 ноября 2018

Я не уверен, что это квалифицируется как элегантно, но это работает, но может быть не так полно, как вы хотите (например, если щелкнуть правой кнопкой мыши в текстовом поле и выбрать Вставить из контекстного меню).

См. Вставить событие в текстовое поле WPF

. Установите AcceptsTab в значение true перед обработкой Ctrl-V и восстановите его после:

XAML:

<TextBox AcceptsTab="False"
         Height="200" 
         PreviewKeyDown="TextBox_PreviewKeyDown" 
         KeyUp="TextBox_KeyUp"/>

C #:

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (!(sender is TextBox textbox))
    {
        return;
    }

    if (e.Key == Key.V && (e.KeyboardDevice.IsKeyDown(Key.LeftCtrl) || e.KeyboardDevice.IsKeyDown(Key.RightCtrl)))
    {
        textbox.AcceptsTab = true;
    }
}

private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
    if (!(sender is TextBox textbox))
    {
        return;
    }

    textbox.AcceptsTab = false;
}

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

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