ResourceDictionary Classe

Definizione

Definisce un repository per le risorse XAML, ad esempio gli stili, usati dall'app. Definisci le risorse in XAML e puoi recuperarle in XAML usando l'estensione di markup {StaticResource} e l'estensione di markup {ThemeResource}. È anche possibile accedere alle risorse con il codice, ma questo è meno comune.

/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class ResourceDictionary : DependencyObject, IIterable<IKeyValuePair<IInspectable, IInspectable const&>>, IMap<IInspectable, IInspectable const&>
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class ResourceDictionary : DependencyObject, IDictionary<object,object>, IEnumerable<KeyValuePair<object,object>>
Public Class ResourceDictionary
Inherits DependencyObject
Implements IDictionary(Of Object, Object), IEnumerable(Of KeyValuePair(Of Object, Object))
<ResourceDictionary>
  oneOrMoreResources
</ResourceDictionary>
- or -
<frameworkElement>
  <frameworkElement.Resources>
    oneOrMoreResources
  </frameworkElement.Resources>
</frameworkElement>
Ereditarietà
Object IInspectable DependencyObject ResourceDictionary
Derivato
Attributi
Implementazioni

Commenti

Un dizionario risorse è un repository per le risorse XAML, ad esempio gli stili, usati dall'app. Definisci le risorse in XAML e puoi recuperarle in XAML usando l'estensione di markup {StaticResource} e l'estensione di markup {ThemeResource}. È anche possibile accedere alle risorse con il codice, ma questo è meno comune. Puoi usare le risorse per imporre che determinati valori, ad esempio i colori del pennello o le misurazioni dei pixel, vengano usati in modo coerente in tutta l'app. Per altre info sull'uso efficace dei dizionari risorse, vedi Riferimenti alle risorse ResourceDictionary e XAML.

Usi degli elementi ResourceDictionary

Il ResourceDictionary tipo viene usato come valore di due proprietà, FrameworkElement.Resources e Application.Resources, importanti per la struttura complessiva di un'app SDK per app di Windows. I file XAML che ottieni da un modello di progetto iniziale per un'app inizieranno con i valori iniziali per FrameworkElement.Resources e il file app.xaml potrebbe iniziare con i valori iniziali per Application.Resources. Le risorse definite dipendono dal modello di avvio del progetto in uso.

Questo codice XAML mostra l'uso di una proprietà FrameworkElement.Resources . In questo caso FrameworkElement è una pagina. Non esiste alcun ResourceDictionary elemento subordinato all'elemento Page.Resources della proprietà, ma la sua presenza è implicita. Per altre info, vedi la sezione "Note sulla sintassi XAML" di seguito. Il codice XAML inserisce un oggetto Style in ResourceDictionary con un valore di attributo x:Key "TextBlockStyle1". Più avanti in XAML, l'estensione di markup {StaticResource} fa riferimento a Style nel dizionario risorse per fornire un valore per la proprietà Style dell'elemento TextBlock .

Lo stile mostrato non applica effettivamente alcun stile al controllo TextBlock, ma è possibile aggiungere Style proprietà in Microsoft Visual Studio. È quindi possibile usare la Style risorsa con la stessa frequenza desiderata nella pagina per applicare l'uniformità.

<Page
    x:Class="ResourceDictionary_example.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:ResourceDictionary_example"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Page.Resources>
        <Style x:Key="TextBlockStyle1" TargetType="TextBlock"/>
    </Page.Resources>

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock Style="{StaticResource TextBlockStyle1}" Text="TextBlock"/>
    </Grid>
</Page>

Questo codice XAML, dal file AppPage.xaml dell'esempio AtomPub, mostra l'uso di una proprietà Application.Resources . Il codice XAML inserisce due elementi Style nel dizionario risorse, rendendoli disponibili in tutta l'applicazione.

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="AtomPub.App"
    RequestedTheme="Light" >
    <Application.Resources>
        <ResourceDictionary>
            <Style x:Key="TitleStyle" TargetType="TextBlock">
                <Setter Property="Foreground" Value="#707070"/>
                <Setter Property="FontFamily" Value="Segoe UI Light"/>
                <Setter Property="FontSize" Value="16"/>
            </Style>
            <Style x:Key="H1Style" TargetType="TextBlock">
                <Setter Property="Foreground" Value="#212121"/>
                <Setter Property="FontFamily" Value="Segoe UI Semilight"/>
                <Setter Property="FontSize" Value="26.667"/>
                <Setter Property="Margin" Value="0,0,0,25"/>
            </Style>
            ...
        </ResourceDictionary>
    </Application.Resources>
