
Funzionalità della proprietà fornite da una proprietà di dipendenza
Una proprietà di dipendenza fornisce funzionalità che consentono di estendere la funzionalità di una proprietà, rispetto a una proprietà supportata da un campo. Spesso, ciascuna di queste funzionalità rappresenta o supporta una funzione specifica dell'intero insieme di funzioni WPF:
Risorse
Un valore della proprietà di dipendenza può essere impostato facendo riferimento a una risorsa. Le risorse in genere vengono specificate come elementi figlio di un elemento radice della pagina o dell'applicazione (questi percorsi consentono un accesso più semplice alla risorsa). Nell'esempio seguente viene illustrato come definire una risorsa SolidColorBrush.
<DockPanel.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Gold"/>
</DockPanel.Resources>
Una volta definita, è possibile fare riferimento alla risorsa e utilizzarla per fornire un valore della proprietà:
<Button Background="{DynamicResource MyBrush}" Content="I am gold" />
A questa risorsa particolare viene fatto riferimento come Estensione del markup DynamicResource (in XAML è possibile utilizzare un riferimento di risorsa statica o dinamica). Per utilizzare un riferimento di risorsa dinamica, è necessario eseguire l'impostazione su una proprietà di dipendenza, in modo che il sistema di proprietà WPF attivi l'utilizzo spedifico del riferimento di risorsa dinamica. Per ulteriori informazioni, vedere Cenni preliminari sulle risorse.
Associazione dati
Una proprietà di dipendenza può fare riferimento a un valore tramite l'associazione dati. Quest'ultima funziona tramite una sintassi per estensione di markup specifica in XAML o mediante l'oggetto Binding nel codice. Con l'associazione dati, la determinazione del valore della proprietà finale viene rinviata fino al runtime, momento in cui il valore viene ottenuto da un'origine dati.
Nell'esempio seguente viene impostata la proprietà Content per un oggetto Button, utilizzando un'associazione in XAML. L'associazione utilizza un contesto dati ereditato e un'origine dati XmlDataProvider (non visualizzata). L'associazione stessa specifica la proprietà di origine desiderata mediante l'oggetto XPath all'interno dell'origine dati.
<Button Content="{Binding XPath=Team/@TeamName}"/>
Le proprietà di dipendenza o la classe DependencyObject non supportano in modo nativo l'oggetto INotifyPropertyChanged per la produzione delle notifiche delle modifiche del valore della proprietà di origine DependencyObject per le operazioni di associazione dati. Per ulteriori informazioni su come creare proprietà da utilizzare nell'associazione dati che consentano di segnalare modifiche di una destinazione di associazione dati, vedere Cenni preliminari sull'associazione dati.
Stili
Stili e modelli sono due degli scenari principali che giustificano l'utilizzo delle proprietà di dipendenza. Gli stili sono particolarmente utili per l'impostazione di proprietà che definiscono l'interfaccia utente dell'applicazione. In genere vengono definiti come risorse in XAML e interagiscono con il sistema di proprietà in quanto di solito contengono metodi di impostazione per proprietà particolari, nonché "trigger" che modificano un valore della proprietà in base al valore in tempo reale per un'altra proprietà.
Nell'esempio seguente viene creato uno stile molto semplice (definito all'interno di un dizionario Resources, non visualizzato) che viene successivamente applicato direttamente alla proprietà Style di un oggetto Button. Il metodo di impostazione dello stile imposta la proprietà Background di un oggetto Button a cui è stato applicato uno stile sul colore verde.
<Style x:Key="GreenButtonStyle">
<Setter Property="Control.Background" Value="Green"/>
</Style>
<Button Style="{StaticResource GreenButtonStyle}">I am green!</Button>
Per ulteriori informazioni, vedere Applicazione di stili e modelli.
Animations
Alle proprietà di dipendenza è possibile aggiungere un'animazione. Quando un'animazione viene applicata ed è in esecuzione, il valore a cui è stata aggiunta un'animazione opera a un livello di precedenza superiore rispetto a qualsiasi altro valore (ad esempio un valore locale) di cui la proprietà dispone.
Nell'esempio seguente viene aggiunta un'animazione all'oggetto Background in una proprietà Button. Tecnicamente, all'oggetto Background viene aggiunta un'animazione utilizzando la sintassi per elementi della proprietà per specificare un oggetto SolidColorBrush vuoto come oggetto Background, quindi la proprietà Color di quell'oggetto SolidColorBrush è la proprietà a cui viene aggiunta direttamente l'animazione.
<Button>I am animated
<Button.Background>
<SolidColorBrush x:Name="AnimBrush"/>
</Button.Background>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Loaded">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="AnimBrush"
Storyboard.TargetProperty="(SolidColorBrush.Color)"
From="Red" To="Green" Duration="0:0:5"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
Per ulteriori informazioni sull'animazione di proprietà, vedere Cenni preliminari sull'animazione e Cenni preliminari sugli storyboard.
Override dei metadati
È possibile modificare determinati comportamenti di una proprietà di dipendenza eseguendo l'override dei metadati per quella proprietà, quando si deriva dalla classe che registra originariamente la proprietà di dipendenza. L'esecuzione dell'override dei metadati si basa sull'identificatore DependencyProperty. L'esecuzione dell'override dei metadati non richiede una nuova implementazione della proprietà. La modifica dei metadati viene gestita in modo nativo dal sistema di proprietà; ogni classe contiene, potenzialmente, i metadati specifici per tutte le proprietà ereditate dalle classi base, in base al tipo.
Nell'esempio seguente viene eseguito l'override dei metadati per una proprietà di dipendenza DefaultStyleKey. L'esecuzione dell'override dei metadati di questa particolare proprietà di dipendenza fa parte di un modello di implementazione che consente di creare controlli che possono utilizzare stili predefiniti dai temi.
public class SpinnerControl : ItemsControl
{
static SpinnerControl()
{
DefaultStyleKeyProperty.OverrideMetadata(
typeof(SpinnerControl),
new FrameworkPropertyMetadata(typeof(SpinnerControl))
);
}
}
Per ulteriori informazioni sull'override o su come ottenere i metadati delle proprietà, vedere Metadati della proprietà di dipendenza.
Ereditarietà del valore della proprietà
Un elemento può ereditare il valore di una proprietà di dipendenza dal relativo elemento padre nella struttura ad albero.
Nota: |
|---|
Il comportamento dell'ereditarietà del valore della proprietà non viene attivato a livello globale per tutte le proprietà di dipendenza, poiché il tempo di calcolo per l'ereditarietà influisce negativamente sulle prestazioni. In genere, l'ereditarietà del valore della proprietà viene attivata solo per le proprietà in cui uno scenario particolare suggerisce che tale ereditarietà è appropriata. La possibilità di ereditare di una proprietà di dipendenza può essere determinata consultando la sezione relativa alle informazioni sulle proprietà di dipendenza per una determinata proprietà di dipendenza, nel riferimento SDK. |
Nell'esempio seguente viene descritta un'associazione e impostata la proprietà DataContext che specifica l'origine dell'associazione, non illustrata nell'esempio di associazione precedente. Il valore della proprietà DataContext viene ereditato, pertanto qualsiasi associazione successiva negli elementi figlio non deve rispettare l'origine specificata come oggetto DataContext nell'elemento StackPanel padre.
<StackPanel Canvas.Top="50" DataContext="{Binding Source={StaticResource XmlTeamsSource}}">
<Button Content="{Binding XPath=Team/@TeamName}"/>
</StackPanel>
Per ulteriori informazioni, vedere Ereditarietà del valore della proprietà.
Integrazione della finestra di Progettazione WPF
Un controllo personalizzato con proprietà implementate come proprietà di dipendenza riceverà un supporto Progettazione Windows Presentation Foundation (WPF) per Visual Studio appropriato. Un esempio è rappresentato dalla capacità di modificare proprietà di dipendenza dirette e associate tramite la finestra Proprietà. Per ulteriori informazioni, vedere Cenni preliminari sulla modifica di controlli.