2010-07-23 20 views
8

Denetim şablonunda neden bir etkinlik ayarlayamadığımı bilen var mı? Örneğin, aşağıdaki kod satırı derlenmeyecektir. Bunu bir kontrol şablonundaki herhangi bir olay ile yapar.WPF - Bir ControlTemplate'deki Olaylar?

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

    </StackPanel> 
</ControlTemplate> 

Bir MVVM tasarım desen ve burada uygulamanın MergedDictionaries eklenen bir ResourceDictionary bulunan denetimi kullanıyorum.

+0

Aynı soruya sahip olan herkes için bir Stil ve EventSetter kullanıyorum, yine de neden yapamayacağımı bilmek istiyorum ControlTemplate kullanıyorsanız, olayı doğrudan kontrol üzerinde ayarlayın. – Rachel

cevap

11

Denetim şablonunda neden bir etkinlik ayarlayamadığımı bilen var mı?

Aslında, şunları yapabilirsiniz ... Ancak olay işleyicisinin nerede tanımlanmasını bekliyorsunuz? ResourceDictionary kodun arkasında bulunmuyor, bu nedenle olay işleyici kodunu koyabilecek yer yok. Ancak, sizin kaynak sözlük için bir sınıf oluşturmak ve x:Class öznitelik ilişkilendirebilirsiniz: Ayrıca inşa eylemi değiştirmeniz gerekebilir (

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

:

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

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

     </StackPanel> 
    </ControlTemplate> 

C# kodu "Sayfa" kaynak sözlüğü, tam olarak hatırlamıyorum ...)

+0

Şu an sahip olduğum şey: Build Action (Sayfa Yap) öğesi ile ResourceDictionary için bir sınıf. Görebildiğim tek fark, onu kamuya açıklamamıştım, ama değişmek hiç işe yaramadı. – Rachel

+0

Ve sorun tam olarak nedir? Hata mesajı alıyor musunuz ? –

+0

Programı çalıştırmaya gittiğimde, bir NullReferenceException atar (iyi derler). Tasarım kalıbımla bir ilgisi olmalı, çünkü basit bir test vakası ve çalışma cezası oluşturmaya çalıştım. Benim ana uygulaması, farklı ResourceDictionaries bir demet yüklemek için app.xaml'ın OnStartup üzerine yazar, MainWindow bir örneğini oluşturur, onun DataContext ayarlar, sonra MainWindow.Show çağırır.() - Son satır istisna alıyorum. Olayı ControlTemplate'den bir EventSetter'e taşımak hatadan kurtulur. – Rachel