2010-05-30 12 views
11

ich ein Custom Control haben, die ein Teil Steuerelemente verwendet:OnApplyTemplate nicht in Custom Control namens

[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 
    } 

Diese Steuerung wird überschrieben OnApplyTemplate:

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

     InitializeEvents(); 
} 

, die gut, die meiste Zeit funktioniert. Ich habe das Steuerelement in einem benutzerdefinierten Tab-Steuerelement in einem Fenster hinzugefügt und irgendwie wird OnApplyTemplate nie für dieses Steuerelement aufgerufen! Warum funktioniert das nicht so, wie ich es erwarte?

+4

-1 für Ihr Temperament zu verlieren. – zneak

+6

Sie sind ein Mitglied zum ersten Mal und Sie verwenden das F-Wort. Versuchen Sie zu sehen, ob diese Community es mag, bevor Sie es veröffentlichen. – vladv

+2

-1 für die Sprache. –

Antwort

3

ich nicht Konstruktor sehen kann, aber nicht vergessen, die DefaultStyleKey einzustellen:

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

Ja i frogot zu erwähnen, dass ich bereits habe dies: statische TitleBoxNew() { DefaultStyleKeyProperty.OverrideMetadata (typeof (TitleBoxNew), neuer FrameworkPropertyMetadata (typeof (TitleBoxNew))); } public TitleBoxNew() { } –

+0

Schöne Verpackung stackoverflow, gut gemacht –

+10

Bitte bearbeiten Sie Ihre originale Post, um Ihren Konstruktor zu enthalten; Kommentare sind nicht der richtige Ort für Code. –

37

Für alle anderen, die auf diesen Beitrag stolpern könnte, war ich das gleiche Problem hat und ich es geschafft, zu lösen es durch den folgenden in die AssemblyInfo.cs des Projektes Hinzufügen von meiner benutzerdefinierten Steuerelement enthält:

[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) 
)] 

Vorlage meiner Kontrolle der in der Datei Themen-/generic.xaml im selben Projekt wie die Kontrolle befindet.

+2

Das hat meinen Tag gerettet. Buchstäblich. Danke vielmals. –

+1

Das löste mein Problem, nachdem wir einige benutzerdefinierte WPF-Steuerelemente in eine reguläre C# -Klassenbibliothek verschoben hatten, die ursprünglich nicht als "WPF Custom Control Library" erstellt wurde. BTW: Außerdem wurde das erforderliche XML-Element zum .csproj hinzugefügt, um die Klassenbibliothek auf eine "echte" WPF-Klassenbibliothek zu aktualisieren. – candritzky

20

Die anderen beiden Antworten sind korrekt ... aber nicht vollständig. Nach this post (und meiner Erfahrung mit der Lösung dieses Problems) gibt es 4 Dinge, die Sie überprüfen müssen: (Aus irgendeinem Grund bleiben die Code-Blöcke in diesem Beitrag nicht formatiert bleiben, wenn ich Zahlen oder Bindestriche verwendet ... also Buchstaben ist es)

A. Die Steuerelemente Vorlage und Stile sollten in der Generic.xaml Datei einen Ordner mit dem Namen Themes der Wurzel Ihres Projekts befinden.

B. Achten Sie darauf, Ihre Namespaces korrekt sind im Generic.xaml

C. Stellen Sie den Stil Schlüssel im Konstruktor Ihrer Kontrolle. Es wird auch empfohlen, das Folgende in einen statischen Konstruktor zu schreiben.

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

D. Sicherstellen, dass die folgenden in Ihrem 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

Schritt 'A' war genug, um mein Problem zu lösen, danke! ('uwp') – rubStackOverflow

1

Ich werde meine eigene Antwort hinzugefügt werden, da sowohl die oben genannten Antworten unvollständig sind, wie ich mit diesem Problem für einige zu kämpfen haben Zeit jetzt.

Wie oben MoMo und Kai G sagte von:

A. Die Kontrollen Schablone und Stile sollten in der generic.xaml Datei einen Ordner namens Themen der Wurzel des Projekts befinden.

B. Achten Sie darauf, Ihre Namespaces korrekt sind im generic.xaml

C. Stellen Sie den Stil Schlüssel im Konstruktor Ihrer Kontrolle.

D. Stellen Sie sicher, das Thema Attribut ist in der AssemblyInfo.cs-

Datei, aber Sie müssen auch sicherstellen, dass Ihre generic.xaml-Datei für die Build Action als Seite gesetzt ist: Do not copy.

Wenn Sie dies nicht tun oder der Wert irgendwie auf etwas anderes eingestellt wurde, wird die OnApplyTemplate()-Methode nicht aufgerufen.

+0

Teil D ist von besonderer Bedeutung, IMO. –

1

Antwort von @MoMo ist richtig, aber zusätzlich:

E: Es wird erwartet, dass die Themen/generic.xaml in der Wurzel Ihres Projekts ist. Wenn dies nicht der Fall ist und sich Ihre Generic.xaml nicht im Stammverzeichnis befindet, müssen Sie im Stammverzeichnis ein Verzeichnis Designs mit Generic.xaml erstellen (Generic.xaml ist nur vom Typ ResourceDictionary). In dieser Generic.xaml müssen Sie auf den Speicherort Ihrer Generic.xaml verweisen.

z.B .:

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

Verwandte Themen