2012-07-16 7 views
0

Si j'ai plusieurs TextBoxes et autres contrôles d'insertion de texte et que je veux créer des boutons qui insèrent des caractères spéciaux dans le TextBox, quel est le meilleur contrôle pour cela et quelles propriétés devraient être définies?Dans WPF, quel est le meilleur moyen de créer des boutons qui insèrent des caractères spéciaux dans plusieurs TextBox?

Exigences pour les boutons:

  1. Les boutons ne volent pas le focus lorsque vous cliquez dessus.
  2. Les boutons peuvent insérer du texte (par exemple des caractères spéciaux) dans n'importe quel contrôle acceptant l'entrée au clavier.
  3. Le curseur doit se déplacer comme si l'utilisateur avait entré le texte sur le clavier.

Si # 2 n'est pas possible, il suffira de limiter les contrôles aux TextBox uniquement.

NOTE: Je ne veux pas faire les boutons unfocusable, que de telle sorte qu'ils ne volent pas le focus lorsque vous cliquez dessus.

+0

Force brute peu enregistrer un événement de focus perdu sur chaque contrôle qui accepte l'entrée au clavier qui enregistre une référence au contrôle du clavier de l'interface utilisateur. – Paparazzi

Répondre

0

Je ne suis pas au courant d'aucun bouton qui ne vole pas le focus lorsque l'on clique dessus, mais poignée en bouton événement click vous pouvez Repassez propriétaire précédent. Si je devais l'implémenter, je créerais un comportement attaché au panneau parent de toutes les zones de texte spéciales et à tous les boutons qui doivent insérer du texte.

<StackPanel> 
    <i:Interaction.Behaviors> 
     <local:TextBoxStateTracker/> 
    </i:Interaction.Behaviors> 
    <TextBox /> 

    <Button Content="description" Tag="?" /> 
</StackPanel> 

Par souci de simplicité, j'ai mis du texte à insérer dans la zone de texte de la propriété Variable.

public class TextBoxStateTracker : Behavior<Panel> 
{ 
private TextBox _previouslySelectedElement; 
private int _selectionStart; 
private int _selectionLength; 

protected override void OnAttached() 
{ 
//after control and all its children are created find textboxes and buttons 
    AssociatedObject.Initialized += (x, y) => 
     { 
      var textBoxElements = FindChildren<TextBox>(AssociatedObject); 
      foreach (var item in textBoxElements) 
      { 
       item.LostFocus += new RoutedEventHandler(item_LostFocus); 
      } 

      var buttons = FindChildren<Button>(AssociatedObject); 
      foreach (var item in buttons) 
      { 
       item.Click += new RoutedEventHandler(item_Click); 
      } 
     }; 
} 

private void item_Click(object sender, RoutedEventArgs e) 
{ 
    if (_previouslySelectedElement == null) return; 
    //simply replace selected text in previously focused textbox with whatever is in tag property 
    var button = (Button)sender; 
    var textToInsert = (string)button.Tag; 

    _previouslySelectedElement.Text = _previouslySelectedElement.Text.Substring(0, _selectionStart) 
     + textToInsert + 
     _previouslySelectedElement.Text.Substring(_selectionStart + _selectionLength); 
    _previouslySelectedElement.Focus(); 
    _previouslySelectedElement.SelectionStart = _selectionStart + textToInsert.Length; 
} 

private void item_LostFocus(object sender, RoutedEventArgs e) 
{ 
    //this method is fired when textboxes loose their focus note that this 
    //might not be fired by button click 
    _previouslySelectedElement = (TextBox)sender; 
    _selectionStart = _previouslySelectedElement.SelectionStart; 
    _selectionLength = _previouslySelectedElement.SelectionLength; 
} 

public List<TChild> FindChildren<TChild>(DependencyObject d) 
    where TChild : DependencyObject 
{ 
    List<TChild> children = new List<TChild>(); 

    int childCount = VisualTreeHelper.GetChildrenCount(d); 

    for (int i = 0; i < childCount; i++) 
    { 
     DependencyObject o = VisualTreeHelper.GetChild(d, i); 

     if (o is TChild) 
      children.Add(o as TChild); 

     foreach (TChild c in FindChildren<TChild>(o)) 
      children.Add(c); 
    } 

    return children; 
} 

}

Cela fait plus ou moins ce que vous avez décrit, mais il est loin d'être parfait, je pense qu'il est assez pour vous aider à démarrer.

0

Vous devez remplacer le modèle d'un label et d'un TextBox.

exigences 1 et 2 - peut être fait à l'intérieur du modèle pour le label qui agira comme un bouton.

exigence 3 - peut être fait à l'intérieur du modèle pour la zone de texte.

Ce n'est pas facile ...
vous devrez peut-être apprendre beaucoup de style WPF, XAML et remplacer le modèle de contrôle. peut-être même en créant un contrôle personnalisé.

Questions connexes