2015-08-28 10 views
21

Ich brauche eine hierarchische Struktur zu bearbeiten und ich verwende TreeView mit TextBoxesTreeViewItem mit TextBox in WPF: Typ Sonderzeichen

Kurz Beispiel

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

Wenn ich tippe in TextBox, +, -, Briefe und Ziffern funktionieren gut, Pfeile funktionieren, aber wenn ich - drücke, Level 0 Artikel zusammenbricht und wenn ich * schreibe, passiert nichts

Wie soll ich mit - und * umgehen, um sie in TextBox zu sehen, wie erwartet?

Edit:

- funktioniert, wenn als Key.OemMinus getippt, aber nicht von der numerischen Tastatur als Key.Subtract

* funktioniert, wenn als Shift + Key.D8 getippt, aber nicht von der numerischen Tastatur als Key.Multiply

+0

'Key.Multiply' sollte gut funktionieren. Es ist in meiner Lösung. – Kcvin

+0

@NETscape, es funktioniert nicht für mich, wenn ich versuche, 'Key.Multiply' in TextBox einzugeben, wenn' Level 0' Element ausgewählt ist – ASh

+0

Ahh, jetzt habe ich das Element auswählbar, wählte es zuerst, und es tat es nicht Arbeit. Interessant! – Kcvin

Antwort

14

gelöst endlich das Problem mit Key.Subtract

Ich habe Handler PreviewKeyDown auf TextBox

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

auf Key.Subtract Empfang KeyDown als behandelt markiert und dann erhebe ich manuell TextInput Ereignis wie in diesem answer erklärt (How can I programmatically generate keypress events in 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 
       }); 
    } 
} 
5

Ich kann ein vorschlagen Keydown-Ereignis für die Textfelder, die Sie haben.

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

Es ist keine gute Lösung, aber es funktioniert. Wenn Sie andere "Problem" -Schlüssel haben, können Sie dem Ereignis ein if hinzufügen.

SelectionStart und SelectionLength sind für die Positionierung des Cursors am Ende der Textbox. Und e.Handled = true; verhindert das Standardverhalten.

+0

danke für den Vorschlag, 'txt.Text + =" - ";' ist nicht genau das, was ich brauchte (es kann ausgewählter Text ersetzt werden). Ich musste einen anderen Workaround finden – ASh