Delen via


Resources in code (WPF .NET)

Dit overzicht is gericht op de wijze waarop WPF-resources (Windows Presentation Foundation) kunnen worden geopend of gemaakt met behulp van code in plaats van XAML-syntaxis. Zie Overzicht van XAML-resourcesvoor meer informatie over algemeen resourcegebruik en resources vanuit een XAML-syntaxisperspectief.

Toegang tot resources vanuit code

De sleutels waarmee gedefinieerde XAML-resources worden geïdentificeerd, worden ook gebruikt om specifieke resources op te halen als u de resource in code aanvraagt. De eenvoudigste manier om een resource op te halen uit code is door de FindResource of de methode TryFindResource aan te roepen vanuit objecten op frameworkniveau in uw toepassing. Het gedragsverschil tussen deze methoden is wat er gebeurt als de aangevraagde sleutel niet wordt gevonden. FindResource een uitzondering genereert. TryFindResource maakt geen uitzondering, maar retourneert null. Elke methode gebruikt de resourcesleutel als invoerparameter en retourneert een losjes getypt object.

Normaal gesproken is een resourcesleutel een tekenreeks, maar er zijn incidenteel niet-tekenreeksgebruik. De opzoeklogica voor de oplossing van coderesources is hetzelfde als het geval van dynamische XAML-resourcereferenties. Het zoeken naar resources begint vanaf het aanroepende element en gaat vervolgens verder door bovenliggende elementen in de logische structuur. De zoekactie gaat verder met toepassingsbronnen, thema's en systeembronnen, indien nodig. Een codeaanvraag voor een resource houdt goed rekening met wijzigingen in de resources die tijdens runtime zijn opgetreden.

In het volgende codevoorbeeld ziet u een Click gebeurtenishandler die een resource op sleutel vindt en de geretourneerde waarde gebruikt om een eigenschap in te stellen.

private void myButton_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    button.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub myButton_Click(sender As Object, e As RoutedEventArgs)
    Dim buttonControl = DirectCast(sender, Button)
    buttonControl.Background = DirectCast(Me.FindResource("RainbowBrush"), Brush)
End Sub

Een alternatieve methode voor het toewijzen van een resourceverwijzing is SetResourceReference. Deze methode heeft twee parameters: de sleutel van de resource en de id voor een bepaalde afhankelijkheidseigenschap die aanwezig is op de elementinstantie waaraan de resourcewaarde moet worden toegewezen. Qua functionaliteit is deze methode hetzelfde en heeft het als voordeel dat er geen typecasting voor de retourwaarden nodig is.

Een andere manier om via een programma toegang te krijgen tot resources is toegang te krijgen tot de inhoud van de eigenschap Resources als een woordenlijst. Resourcewoordenlijsten worden gebruikt om nieuwe resources toe te voegen aan bestaande verzamelingen, controleer of een bepaalde sleutelnaam al wordt gebruikt door de verzameling en andere bewerkingen. Als u een WPF-toepassing helemaal in code schrijft, kunt u ook de hele verzameling in code maken en er resources aan toewijzen. De verzameling kan vervolgens worden toegewezen aan de eigenschap Resources van een element. Dit wordt beschreven in de volgende sectie.

U kunt indexeren binnen een bepaalde Resources verzameling, met behulp van een specifieke sleutel als de index. Resources die op deze manier worden geopend, volgen de normale runtimeregels voor resource-afhandeling niet. U hebt alleen toegang tot die specifieke verzameling. Bij het opzoeken van resources doorkruist het resourcebereik niet tot aan de basis of de toepassing als er geen geldig object is gevonden op de aangevraagde sleutel. Deze benadering kan echter in sommige gevallen prestatievoordelen hebben, precies omdat het bereik van de zoekopdracht naar de sleutel meer beperkt is. Raadpleeg de ResourceDictionary-klasse voor meer informatie over het rechtstreeks werken met een ressourcelijst.

Resources maken met code

Als u een volledige WPF-toepassing in code wilt maken, kunt u ook resources in die toepassing in code maken. Maak hiervoor een nieuw ResourceDictionary exemplaar en voeg vervolgens alle resources toe aan de woordenlijst met behulp van opeenvolgende aanroepen naar ResourceDictionary.Add. Wijs vervolgens de gemaakte ResourceDictionary toe om de eigenschap Resources in te stellen op een element dat aanwezig is op paginaniveau of de Application.Resources. U kunt de ResourceDictionary ook behouden als een zelfstandig object zonder het toe te voegen aan een element. Als u dit echter doet, moet u toegang krijgen tot de resources hierin per itemsleutel, alsof het een algemene woordenlijst is. Een ResourceDictionary die niet is gekoppeld aan een element Resources eigenschap, bestaat niet als onderdeel van de elementstructuur en heeft geen bereik in een opzoekreeks die kan worden gebruikt door FindResource en gerelateerde methoden.

Objecten gebruiken als sleutels

De meeste resourcegebruiken stellen de sleutel van de resource in op een tekenreeks. Verschillende WPF-functies gebruiken het objecttype echter bewust als een sleutel in plaats van een tekenreeks. De mogelijkheid om de resource te laten sleutelen door een objecttype, wordt gebruikt door de WPF-stijl en de ondersteuning voor thema's. nl-NL: De stijlen en thema's die de standaard worden voor een anders niet-gestijld besturingselement, zijn elk gekoppeld aan de Type van het besturingselement waarop ze van toepassing zijn.

Bij gebruik van type als sleutel wordt een betrouwbaar opzoekmechanisme geboden dat werkt op standaardinstellingen van elk besturingselementtype. Het type kan worden gedetecteerd door middel van reflectie en gebruikt voor het stylen van afgeleide klassen, ook al heeft het afgeleide type anders geen standaardstijl. U kunt een Type sleutel opgeven voor een resource die is gedefinieerd in XAML met behulp van de x:Type Markeringsextensie. Vergelijkbare extensies bestaan voor andere niet-tekenreekssleutelgebruiken die WPF-functies ondersteunen, zoals ComponentResourceKey Markup Extension.

Zie Stijlen, DataTemplates en impliciete sleutelsvoor meer informatie.

Zie ook