2010-03-08 2 views
0

Je crée un éditeur simple dans notre application en utilisant le RichTextBox de WPF. Au-dessus, j'ai ajouté les boutons reguslar comme Bold, Italic, etc. Ces boutons utilisent les commandes de RichTextBox pour définir ces propriétés, mais à côté de ces boutons, les commandes sont également envoyées avec CTRL + B, CTRL + I, etc. veulent que ces boutons représentent l'état actuel de RichTextBox au niveau du curseur. J'ai déjà découvert comment obtenir cet état et cela fonctionne quand je mets à jour cet état sur l'événement SelectionChanged. Cet événement ofcourse n'est pas déclenché lorsque Bold est activé, il n'y a donc pas de retour direct.Comment s'inscrire/écouter les commandes richtextbox?

Je voudrais savoir s'il y a un moyen d'écouter les commandes à appeler, sans affecter son comportement original ou d'autres idées pour résoudre mes problèmes.

J'ai essayé écouter la commande de la manière suivante:

CommandBinding boldBinding = new CommandBinding(EditingCommands.ToggleBold, CommandExecuted); 
    _richTextBox.CommandBindings.Add(boldBinding); 

et

private void CommandExecuted(object sender, ExecutedRoutedEventArgs e) { 
    UpdateProperties(); 
    e.Handled = false;  
} 

Cette mise à jour a les propriétés, mais le RichTextBox ne semblait pas recevoir la commande plus.

J'ai également essayé de créer mes propres commandes sur le contrôle contenant le RichTextBox, mais lorsque vous appuyez sur CTRL + B lorsque le RichTextBox a le focus, les commandes RichTextBox d'origine sont appelées à la place du nouveau.

Merci beaucoup d'avance!

Liewe

Répondre

2

Pour écouter les commandes appelé, vous pouvez utiliser les événements déclenchés par CommandManager: Exécuté ou PreviewExecuted.

Si vous changez XAML à:

<RichTextBox x:Name="_richTextBox" ... 
    CommandManager:PreviewExecuted="OnRichTextBoxCommand" ... /> 

vous obtenez la méthode OnRichTextBoxCommand appelé juste avant la commande est exécutée. Malheureusement, l'utilisation de l'événement attaché Exécuté ne fonctionne pas.

Cette méthode est appelée pour chaque événement, vous devez donc les filtrer:

private void OnRichTextBoxCommand(object sender, ExecutedRoutedEventArgs e) { 

     if (e.Command == EditingCommands.ToggleBold) { 
      UpdateProperties(); 
     } 
    } 

Il peut même être un peu plus complexe, car la sélection actuelle peut ne pas avoir changé lorsque cette méthode est appelée, si vous devez vous poster un message, par exemple comme ceci:

  Dispatcher.BeginInvoke(new Action(UpdateProperties)); 

(. si vous faites référence déjà System.Core, vous avez le type d'action, définir autrement un délégué prenant aucun paramètre et retour vide, et utiliser à la place)

+0

Cela fait l'affaire! Merci beaucoup! – Liewe