2010-07-23 7 views
8

Est-ce que quelqu'un sait pourquoi je ne peux pas définir un événement sur un modèle de contrôle?WPF - Evénements sur un ControlTemplate?

Par exemple, la ligne de code suivante ne compilera pas. Il le fait avec tous les événements dans un modèle de contrôle.

<ControlTemplate x:Key="DefaultTemplate" TargetType="ContentControl"> 
    <StackPanel Loaded="StackPanel_Loaded"> 

    </StackPanel> 
</ControlTemplate> 

J'utilise un modèle de conception MVVM et le contrôle se trouve ici dans un ResourceDictionary qui est ajouté aux MergedDictionaries de l'application.

+0

Pour quelqu'un avec la même question, j'utilise un style et EventSetter comme alternative, même si je voudrais toujours savoir pourquoi je ne peux pas Définir l'événement directement sur le contrôle si j'utilise un ControlTemplate. – Rachel

Répondre

11

Est-ce que quelqu'un sait pourquoi je ne peux pas définir un événement sur un modèle de contrôle?

En fait, vous pouvez ... Mais où voulez-vous que le gestionnaire d'événements soit défini? Le ResourceDictionary n'a pas de code-behind, donc il n'y a pas de place pour mettre le code du gestionnaire d'événements. Vous pouvez toutefois créer une classe pour votre dictionnaire de ressources, et l'associer à l'attribut x:Class:

<ResourceDictionary x:Class="MyNamespace.MyClass" 
        xmlns=...> 

    <ControlTemplate x:Key="DefaultTemplate" TargetType="ContentControl"> 
     <StackPanel Loaded="StackPanel_Loaded"> 

     </StackPanel> 
    </ControlTemplate> 

code C#:

namespace MyNamespace 
{ 
    public partial class MyClass : ResourceDictionary 
    { 
     void StackPanel_Loaded(object sender, RoutedEventArgs e) 
     { 
      ... 
     } 
    } 
} 

(vous pourriez aussi avoir besoin de modifier l'action de construction de la dictionnaire de ressources à "Page", je ne me souviens pas exactement ...)

+0

C'est ce que j'ai actuellement ... Une classe pour le ResourceDictionary avec son action de construction définie sur Page. La seule différence que je peux voir, c'est que je ne l'ai pas déclarée publique, mais changer ça n'a pas du tout aidé. – Rachel

+0

Et quel est le problème exactement? Avez-vous un message d'erreur? –

+0

Quand je vais exécuter le programme, il lance une exception NullReferenceException (il compile bien). Cela doit avoir quelque chose à voir avec mon motif de design parce que j'ai essayé de créer un cas de test simple et que ça fonctionne bien. Mon application principale écrase l'application OnStartup d'app.xaml pour charger un tas de ResourceDictionaries différentes, crée une instance de MainWindow, définit son DataContext, puis appelle MainWindow.Show() - La dernière ligne est l'endroit où je reçois l'exception. Déplacer l'événement du ControlTemplate vers un EventSetter élimine l'erreur. – Rachel

Questions connexes