Was ist das Besondere an Generic.xaml?

153

Ich habe versucht herauszufinden, wie ich meine ResourceDictionary-Dateien für die Wiederverwendung und Freigabe für andere Mitglieder meines Teams organisieren kann.

Ich stoße immer wieder auf "Generic.xaml", aber wenn ich auf MSDN nach Generic.xaml suche oder nur eine Google-Suche durchführe, bekomme ich nur Blog-Beiträge und Forum-Fragen, die es zufällig erwähnen - ich kann es nicht scheinen auf etwas wirklich maßgebliches und klares treffen.

Was ist der Unterschied zwischen Generic.xaml und MyRandomlyNamedResourceDictionary.xaml? In beiden Fällen muss ich auf ResourceDictionaries verweisen, die in Bibliotheken mit dem Source-Attribut gespeichert sind. Z.B,:

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

Welchen Vorteil bietet Generic.xaml genau? Hat es irgendeinen Zweck, wenn ich nicht versuche, meiner Anwendung mehrere "Looks" zu geben (dh wenn ich nur ein Thema habe)?

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

Antworten:

152

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

Der Name des Ressourcenwörterbuchs hängt vom aktuellen Windows-Design ab, z. B. unter Vista mit dem Aero-Design. Das Wörterbuch heißt Aero.NormalColor.xaml, unter XP mit dem Standarddesign Luna.NormalColor.xaml. Wenn der Stil nicht im Themenwörterbuch gefunden wird, sucht er in Generic.xaml nach Steuerelementen, deren Aussehen nicht vom Thema abhängt.

Dies gilt nur für benutzerdefinierte Steuerelemente, die Sie definiert haben, dh Klassen, die direkt oder indirekt von Control abgeleitet wurden. Sie können den Standardstil für ein Standardsteuerelement ändern, indem Sie ihn ableiten und DefaultStyleKeyProperty.OverrideMetadataden statischen Konstruktor aufrufen. Anschließend müssen Sie jedoch den vollständigen Stil einschließlich ControlTemplate angeben.

Beachten Sie, dass Sie WPF mithilfe des ThemeInfo-Attributs anweisen können, in einer externen Assembly nach Ihrem Standardstil zu suchen. Die externe Assembly muss <YourAssembly heißen >. <ThemeName >.dll zB PresententationFramework.Aero.dll.

Phil Devaney
quelle
Danke, Phil. Wollen Sie damit sagen, dass wenn ich nur eine neue ControlTemplate für ein normales Button-Steuerelement bereitstellen wollte (dh nicht meine eigene spezielle Klasse schreiben, die von Button abgeleitet ist), dies nicht als Teil eines "Themas" betrachtet wird?
Devuxer
Ja, wenn Sie nur ein Standardsteuerelement neu vorlegen oder formatieren möchten, verwenden Sie das normale Ressourcenelement auf der Ebene Benutzersteuerung / Fenster / Anwendung / Was auch immer. Sie können einen Stil mit einem impliziten Schlüssel ( msdn.microsoft.com/en-us/library/… ) verwenden, um alle Steuerelemente eines bestimmten Typs zu ändern.
Phil Devaney
@ Zaheylu Es funktioniert jetzt (ich denke, MS hat ihre Dokumente aktualisiert)
Alan McBee - MSFT
104

Damit eine generic.xamlDatei (ohne Berücksichtigung der Groß- und Kleinschreibung) etwas Besonderes ist, müssen zwei Bedingungen erfüllt sein:

  • Es muss sich im Unterverzeichnis des Themes im Projekt befinden
  • Die Baugruppe muss mit ThemeInfoAttribute(normalerweise in AssemblyInfo.cs) gekennzeichnet sein.

Dann dient es als Standard-Suchort für alle Standardstile, die Sie auf Ihre Steuerelemente anwenden möchten. Beachten Sie auch, dass ein Stil, um der Standard zu sein, sowohl seinen TargetType als auch x: Key als den zu gestaltenden Steuerelementtyp deklarieren muss.

Wenn Sie Ihrer Anwendung ganze Themen und Themenwechsel hinzufügen möchten, was mit etwas Codierung erreicht wird, definiert diese Technik lediglich das Standardressourcenwörterbuch.

Kenan EK
quelle
3
Können Sie klarstellen, was Sie unter "Standardstilen" verstehen? Bedeutet dies, dass alle Schaltflächen automatisch einen Stil annehmen würden, dessen Zieltyp "Schaltfläche" ist? Oder muss ich das noch x:Keyschriftlich referenzieren <Button Style="{StaticResource MyButtonStyle}" />? Was passiert, wenn das ResourceDictionary mehr als einen Stil enthält, dessen Zieltyp "Button" ist? Vielen Dank.
Devuxer
3
Eine weitere Frage, die mir dabei helfen soll: Ist Generic.xaml das WPF-Äquivalent einer CSS-Datei, die das Standard-Erscheinungsbild verschiedener Elemente definiert hat, z h1 {color:#00ff00}.
Devuxer
3
Ja, der Standardstil würde angewendet, ohne explizit auf den Schlüssel zu verweisen, und zwei identische Stile würden den Fehler ergeben, dass das Wörterbuch zwei identische Schlüssel enthält. Und ja, Sie könnten so über das Standardverhalten denken.
Kenan EK
3
Ich wollte nur hinzufügen, dass der Wörterbucheintrag in generic.xaml ein zusammengeführtes Wörterbuch sein kann, dessen Einträge auf alles verweisen können, obwohl es für die Datei generic.xaml selbst besondere Einschränkungen gibt.
Tormod