2010-07-23 26 views
8

¿Alguien sabe por qué no puedo establecer un evento en una plantilla de control?WPF: ¿eventos en una plantilla de control?

Por ejemplo, la siguiente línea de código no se compilará. Hace esto con cualquier evento en una plantilla de control.

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

    </StackPanel> 
</ControlTemplate> 

estoy usando un patrón de diseño MVVM y el control que aquí se encuentra en una ResourceDictionary que se añade a MergedDictionaries de la aplicación.

+0

Para cualquier persona con la misma pregunta, estoy utilizando un estilo y EventSetter como alternativa, aunque todavía me gustaría saber por qué no puedo establecer el evento directamente en el control si estoy usando una plantilla de control. – Rachel

Respuesta

11

¿Alguien sabe por qué no puedo establecer un evento en una plantilla de control?

En realidad, puede ... Pero, ¿dónde espera que se defina el controlador de eventos? El ResourceDictionary no tiene código subyacente, por lo que no hay lugar para colocar el código del controlador de eventos. Puede, sin embargo, crear una clase para su diccionario de recursos, y asociarlo con el atributo x:Class:

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

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

     </StackPanel> 
    </ControlTemplate> 

código C#:

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

(también podría ser necesario cambiar la acción de construcción de la diccionario de recursos para "Página", no recuerdo exactamente ...)

+0

Eso es lo que tengo actualmente ... Una clase para ResourceDictionary con su Build Action configurada en Page. La única diferencia que puedo ver es que no la declaró pública, pero cambiar eso no me ayudó para nada. – Rachel

+0

¿Y cuál es el problema exactamente? ¿Recibes un mensaje de error? –

+0

Cuando voy a ejecutar el programa, arroja una NullReferenceException (compila bien). Debe tener algo que ver con mi patrón de diseño porque traté de crear un caso de prueba simple y está funcionando bien. Mi aplicación principal sobrescribe app.xaml's OnStartup para cargar un montón de diferentes ResourceDictionaries, crea una instancia de MainWindow, establece su DataContext, luego llama a MainWindow.Show() - La última línea es donde obtengo la excepción. Mover el evento de ControlTemplate a EventSetter elimina el error. – Rachel

Cuestiones relacionadas