Подтвердить что ты не робот

TreeViewItem с TextBox в WPF: введите специальные символы

Мне нужно отредактировать некоторую иерархическую структуру, и я использую TreeView с TextBoxes

Краткий пример

<TreeView>
    <TreeView.Items>
        <TreeViewItem Header="Level 0">
            <!-- Level 1-->
            <TextBox Margin="5"
                     BorderThickness="1" BorderBrush="Black" />
        </TreeViewItem>
    </TreeView.Items>
</TreeView>

Когда я набираю TextBox, +, -, буквы и цифры работают нормально, стрелки работают, но когда я нажимаю -, элемент Level 0 обрушивается, и когда я набираю *, ничего не происходит

Как мне обрабатывать - и *, чтобы увидеть их в TextBox, как ожидалось?

Изменить:

- работает, если набирается как Key.OemMinus, но не с цифровой клавиатуры как Key.Subtract

* работает, если набирается как Shift + Key.D8, но не с цифровой клавиатуры как Key.Multiply

4b9b3361

Ответ 1

наконец решил проблему с Key.Subtract

Я добавил обработчик к PreviewKeyDown на TextBox

<TextBox Margin="5" BorderThickness="1" BorderBrush="Black" 
         PreviewKeyDown="TextBoxPreviewKeyDown"
/>

при приеме Key.Subtract, KeyDown помечен как обработанный, а затем я вручную поднимаю событие TextInput, как описано в этом , (Как я могу программно генерировать события нажатия клавиш на С#?)

private void TextBoxPreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Subtract)
    {
        e.Handled = true;

        var text = "-";
        var target = Keyboard.FocusedElement;
        var routedEvent = TextCompositionManager.TextInputEvent;

        target.RaiseEvent(
            new TextCompositionEventArgs
                (
                     InputManager.Current.PrimaryKeyboardDevice,
                    new TextComposition(InputManager.Current, target, text)
                )
                {
                    RoutedEvent = routedEvent
                });
    }
}

Ответ 2

Я могу предложить событие keydown для текстовых полей, которые у вас есть.

<TextBox Margin="5" KeyDown="TextBox_KeyDown"
                     BorderThickness="1" BorderBrush="Black" />


 private void TextBox_KeyDown(object sender, KeyEventArgs e)
 {
    TextBox txt = sender as TextBox;
    if(e.Key == Key.Subtract)
    {
        txt.Text += "-";
        txt.SelectionStart = txt.Text.Length;
        txt.SelectionLength = 0;
        e.Handled = true;
    }
    else if (e.Key == Key.Multiply)
    {
        txt.Text += "*";
        txt.SelectionStart = txt.Text.Length;
        txt.SelectionLength = 0;
        e.Handled = true;
    }
}

Это нехорошее решение, но оно работает. Если у вас есть другие "проблемы", вы можете добавить if к событию.

SelectionStart и SelectionLength предназначены для позиционирования курсора в конце текстового поля. И e.Handled = true; предотвращает поведение по умолчанию.