Wat is er zo speciaal aan Generic.xaml?

Ik heb geprobeerd uit te zoeken hoe ik mijn ResourceDictionary-bestanden kan ordenen voor hergebruik en delen met andere leden van mijn team.

Ik kom steeds “Generic.xaml” tegen, maar als ik op MSDN kijk naar Generic.xaml of gewoon een Google-zoekopdracht doe, krijg ik alleen blogberichten en forumvragen die het toevallig noemen – ik kan’ t lijkt iets te raken dat echt gezaghebbend en duidelijk is.

Wat is het verschil tussen Generic.xaml en MyRandomlyNamedResourceDictionary.xaml? Het lijkt hoe dan ook, ik moet verwijzen naar ResourceDictionaries die zijn opgeslagen in bibliotheken met het Source-attribuut. Bijvoorbeeld:

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

Dus welk voordeel biedt Generic.xaml precies? Heeft het enig doel als ik mijn applicatie niet meerdere “looks” probeer te geven (d.w.z. als ik maar één thema heb)?


Antwoord 1, autoriteit 100%

Elk besturingselement in WPF heeft een standaardstijl die onder andere de standaard ControlTemplatevan het besturingselement biedt. WPF zoekt naar de standaardstijl in een speciaal bronnenwoordenboek in de map Thema’s in dezelfde assembly als het besturingselement. De sleutel voor de standaardstijl wordt geleverd door de afhankelijkheidseigenschap Control.DefaultStyleKey, waarvan de standaardwaarde wordt overschreven in elke subklasse van Control.

De naam van het bronnenwoordenboek hangt af van het huidige Windows-thema, b.v. op Vista met het Aero-thema heet het woordenboek Aero.NormalColor.xaml, op XP met het standaardthema Luna.NormalColor.xaml. Als de stijl niet wordt gevonden in het themawoordenboek, wordt gezocht in Generic.xaml, d.w.z. naar besturingselementen waarvan het uiterlijk niet afhankelijk is van het thema.

Dit is alleen van toepassing op alle aangepaste besturingselementen die u hebt gedefinieerd, d.w.z. klassen die direct of indirect zijn afgeleid van Control. U kunt de standaardstijl voor een standaardbesturingselement wijzigen door hiervan af te leiden en DefaultStyleKeyProperty.OverrideMetadataaan te roepen in de statische constructor, maar u moet dan de volledige stijl opgeven, inclusief ControlTemplate.

Houd er rekening mee dat je WPF kunt vertellen om in een externe assembly naar je standaardstijl te zoeken met behulp van het ThemeInfo-attribuut. De externe assembly moet de naam <YourAssembly>.<ThemeName>.dll hebben, b.v. PresentatieFramework.Aero.dll.


Antwoord 2, autoriteit 68%

Om een ​​bestand generic.xaml(hoofdlettergevoelig) iets speciaals te laten zijn, moet aan twee voorwaarden worden voldaan:

  • Het moet in de subhoofdmap Thema’s van het project staan
  • De assembly moet worden gemarkeerd met het ThemeInfoAttribute(meestal in AssemblyInfo.cs)

Vervolgens dient het als de standaard zoeklocatie voor alle standaardstijlen die u op uw bedieningselementen wilt toepassen. Merk ook op dat om een ​​stijl de standaard te laten zijn, deze zowel het TargetType als x:Key moet declareren als het type besturingselement dat moet worden gestileerd.

Als je hele thema’s en themawisselingen aan je applicatie wilt toevoegen, dat wordt bereikt met wat codering, definieert deze techniek alleen het standaard bronnenwoordenboek.

Other episodes