2010-05-30 14 views
11

Tengo un control personalizado que utiliza algunos controles PARTE:no OnApplyTemplate llamada en control personalizado

[TemplatePart(Name = "PART_TitleTextBox", Type = typeof(TextBox))] 
    [TemplatePart(Name = "PART_TitleIndexText", Type = typeof(Label))] 
    [TemplatePart(Name = "PART_TimeCodeInText", Type = typeof(TextBlock))] 
    [TemplatePart(Name = "PART_TimeCodeOutText", Type = typeof(TextBlock))] 
    [TemplatePart(Name = "PART_ApprovedImage", Type = typeof(Image))] 
    [TemplatePart(Name = "PART_CommentsImage", Type = typeof(Image))] 
    [TemplatePart(Name = "PART_BookmarkedImage", Type = typeof(Image))] 
    public class TitleBoxNew : Control 
    { 
     static TitleBoxNew() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(
       typeof(TitleBoxNew), 
       new FrameworkPropertyMetadata(typeof(TitleBoxNew))); 
     } 

     public TitleBoxNew() { } 

     // ... rest of class 
    } 

Este control es reemplazar OnApplyTemplate:

public override void OnApplyTemplate() 
{ 
     base.OnApplyTemplate(); 

     InitializeEvents(); 
} 

que funciona bien, la mayor parte del tiempo. He agregado el control dentro de un control de pestañas personalizado en una ventana y de alguna manera OnApplyTemplate nunca se llama para ese control. ¿Por qué esto no funciona como espero?

+4

-1 para perder los estribos. – zneak

+6

eres un miembro por primera vez y estás usando la palabra F. Intenta ver si a esta comunidad le gusta antes de publicarla. – vladv

+2

-1 para el idioma. –

Respuesta

3

no puedo ver a su constructor, pero no se olvide de establecer la DefaultStyleKey:

DefaultStyleKeyProperty.OverrideMetadata(typeof(TitleBoxNew), new FrameworkPropertyMetadata(typeof(TitleBoxNew))); 
+0

Sí i frogot mencionar que, ya tengo esto: TitleBoxNew estática() { DefaultStyleKeyProperty.OverrideMetadata (typeof (TitleBoxNew), nuevos FrameworkPropertyMetadata (typeof (TitleBoxNew))); } public TitleBoxNew() { } –

+0

Nice wrapping stackoverflow, well done –

+10

Por favor, edite su publicación de orignal para contener su constructor; los comentarios no son el lugar correcto para el código. –

37

Para cualquier persona que pueda tropezar con este post, que estaba teniendo el mismo problema y lo logrado resolver añadiendo lo siguiente en los AssemblyInfo.cs del proyecto que contiene mi control personalizado: plantilla

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 
    //(used if a resource is not found in the page, 
    // or application resource dictionaries) 
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries) 
)] 

mi de control se encuentra en el archivo de tema/Generic.xaml en el mismo proyecto que el control.

+2

Esto me salvó el día. Literalmente. Muchas gracias. –

+1

Esto resolvió mi problema después de mover algunos controles personalizados de WPF a una Biblioteca de clases C# normal que inicialmente no se creó como "Biblioteca de control personalizado de WPF". BTW: También se agregó el elemento XML requerido al .csproj para actualizar la biblioteca de clases a una biblioteca de clases WPF "real". – candritzky

20

Las otras dos respuestas son correctas ... pero no completas. De acuerdo con this post (y mi experiencia de solo resolver este problema) hay 4 cosas que necesita verificar: (por alguna razón, los bloques de código en esta publicación no se mantendrían formateados si usara números o guiones ... entonces las letras son)

A. La plantilla y los estilos de controles deben estar ubicados en el archivo Generic.xaml, una carpeta llamada Themes de la raíz de su proyecto.

B. Asegúrese de que sus espacios de nombres son correctos en el Generic.xaml

C. establecer la clave de estilo en el constructor de su control. También se recomienda ampliamente que ponga lo siguiente en un constructor estático.

static YourControl() 
{ 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(YourControl), new FrameworkPropertyMetadata(typeof(YourControl))); 
} 

D. Asegúrese de que la siguiente es en sus AssemblyInfo.cs

[assembly: ThemeInfo(ResourceDictionaryLocation.None, 
//where theme specific resource dictionaries are located 
//(used if a resource is not found in the  
// or application resource dictionaries) 
ResourceDictionaryLocation.SourceAssembly 
//where the generic resource dictionary is located 
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries) 
)] 
+0

¡El paso 'A' fue suficiente para resolver mi problema, gracias! ('uwp') – rubStackOverflow

1

voy a añadir mi propia respuesta, porque tanto las respuestas anteriores son incompletas ya que he estado luchando con este problema para algunos Ahora.

Como dijo por MoMo y Kai G anterior:

A. La plantilla y estilos controles deben estar ubicados en el Generic.xaml presentar una carpeta llamada Temas de la raíz de su proyecto.

B. Asegúrese de que sus espacios de nombres son correctos en el Generic.xaml

C. establecer la clave de estilo en el constructor de su control.

D. Asegurar el atributo tema se encuentra en el archivo de AssemblyInfo.cs

Pero también es necesario para asegurarse de que su archivo Generic.xaml se establece para la Acción de generación como Página: No copie.

Si no puede hacer esto o si el valor se estableció de alguna manera en algo distinto, el método OnApplyTemplate() no se invocará.

+0

La Parte D es de especial importancia, IMO. –

1

respuesta de @MoMo es correcta, pero, además:

E: Se espera que los temas/Generic.xaml se encuentra en la raíz del proyecto. Si este no es el caso y tu Generic.xaml no está en la raíz, entonces tienes que crear un directorio Themes with Generic.xaml en la raíz (Generic.xaml es solo del tipo ResourceDictionary). En ese Generic.xaml necesita hacer referencia a la ubicación de su Generic.xaml.

ej .:

<ResourceDictionary Source="/Foo.Bar;component/Controls/FooControl/Themes/Generic.xaml" />

Cuestiones relacionadas