</Application> 

Questo codice XAML dal file MainPage.xaml usa l'estensione di markup {StaticResource} per accedere agli stili TitleStyle e H1Style :

...
<!-- Header -->
<StackPanel x:Name="Header" Grid.Row="0">
    <StackPanel Orientation="Horizontal">
        ...
        <TextBlock Text="Windows SDK Samples" VerticalAlignment="Bottom" Style="{StaticResource TitleStyle}" TextWrapping="Wrap"/>
    </StackPanel>
    <TextBlock x:Name="FeatureName" Text="Add Feature Name" Style="{StaticResource H1Style}" TextWrapping="Wrap"/>
</StackPanel>
 ...

Puoi inserire le risorse nel proprio file XAML usando ResourceDictionary come elemento radice del file. È quindi possibile includere tali risorse in un dizionario risorse FrameworkElement.Resources o Application.Resources . A tale scopo, utilizzare la proprietà ResourceDictionary.MergedDictionaries o la proprietà ResourceDictionary.ThemeDictionaries dell'elemento ResourceDictionary.

Questo file, Common/Styles1.xaml, definisce le risorse style usando ResourceDictionary come elemento radice:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style x:Key="TitleTextStyle" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Segoe UI Light"/>
        <Setter Property="FontSize" Value="16"/>
    </Style>
    <Style x:Key="HeaderTextStyle" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Segoe UI Semilight"/>
        <Setter Property="FontSize" Value="26.667"/>
        <Setter Property="Margin" Value="0,0,0,25"/>
    </Style>
    ...
</ResourceDictionary>

Si supponga ora che sia presente un altro file, Common/Styles2.xaml che definisce in modo analogo le risorse di stile . Questo codice XAML mostra come unire le risorse in questi due file usando la proprietà ResourceDictionary.MergedDictionaries per creare un dizionario risorse Application.Resources . Il codice XAML definisce anche due altre risorse style e le unisce con le risorse dei due file.

<Application
    .... >
    <Application.Resources>
        <ResourceDictionary>
            <Style x:Key="ErrorStyle" TargetType="TextBlock">
                <Setter Property="Foreground" Value="DarkRed"/>
                <Setter Property="FontFamily" Value="Segoe UI Semilight"/>
                <Setter Property="FontSize" Value="15"/>
            </Style>
            <Style x:Key="StatusStyle" TargetType="TextBlock">
                <Setter Property="Foreground" Value="Black"/>
                <Setter Property="FontFamily" Value="Segoe UI Semilight"/>
                <Setter Property="FontSize" Value="15"/>
            </Style>
            <ResourceDictionary.MergedDictionaries>
                <!-- 
                    Styles that define common aspects of the platform look and feel
                 -->
                <ResourceDictionary Source="Common/Styles1.xaml"/>
                <ResourceDictionary Source="Common/Styles2.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

Per informazioni su come vengono risolte le risorse del dizionario unite, vedi la sezione "Dizionari risorse uniti" dei riferimenti alle risorse ResourceDictionary e XAML.

Proprietà x:Key

In XAML le chiavi per ResourceDictionary gli elementi vengono dichiarate impostando l'attributo x:Keysugli elementi che rappresentano le risorse XAML. In genere, se si tenta di inserire un elemento figlio che non ha un valore di chiave in un ResourceDictionary, viene generata un'eccezione di analisi XAML o un'eccezione Windows Runtime. La condizione di eccezione può anche essere annotata come avviso dalle superfici di progettazione XAML. Tuttavia, esistono tre casi rilevanti in cui un ResourceDictionary elemento figlio non richiede un valore di attributo x:Key :

