2013-06-25 2 views
1

Je hérite d'un contrôle de fenêtre qui gère déjà la commande ApplicationCommands.Close afin qu'il gère la fermeture de la fenêtre en mode natif.Comment ajouter des actions supplémentaires à la commande

Je voudrais ajouter/remplacer la fonctionnalité existante, mais je n'arrive pas à comprendre comment faire cela.

Essayé:

  • Ajout d'un autre de la même commande à CommandBindings (première déclarée semble gagner)
  • Vérifiez si la commande est déjà existant ... peut sembler ne pas trouver un moyen de faire

Répondre

1

Il y a plusieurs choses que vous pouvez essayer. Si vous essayez juste d'empêcher la fenêtre de fermeture, vous pouvez remplacer la méthode OnClosing et définir l'indicateur annulé: Si vous souhaitez modifier spécifiquement le comportement, vous pouvez vous inscrire

protected override void OnClosing(CancelEventArgs e) 
{ 
    e.Cancel = true; 
    base.OnClosing(e); 
} 

avec les versions d'aperçu de la commande: Les événements routés de prévisualisation se produiront avant les événements standard, vous permettant de gérer la logique avant votre classe de base.

+0

Yah, je suis en train d'essayer et j'ai pensé que je devrais aller avec l'événement Closing. Je ne peux pas utiliser l'aperçu à cause de ce bogue http://stackoverflow.com/questions/2281825/routeduicommand-previewexecuted-bug J'ai l'impression que ce problème pourrait réapparaître, donc je vais le laisser ouvert dans l'espoir d'un répondre à ma question réelle. Encore +1 –

+0

Cela ressemble à un méchant bug. Je l'ai juste ouvert dans un réflecteur, et dans .NET 4.5 au moins, à moins que vous ne définissiez e.Handled = true dans le gestionnaire d'événements preview, le gestionnaire normal sera toujours appelé. Donc, selon la version de .NET que vous utilisez, cela peut fonctionner! –

+0

Yah, nous sommes .NET 4.0 :( –

0

Si vous souhaitez remplacer la fonctionnalité de la commande globale, vous pouvez rechercher la liaison de commande spécifique, la supprimer puis ajouter votre propre logique. Voir ci-dessous.

public ChildWindow() 
     :base() 
    { 
     var appCloseCommandBinding = 
      CommandBindings.Cast<CommandBinding>().SingleOrDefault(item => item.Command == ApplicationCommands.Close); 

     if(appCloseCommandBinding != null) 
      CommandBindings.Remove(appCloseCommandBinding); 

     CommandBindings.Add(new CommandBinding(ApplicationCommands.Close, YourCommandLogic)); 
    } 

Espérons que cela peut aider.

Questions connexes