Resurser i kod (WPF .NET)
Den här översikten fokuserar på hur WPF-resurser (Windows Presentation Foundation) kan nås eller skapas med hjälp av kod i stället för XAML-syntax. Mer information om allmän resursanvändning och resurser från ett XAML-syntaxperspektiv finns i Översikt över XAML-resurser.
Komma åt resurser från kod
Nycklarna som identifierar XAML-definierade resurser används också för att hämta specifika resurser om du begär resursen i koden. Det enklaste sättet att hämta en resurs från kod är att anropa antingen FindResource eller metoden TryFindResource från objekt på ramverksnivå i ditt program. Beteendeskillnaden mellan dessa metoder är vad som händer om den begärda nyckeln inte hittas.
FindResource skapar ett undantag.
TryFindResource skapar inget undantag men returnerar null
. Varje metod tar resursnyckeln som en indataparameter och returnerar ett löst skrivet objekt.
Vanligtvis är en resursnyckel en sträng, men det finns enstaka icke-stränganvändningar. Uppslagslogik för kodresursmatchning är densamma som XAML-fallet för dynamisk resursreferens. Sökningen efter resurser börjar från det anropande elementet och fortsätter sedan genom överordnade element i det logiska trädet. Sökningen fortsätter vidare till programresurser, teman och systemresurser om det behövs. En kodbegäran för en resurs tar korrekt hänsyn till ändringar i de resurser som inträffade under körningen.
I följande kodexempel visas en Click händelsehanterare som hittar en resurs efter nyckel och använder det returnerade värdet för att ange en egenskap.
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
En alternativ metod för att tilldela en resursreferens är SetResourceReference. Den här metoden tar två parametrar: resursens nyckel och identifieraren för en viss beroendeegenskap som finns på den elementinstans som resursvärdet ska tilldelas till. Funktionellt är den här metoden densamma och har fördelen att den inte kräver någon gjutning av returvärden.
Ett annat sätt att komma åt resurser programmässigt är att komma åt innehållet i egenskapen Resources som en ordlista. Resursordlistor används för att lägga till nya resurser i befintliga samlingar, kontrollera om ett visst nyckelnamn redan används av samlingen och andra åtgärder. Om du skriver ett WPF-program helt i kod kan du också skapa hela samlingen i koden och tilldela resurser till den. Samlingen kan sedan tilldelas egenskapen Resources för ett element. Detta beskrivs i nästa avsnitt.
Du kan indexera i en given Resources-samling genom att använda en specifik nyckel som index. Resurser som används på det här sättet följer inte de normala körningsreglerna för resursmatchning. Du kommer bara åt den specifika samlingen. Resurssökningen passerar inte resursomfånget till roten eller programmet om inget giltigt objekt hittades vid den begärda nyckeln. Den här metoden kan dock ha prestandafördelar i vissa fall just på grund av att sökomfånget för nyckeln är mer begränsat. Mer information om hur du arbetar med en resursordlista direkt finns i klassen ResourceDictionary.
Skapa resurser med kod
Om du vill skapa ett helt WPF-program i kod kanske du också vill skapa resurser i programmet i koden. För att uppnå detta skapar du en ny ResourceDictionary-instans och lägger sedan till alla resurser i ordlistan med hjälp av efterföljande anrop till ResourceDictionary.Add. Tilldela sedan den skapade ResourceDictionary för att ställa in egenskapen Resources för ett element som finns inom sidområdet eller Application.Resources. Du kan också underhålla ResourceDictionary som ett fristående objekt utan att lägga till det i ett element. Men om du gör detta måste du komma åt resurserna i den efter objektnyckel, som om det vore en allmän ordlista. En ResourceDictionary som inte är kopplad till egenskapen Resources
skulle inte existera som en del av elementträdet och har heller inget omfång i en uppslagssekvens som kan användas av FindResource och relaterade metoder.
Använda objekt som nycklar
De flesta resursanvändningar anger att resursens nyckel är en sträng. Olika WPF-funktioner använder dock avsiktligt objekttypen som en nyckel i stället för en sträng. Funktionen att låta resursen vara nyckelad av en objekttyp används av WPF-format och stöd för teman. De format och teman som blir standardinställningar för en i övrigt icke-formaterad kontroll associeras var och en med den Type av den kontroll som de ska tillämpas till.
Att vara nyckelad efter typ ger en tillförlitlig uppslagsmekanism som fungerar på standardinstanser av varje kontrolltyp. Typen kan identifieras genom reflektion och användas för formatering av härledda klasser även om den härledda typen annars inte har något standardformat. Du kan ange en Type nyckel för en resurs som definierats i XAML med hjälp av x:Type Markup Extension. Liknande tillägg finns för andra icke-sträng nyckelanvändningar som stöder WPF-funktioner, till exempel ComponentResourceKey Markup Extension.
För mer information, se Formatmallar, DataTemplates och implicita nycklar.
Se även
.NET Desktop feedback