Iterazione in un oggetto ResourceDictionary

È possibile scorrere un ResourceDictionary oggetto in C#. In molti casi, ad esempio usando foreach la sintassi, il compilatore esegue questo cast per l'utente e non è necessario eseguire il cast in IEnumerable modo esplicito. Se è necessario eseguire il cast in modo esplicito, ad esempio se si vuole chiamare GetEnumerator, eseguire il cast a IEnumerable<T> con un KeyValuePair<Object,Object> vincolo.

ResourceDictionary e Microsoft Visual Studio

Microsoft Visual Studio fornisce una scelta di pagina Aggiungi nuovo elemento per un dizionario risorse. Usa questa opzione ogni volta che vuoi definire un nuovo dizionario risorse XAML libero, ad esempio per fungere da origine per un dizionario unito. Microsoft Visual Studio aggiunge anche un dizionario risorse XAML libero al progetto ogni volta che usi Aggiungi nuovo elemento per creare un controllo basato su modelli. Questo dizionario risorse fornisce i modelli di tema predefiniti. Microsoft Visual Studio potrebbe crearne uno nuovo ResourceDictionary nel codice XAML se stai modificando copie di stili o modelli e un ResourceDictionary oggetto per il percorso della risorsa scelto (app, pagina o autonomo) non esiste ancora.

Note sulla sintassi XAML

Si noti che la sintassi della raccolta implicita XAML per ResourceDictionary non include un elemento oggetto per .ResourceDictionary Questo è un esempio di sintassi di raccolta implicita XAML; È possibile omettere un tag che rappresenta l'elemento della raccolta. Gli elementi aggiunti come elementi alla raccolta vengono specificati come elementi figlio di un elemento proprietà di una proprietà il cui tipo sottostante supporta un metodo Dictionary/Map Add .

Per un dizionario risorse unito, è necessario dichiarare in modo esplicito un ResourceDictionary elemento oggetto, in modo da poter anche dichiarare l'elemento della proprietà ResourceDictionary.MergedDictionaries e Source. Pertanto, sono coinvolti almeno due ResourceDictionary elementi oggetto e si usa questa sintassi.

<ResourceDictionary>
  <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="uri"/>
    ...
  </ResourceDictionary.MergedDictionaries>
...
</ResourceDictionary>

In questa sintassi l'esterno ResourceDictionary è il primario ResourceDictionary. L'interno ResourceDictionary è l'oggetto ResourceDictionary da unire.

Per l'utilizzo implicito della raccolta, viene visualizzato il segnaposto appropriato per la proprietà FrameworkElement.Resources . È anche possibile utilizzare questa raccolta implicita per la proprietà Application.Resources o potenzialmente per una proprietà personalizzata che usa ResourceDictionary come tipo di proprietà.

Tipi condivisibili e tipi UIElement

Un dizionario risorse è una tecnica per definire tipi condivisibili e valori di questi tipi in XAML. Non tutti i tipi o i valori sono adatti per l'utilizzo da un oggetto ResourceDictionary. Esempi di tipi in cui la condivisione è supportata includono Style, qualsiasi sottoclasse FrameworkTemplate , tipi di dati intrinseci XAML, pennelli, colori e trasformazioni. Per altre info sui tipi considerati condivisibili, vedi Riferimenti alle risorse ResourceDictionary e XAML. In genere, i tipi derivati da UIElement non sono condivisibili a meno che non provengano da modelli e applicazioni di un modello in un'istanza di controllo specifica. Escludendo il caso del modello, è previsto che un UIElement esista in una sola posizione in un albero di oggetti dopo che è stata creata un'istanza e che un UIElement possa essere condiviso potrebbe violare questo principio.

