2012-06-22 11 views
12

Ich habe eine Klassenbibliotheksassembly erstellt, in der ich benutzerdefinierte Steuerelemente erstellt habe, und ich habe die Standardstile in der Datei generic.xaml definiert.Stile aus generic.xaml werden nicht angewendet

Es scheint, dass dies ein ziemlich häufiges Problem ist, solange viele Leute darüber schreiben. Allerdings konnte ich keine brauchbare Antwort für meinen Fall finden.

  • Die Datei generic.xaml befindet sich im Ordner Designs.
  • Die Build-Aktion generix.xaml ist auf Seite festgelegt.
  • Die ThemeInfo ist ordnungsgemäß in meiner AssemblyInfo.cs definiert.

In meinem Test-Anwendung, wenn ich die generic.xaml Datei von meiner benutzerdefinierten Steuerbaugruppe in die Anwendung App.xaml wie diese manuell fusionieren Datei:

<Application.Resources> 
    <ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/MyControlsAssembly;component/Themes/generic.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

dann die benutzerdefinierten Kontrollen richtig sind Themen, Wenn ich die Datei generic.xaml jedoch nicht manuell zusammenführe, werden die Steuerelemente mit dem Standard-Windows-Design angezeigt.

Können Sie mir bitte sagen, was ich vergesse und/oder falsch mache?

Zusätzliche Informationen:

  • Mein ThemeInfo Assembly-Attribut wird wie folgt definiert:

    [assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)]

    (Hinweis: das Ergebnis ist genau das gleiche mit einem beliebigen Kombination von Parametern für das ThemeInfo Attribut)

  • Es gibt zwei weitere .xaml-Dateien neben der Datei generic.xaml im Ordner Themes.

  • Es gibt einen Unterordner im Ordner "Themes", der selbst eine andere .xaml-Datei enthält.
+4

Do Sie haben immer noch die DefaultStyleKeyProperty in einem statischen Konstruktor auf Ihren benutzerdefinierten Steuerelementen festgelegt? – Nogusta

+0

Haben Sie Glück, dieses herauszufinden? Ich habe fast genau dasselbe mit meiner Custom Controls Assembly. Wenn ich in der Datei "generic.xaml" eine Referenz in App.config hinzufüge, sind die Steuerelemente thematisch ausgerichtet. Wenn ich das hinterlasse, bekomme ich nichts. –

+0

Gilt dieser Link? http://social.msdn.microsoft.com/Forums/vstudio/en-US/2e1fb162-e828-4fd9-832f-d2791c1980b4/isnt-genericxaml-supposed-to-loaded-automatically Ich nahm mir das gleiche Problem, und ich denke, das ist die Ursache –

Antwort

7

Sie müssen die folgende Zeile in Ihrer benutzerdefinierten Steuer Konstruktor:

public class MyCustomControl : Control 
{ 
    static MyCustomControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl))); 
    } 
} 

Dann, wenn Sie eine generic.xaml Datei im Ordner Themen haben, mit dem folgenden Beispiel Stil:

<Style TargetType="{x:Type local:MyCustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MyCustomControl}"> 
       <Border> 
        <Label>Testing...</Label> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Jetzt wird der Stil automatisch ohne zusätzliche Verschmelzung angewendet.

+0

Dies funktioniert nicht für mich. Sehen Sie sich meinen Kommentar zur ersten Frage an: – bigfoot

+0

Beginnen Sie mit einer leeren Lösung und schauen Sie, ob Sie von dort aus arbeiten können? – Eternal21

+0

Das mache ich. Ich komme von Xceed Data Grid. Wenn ich ein neues MyControl: Control oder MyButton: Button erstelle, funktioniert es. Vielleicht ist es die Xceed Theme-Unterstützung, die hier zum Einsatz kommt, und ich muss in ihre Tutorials zu Themen schauen oder einfach das Merge-Dictionary in meiner Anwendung akzeptieren. Es sei denn, andere Ideen tauchen auf. – bigfoot

3

Um Standardstile in Themes \ Generic.xaml in meiner benutzerdefinierten Steuerelementbibliothek anzuwenden, entschied ich mich, Inspiration aus einer gut etablierten Open Source-Steuerelementbibliothek (MahApps) zu suchen. Dieses Projekt gibt Ihnen ein wirklich gutes Beispiel dafür, wie Sie eine benutzerdefinierte Steuerbibliothek strukturieren und gestalten können.

eine lange Geschichte kurz zu machen, Ihre Standardstile in Themen \ generic.xaml Sie Folgendes in der AssemblyInfo.cs-Datei in Ihrem Custom Controls Bibliothek aufnehmen müssen bekommen:

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] 

In meinem Fall, Meine benutzerdefinierten Steuerelemente AssemblyInfo.cs sah so etwas wie:

using System.Runtime.InteropServices; 
using System.Windows; 
using System.Windows.Markup; 

[assembly: AssemblyCopyright("...")] 
[assembly: ComVisible(false)] 

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] 

[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyFileVersion("1.0.0.0")] 
[assembly: AssemblyInformationalVersion("1.0.0.0")] 
[assembly: AssemblyTitleAttribute("...")] 
[assembly: AssemblyDescriptionAttribute("")] 
[assembly: AssemblyProductAttribute("...")] 
[assembly: AssemblyCompany("...")] 
0

nicht sicher, ob dies in WPF funktioniert, aber es funktioniert für mich in Silverlight:

Constructor:

public class MyCustomControl : Control 
{ 
    static MyCustomControl() 
    { 
     this.Style = (Style)Application.Current.Resources["MyCustomControlStyle"]; 
    } 
} 

Stil:

<Style x:Key="MyCustomControlStyle" TargetType="{local:MyCustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{local:MyCustomControl}"> 
       <Border> 
        <Label>Testing...</Label> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
Verwandte Themen