2009-03-29 6 views
4

Je cherche un moyen de pouvoir exécuter un événement après l'exécution d'une commande. Je travaille avec EditingCommands (ToggleBold, ToggleItalic ... ect.) Et voudrait pouvoir avoir une méthode appelée directement après que la commande ait fini ce qu'elle fait. Un exemple serait que j'ai du texte sélectionné et appuyez sur Ctrl + B et qui exécute EditingCommands.ToggleBold. Juste après que le texte soit basculé je veux appeler une méthode qui mettra à jour un ToggleButton qui est connecté avec la sélection FontWeight. J'ai essayé d'utiliser l'événement Executed mais c'est malheureusement pour moi appelé avant que le texte ne soit affecté et par conséquent met à jour le bouton avec des informations qui vont changer en une seconde. Est-ce que quelqu'un sait un moyen de contourner cela? Merci pour toute aide!Appel d'un événement après exécution de la commande

Vive

Répondre

4

Une solution consiste à la file d'attente d'un autre message dans votre gestionnaire Exécuté:

void copy_Executed(object sender, EventArgs e) 
{ 
    Dispatcher.BeginInvoke(new ThreadStart(delegate() 
    { 
     //do update of bold button here 
    }), null); 
} 

Cela permettra d'assurer votre travail est ajouté à l'arrière de la file d'attente, et sera exécuté après d'autres messages de même priorité ou de priorité plus élevée.

Cependant, je voudrais suggérer une meilleure solution. Si vous y réfléchissez, le bouton en gras est responsable de l'exécution de deux commandes différentes: mettre en gras et normaliser. Il bascule entre ces deux commandes en fonction de la position du texte/curseur sélectionnée. Par conséquent, vous pouvez écrire une coutume ICommand mise en œuvre qui encapsule deux sous-commandes (code complètement non testé):

public class TogglingCommand : ICommand 
{ 
    private readonly ICommand _command1; 
    private readonly ICommand _command2; 
    private ICommand _activeCommand; 

    public TogglingCommand(ICommand command1, ICommand command2) 
    { 
     _command1 = command1; 
     _command2 = command2; 
    } 

    public ICommand ActiveCommand 
    { 
     get { return _activeCommand; } 
    } 

    public bool CanExecute(object parameter) 
    { 
     if (_command1.CanExecute(parameter)) 
     { 
      _activeCommand = _command1; 
     } 
     else if (_command2.CanExecute(parameter)) 
     { 
      _activeCommand = _command2; 
     } 
     else 
     { 
      _activeCommand = null; 
     } 

     return _activeCommand != null; 
    } 

    public void Execute(object parameter) 
    { 
     _activeCommand.Execute(parameter); 
    } 
} 

Vous pouvez alors construire un TogglingCommand avec deux commandes: un à Bolden et un au texte unbolden. Ensuite, vous pouvez lier le Button dans votre interface utilisateur à la propriété ActiveCommand pour le modifier comme vous le souhaitez en fonction de ce qui se passera lorsque vous cliquerez sur la commande. Par exemple, si vous utilisez un ToggleButton, vous devez lier IsChecked à ActiveCommand et le convertir en true est la commande active qui n'est pas affectée. Bien sûr, les commandes bolden et unbolden ont besoin de leur propre logique qui inspecte le texte sélectionné.

+0

Merci Kent. J'ai découvert que mon vrai problème est que lorsque je mets le gestionnaire Executed d'un de ces EditingCommands, il n'appellera pas celui par défaut. Je n'ai pas remarqué cela parce que j'avais les CommandBindings dans la Grille et pas RichTextBox donc ils ne fonctionnaient pas. Je vais juste les implémenter. – Jasson

0

Pouvez-vous utiliser le Exécuté (passé) routé Gestionnaire d'événements? (Ou peut-être est ce que vous dites que vous avez essayé)

public partial class CustomerWindow : Window 
{ 
    public CustomerWindow() 
    { 
     InitializeComponent(); 

     CommandBinding binding = new CommandBinding(ApplicationCommands.Copy); 
     binding.Executed += new ExecutedRoutedEventHandler(this.copy_Executed); 
     this.CommandBindings.Add(binding); 
    } 

    void copy_Executed(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show("Executed the Copy command"); 
    } 
} 
+0

C'est ce que j'essayais. Comme je l'ai mentionné dans un commentaire à la réponse par Kent, cela ne fonctionne pas car il semble remplacer les EditingCommands par défaut même avec e.Handled = false; – Jasson

Questions connexes