2015-08-28 19 views
21

muszę zmieniać trochę strukturę hierarchiczną i używam TreeView z TextBoxesTreeViewItem z TextBox w WPF: Rodzaj znaki specjalne

krótki przykład

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

Po wpisaniu w TextBox, +, -, liter i Cyfry działają poprawnie, strzałki działają, ale gdy naciskam -, pozycja Level 0 zwija się i gdy wpisuję *, nic się nie dzieje

Jak powinienem obsługiwać - i *, aby zobaczyć je w TextBox zgodnie z oczekiwaniami?

Edit:

- prace jeśli wpisane jako Key.OemMinus ale nie z klawiatury numerycznej jak Key.Subtract

* działa, jeśli wpisane jako Shift + Key.D8 ale nie z klawiatury numerycznej jako Key.Multiply

+0

'Key.Multiply' powinno działać poprawnie. Robi to w moim rozwiązaniu. – Kcvin

+0

@NETscape, to nie działa dla mnie, gdy próbuję wpisać 'Key.Multiply' w TextBox, gdy wybrano element' Level 0' – ASh

+0

Ahh, teraz wybrałem element, najpierw go wybrałem, a nie praca. Ciekawy! – Kcvin

Odpowiedz

14

ostatecznie rozwiązany problem Key.Subtract

Po dodaniu obsługi do PreviewKeyDown na TextBox

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

po otrzymaniu Key.Subtract, KeyDown oznaczony jako obsłużone i ręcznie podnieść TextInput zdarzenie, jak wyjaśniono w niniejszym answer (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

mogę zaproponować Zdarzenie keydown dla posiadanych pól tekstowych.

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

To nie jest dobre rozwiązanie, ale działa. Jeśli masz inne klawisze "problemu", możesz dodać, jeśli do wydarzenia.

SelectionStart i SelectionLength służą do pozycjonowania kursora na końcu pola tekstowego. I e.Handled = true; zapobiega domyślnemu zachowaniu.

+0

dziękuję za sugestię, 'txt.Text + =" - ";' nie jest dokładnie tym, czego potrzebowałem (może być wybrany tekst do zastąpienia). Musiałem znaleźć inne rozwiązanie – ASh