2010-07-04 20 views
0

J'essaie de créer un événement généralisé pour mes boutons de fermeture, dans lesquels ils doivent fermer la fenêtre, mais avant de définir le focus sur la fenêtre du propriétaire. Je ne veux pas avoir d'événement pour chaque fichier, car ce serait plutôt peu pratique puisque j'ai plus de 30 fenêtres dans mon application. (Donc, si je voulais changer ce comportement, je devrais changer sur 30 fichiers à chaque fois)Extensions de balisage personnalisées return RoutedEvents

Je ne suis pas sûr si c'est l'approche correcte, mais j'ai essayé de faire une extension MarkUp qui renvoie un delegate(object sender, RoutedEventArgs e) Voici la code:

delegate void RoutedDelegate(object sender, RoutedEventArgs e); 
[MarkupExtensionReturnType(typeof(RoutedEvent))] 
public class CloseWindowExtension : MarkupExtension 
{ 
    Window win = null; 

    public Window Win 
    { 
     get { return this.win; } 
     set { this.win = value; } 
    } 

    public CloseWindowExtension(Window win) 
     : base() 
    { 
     this.win = win; 
    } 



    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (win == null) 
     { 
      throw new InvalidOperationException("The window must be specified!"); 
     } 

     return new RoutedDelegate(delegate(object sender, RoutedEventArgs e) 
     { 
      Extensions.FocusClose(win); 
     }); 
    } 
} 

La méthode FocusClose obtient une fenêtre, la ferme, mais définit le focus à son propriétaire avant. Mais je ne peux pas le faire fonctionner. Quand je tournerai mon bouton dans le XAML,

Button Click="{e:CloseWindow {Binding win}}" 

(victoire est mon nom de la fenêtre), je reçois le message d'erreur:

Cliquez = "{e: CloseWindow {gagnant Binding}}" est pas valide . '{e: CloseWindow {Binding win}}' n'est pas un nom de méthode de gestionnaire d'événements valide. Seules les méthodes d'instance de la classe generated ou code-behind sont valides. Ligne 28 Position 17.

Est-ce que je fais quelque chose de mal? Est-ce la meilleure approche ou ai-je d'autres options? Merci d'avance!

Clark

Répondre

1

Vous ne pouvez pas utiliser une extension de balisage pour définir un gestionnaire d'événements. Au lieu de cela, vous pouvez utiliser un comportement joint, ce qui vous permet de lier une commande à un événement.

Voir this article par Marlon Grech pour plus de détails

0

.NET 4.5+ prend en charge les extensions de balisage pour les événements, afin que vous puissiez mettre en œuvre ce que vous vouliez maintenant :)