In pratica, la maggior parte delle risorse definite in un ResourceDictionary sarà una delle seguenti:

  • Modelli di controllo per un controllo, inclusi i relativi stati di visualizzazione.
  • Stili di supporto per parti di controlli
  • Stili per gli elementi che fanno parte dell'interfaccia utente tipica dell'app, ma non sono controlli, ad esempio TextBlock
  • Modelli di dati per controlli e pannelli che usano il data binding
  • Valori specifici di Brush , principalmente SolidColorBrush
  • Stringhe o altre costanti che non devono mai essere localizzate (stringhe e costanti che devono essere localizzate non devono essere localizzate in resourceDictionary. Per altre informazioni, vedere Avvio rapido: Traduzione delle risorse dell'interfaccia utente)

Accesso a un oggetto ResourceDictionary nel codice

L'API usata dal codice per accedere alle risorse in un ResourceDictionary dipende dal linguaggio di programmazione usato:

Per altre info su come usare ResourceDictionary nel codice, vedi la sezione "Using a ResourceDictionary from code" (Uso di un resourceDictionary dal codice) di Riferimenti alle risorse ResourceDictionary e XAML.

Risorse di sistema

Alcune risorse del tema fanno riferimento ai valori delle risorse di sistema come sottovalore sottostante. Una risorsa di sistema è un valore di risorsa speciale che non viene trovato in alcun dizionario risorse XAML. Questi valori si basano sul comportamento del supporto XAML di Windows Runtime per inoltrare i valori dal sistema stesso e rappresentarli in un formato a cui può fare riferimento una risorsa XAML.

Costruttori

Nome Descrizione
ResourceDictionary()

Inizializza una nuova istanza della classe ResourceDictionary .

Proprietà

Nome Descrizione
Dispatcher

Restituisce null sempre in un'app di SDK per app di Windows. Usare invece DispatcherQueue .

(Ereditato da DependencyObject)
DispatcherQueue

Ottiene l'oggetto DispatcherQueue a cui è associato questo oggetto. Rappresenta DispatcherQueue una funzionalità che può accedere al nel thread dell'interfaccia DependencyObject utente anche se il codice viene avviato da un thread non dell'interfaccia utente.

(Ereditato da DependencyObject)
MergedDictionaries

Ottiene un insieme di dizionari ResourceDictionary che costituiscono i vari dizionari risorse nei dizionari uniti.

Size

Ottiene il numero di elementi contenuti nell'insieme.

Source

Ottiene o imposta un URI (Uniform Resource Identifier) che fornisce il percorso di origine di un dizionario risorse unito.

ThemeDictionaries

Ottiene una raccolta di dizionari risorse uniti con chiave specifica e composti per gestire scenari di tema, ad esempio specificando i valori del tema per "HighContrast".

Metodi

Nome Descrizione
Clear()

Rimuove tutti gli elementi da questo ResourceDictionary.

ClearValue(DependencyProperty)

Cancella il valore locale di una proprietà di dipendenza.

(Ereditato da DependencyObject)
First()

Restituisce un iteratore per gli elementi dell'insieme.

GetAnimationBaseValue(DependencyProperty)

Restituisce qualsiasi valore di base stabilito per una proprietà di dipendenza, che si applica nei casi in cui un'animazione non è attiva.

(Ereditato da DependencyObject)
GetValue(DependencyProperty)

Restituisce il valore effettivo corrente di una proprietà di dipendenza da dependencyObject.

(Ereditato da DependencyObject)
GetView()

Recupera una vista in ResourceDictionary.

HasKey(Object)

Restituisce un valore che indica se ResourceDictionary dispone di una voce con la chiave richiesta.

Insert(Object, Object)

Aggiunge una nuova voce all'oggetto ResourceDictionary.

Lookup(Object)

Restituisce il valore della chiave richiesta, se esiste una voce con tale chiave.

ReadLocalValue(DependencyProperty)

Restituisce il valore locale di una proprietà di dipendenza, se è impostato un valore locale.

(Ereditato da DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

Registra una funzione di notifica per l'ascolto delle modifiche a una dipendenza specifica in questa istanza dependencyObject .

(Ereditato da DependencyObject)
Remove(Object)

Rimuove un elemento specifico da ResourceDictionary.

SetValue(DependencyProperty, Object)

Imposta il valore locale di una proprietà di dipendenza in un Oggetto DependencyObject.

(Ereditato da DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

Annulla una notifica di modifica registrata in precedenza chiamando RegisterPropertyChangedCallback.

(Ereditato da DependencyObject)

Si applica a

Vedi anche