2009-08-04 7 views
131

Ich habe versucht herauszufinden, wie ich meine ResourceDictionary-Dateien zur Wiederverwendung und zum Teilen mit anderen Mitgliedern meines Teams organisieren kann.Was ist das Besondere an Generic.xaml?

Ich komme immer wieder auf "Generic.xaml", aber wenn ich auf MSDN für Generic.xaml oder nur eine Google-Suche suche, bekomme ich anscheinend nur Blog-Beiträge und Forum-Fragen, die zufällig erwähnen - ich kann Es scheint nicht wirklich autoritativ und klar zu sein.

Was ist der Unterschied zwischen Generic.xaml und MyRandomlyNamedResourceDictionary.xaml? Es scheint so oder so, ich muss ResourceDictionaries referenzieren, die in Bibliotheken mit dem Source-Attribut gespeichert sind. . Z. B,:

<Application.Resources> 
    <ResourceDictionary 
     Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" 
</Application.Resources> 

Also, was den Vorteil hat generic.xaml genau zur Verfügung stellen? Hat es irgendeinen Zweck, wenn ich nicht versuche, meiner Bewerbung mehrere "Looks" zu geben (d. H., Wenn ich nur ein Thema habe)?

+4

Sie müssen das generic.xaml-Wörterbuch nicht in Ihren Code einfügen, wenn Sie es mit benutzerdefinierten Steuerelementen verwenden (im Gegensatz zu Benutzersteuerelementen). – Eternal21

Antwort

128

Jedes Steuerelement in WPF verfügt über einen Standardstil, der unter anderem die Standardeinstellung ControlTemplate des Steuerelements bereitstellt. WPF sucht nach dem Standardstil in einem speziellen Ressourcenwörterbuch im Ordner Designs in derselben Assembly wie das Steuerelement. Der Schlüssel für den Standardstil wird von der Control.DefaultStyleKey Abhängigkeitseigenschaft bereitgestellt, deren Standardwert in jeder Unterklasse von Control überschrieben wird.

Der Name des Ressourcenwörterbuchs hängt vom aktuellen Windows-Thema ab, z. Bei Vista, das das Aero-Design verwendet, heißt das Wörterbuch Aero.NormalColor.xaml, auf XP mit dem Standardthema ist es Luna.NormalColor.xaml. Wenn der Stil im Themenwörterbuch nicht gefunden wird, wird in Generic.xaml gesucht, d. H. Für Steuerelemente, deren Aussehen nicht vom Thema abhängt.

Dies gilt nur für benutzerdefinierte Steuerelemente, die Sie definiert haben, d. H. Klassen, die direkt oder indirekt von Control abgeleitet sind. Sie können den Standardstil für ein Standardsteuerelement ändern, indem Sie davon abgeleitet werden und im statischen Konstruktor DefaultStyleKeyProperty.OverrideMetadata aufrufen. Sie müssen dann jedoch den vollständigen Stil einschließlich ControlTemplate angeben.

Beachten Sie, dass Sie WPF anweisen können, in einer externen Assembly für Ihren Standardstil zu suchen, indem Sie das ThemeInfo-Attribut verwenden. Die externe Baugruppe muss < YourAssembly > heißen. < ThemeName > .dll z.B. PresententationFramework.Aero.dll.

+0

Danke, Phil. Willst du damit sagen, dass wenn ich nur ein neues ControlTemplate für ein normales Button-Steuerelement bereitstellen möchte (d. H. Nicht meine eigene spezielle Klasse schreiben würde, die von Button abgeleitet ist), würde dies nicht als Teil eines "Themas" betrachtet werden? – devuxer

+0

Ja, wenn Sie nur ein Standard-Steuerelement neu erstellen oder neu formatieren möchten, dann verwenden Sie das normale Resources-Element unter UserControl/Window/Application/Where level. Sie können einen Stil mit einem impliziten Schlüssel verwenden (http://msdn.microsoft.com/en-us/library/ms750613.aspx#stylesimplicitkeys), um alle Steuerelemente eines bestimmten Typs zu ändern. –

+0

@Phil Der Link funktioniert nicht mehr – Zaheylu

89

Für eine generic.xaml Datei (Groß- und Kleinschreibung) ist etwas Besonderes, müssen zwei Bedingungen erfüllt sein:

  • Es in die Themen Sub-Stammordner im Projekt sein muss
  • Die Montage muss gekennzeichnet werden mit dem ThemeInfoAttribute (in der Regel in AssemblyInfo.cs)

Dann dient es als Standard-Lookup-Standort für alle Standard-Stile, die Sie auf Ihre Steuerelemente anwenden möchten. Beachten Sie außerdem, dass ein Style als Standard deklariert werden muss, wenn sowohl der TargetType als auch der x: Key als Typ des Controls angegeben wird, der gestylt werden soll.

Wenn Sie die gesamte Themen und Themenwechsel zu Ihrer Anwendung hinzufügen möchten, das ist mit etwas Codierung erfolgt, definiert diese Technik lediglich das Standard-Ressourcenwörterbuch.

+3

Können Sie klarstellen, was Sie unter "Standardstile" verstehen?Bedeutet dies, dass alle Schaltflächen automatisch einen Stil annehmen würden, dessen TargetType "Button" ist? Oder muss ich noch auf die 'x: Key 'verweisen, indem ich'

+3

Eine andere Frage, die mir dabei helfen soll, das Problem zu lösen: Ist Generic.xaml das WPF-Äquivalent einer CSS-Datei, die das Standard-Aussehen verschiedener Elemente definiert, z. B. 'h1 {color: # 00ff00}'? – devuxer

+2

Ja, der Standardstil würde gelten, ohne explizit auf den Schlüssel zu verweisen, und zwei identische Stile würden den Fehler verursachen, dass es im Wörterbuch zwei identische Schlüssel gibt. Und ja, man könnte so darüber nachdenken, in Bezug auf Standardverhalten. –