2010-07-23 14 views
8

Czy ktoś wie, dlaczego nie mogę ustawić zdarzenia w szablonie sterowania?WPF - Zdarzenia na ControlTemplate?

Na przykład poniższy wiersz kodu nie zostanie skompilowany. Czyni to z dowolnymi zdarzeniami w szablonie kontrolnym.

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

    </StackPanel> 
</ControlTemplate> 

używam wzorca projektowego MVVM i kontrolę tutaj znajduje się w ResourceDictionary który jest dodawany do MergedDictionaries aplikacji.

+0

Dla każdego, kto ma to samo pytanie, używam opcji Style i EventSetter jako alternatywy, chociaż nadal chciałbym wiedzieć, dlaczego nie mogę ustaw Event bezpośrednio na formantu, jeśli korzystam z ControlTemplate. – Rachel

Odpowiedz

11

Czy ktoś wie, dlaczego nie mogę ustawić zdarzenia na szablonie sterowania?

Właściwie można ... Ale gdzie można się spodziewać, że program obsługi zdarzeń zostanie zdefiniowany? ResourceDictionary nie ma kodu źródłowego, więc nie ma miejsca na kod obsługi zdarzenia. Można jednak utworzyć klasę dla słownika zasobów, i skojarzyć ją z atrybutem x:Class:

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

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

     </StackPanel> 
    </ControlTemplate> 

kodu C#:

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

(może trzeba także zmienić działanie kompilacji Słownik zasobów na "Stronę", nie pamiętam dokładnie ...)

+0

To właśnie mam obecnie ... Klasa dla ResourceDictionary z jego Akcja kompilacji ustawiona na Stronę. Widzę tylko różnicę, że nie ogłaszam tego publicznie, ale zmiana, która nie pomogła wcale. – Rachel

+0

I jaki jest dokładnie problem? Czy otrzymujesz komunikat o błędzie? –

+0

Kiedy idę do uruchomienia programu, generuje wyjątek NullReferenceException (kompiluje się dobrze). Musi mieć coś wspólnego z moim wzorcem projektowym, ponieważ próbowałem stworzyć prosty przypadek testowy i jego sprawne działanie. Moja główna aplikacja nadpisuje appStayup na app.xaml, aby załadować kilka różnych ResourceDictionaries, tworzy instancję MainWindow, ustawia jej DataContext, a następnie wywołuje MainWindow.Show() - Ostatnia linia jest tam, gdzie dostaję wyjątek. Przeniesienie zdarzenia z ControlTemplate do EventSettera usuwa błąd. – Rachel