c# wpf treeview

c# - TreeViewItem con TextBox en WPF: escriba caracteres especiales



(2)

Finalmente resolví el problema con Key.Subtract

PreviewKeyDown el controlador a PreviewKeyDown en TextBox

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

al recibir Key.Subtract , KeyDown se marca como manejado y luego levanto manualmente el evento TextInput como se explica en esta answer ( ¿Cómo puedo generar eventos de pulsación de tecla en C #? )

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 }); } }

Necesito editar alguna estructura jerárquica y uso TreeView con TextBoxes

Breve ejemplo

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

Cuando TextBox , + , - , las letras y los dígitos funcionan bien, las flechas funcionan pero cuando presiono - , el elemento del Level 0 se colapsa y cuando escribo * , no ocurre nada

¿Cómo debo manejar - y * para verlos en TextBox como se esperaba?

Editar:

- Funciona si se escribe como Key.OemMinus pero no desde el teclado numérico como Key.Subtract

* funciona si se escribe como Shift + Key.D8 pero no desde el teclado numérico como Key.Multiply


Puedo sugerir un evento keydown para los cuadros de texto que tiene.

<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; } }

No es una buena solución pero funciona. Si tiene otras claves de "problema", puede agregar un if al evento.

SelectionStart y SelectionLength son para colocar el cursor al final del cuadro de texto. Y e.Handled = true; evita el comportamiento por defecto.