Metadati delle proprietà del framework (WPF .NET)
È possibile impostare le opzioni dei metadati delle proprietà del framework per le proprietà di dipendenza nel framework di Windows Presentation Foundation (WPF). La designazione del livello del framework WPF si applica quando le API di presentazione WPF e i file eseguibili gestiscono il rendering e il data binding. Le API di presentazione e i file eseguibili effettuano query sul FrameworkPropertyMetadata di una proprietà dipendente.
Prerequisiti
L'articolo presuppone una conoscenza di base delle proprietà di dipendenza e che tu abbia letto la "Panoramica delle proprietà di dipendenza" . Per seguire gli esempi in questo articolo, è utile se si ha familiarità con Extensible Application Markup Language (XAML) e si sa come scrivere applicazioni WPF.
Categorie di metadati delle proprietà del framework
FrameworkPropertyMetadata rientra in queste categorie:
Metadati che influiscono sul layout di un elemento, in particolare i flag di metadati AffectsArrange, AffectsMeasuree AffectsRender. È possibile impostare questi flag se l'implementazione della proprietà di dipendenza influisce su un aspetto visivo e si implementano MeasureOverride o ArrangeOverride nella classe. I metodi
MeasureOverride
eArrangeOverride
forniscono informazioni sul comportamento e sul rendering specifici dell'implementazione nel sistema di layout. QuandoAffectsArrange
,AffectsMeasure
oAffectsRender
sono impostati sutrue
nei metadati di una proprietà di dipendenza e il relativo valore effettivo cambia, il sistema di proprietà WPF avvierà una richiesta di invalidare gli elementi visivi dell'elemento per eseguire un nuovo rendering.Metadati che influiscono sul layout dell'elemento padre di un elemento, in particolare i flag di metadati AffectsParentArrange e AffectsParentMeasure. Esempi di proprietà di dipendenza WPF che impostano questi flag sono FixedPage.Left e Paragraph.KeepWithNext.
Metadati di ereditarietà dei valori della proprietà, in particolare i flag di metadati Inherits e OverridesInheritanceBehavior. Per impostazione predefinita, le proprietà di dipendenza non ereditano i valori. OverridesInheritanceBehavior consente al percorso di ereditarietà di spostarsi anche in una struttura ad albero visuale, necessaria per alcuni scenari di composizione dei controlli. Per altre informazioni, vedere ereditarietà del valore della proprietà
. Nota
Il termine "eredita" nel contesto dei valori delle proprietà è specifico delle proprietà di dipendenza e non è direttamente correlato ai tipi di codice gestito e all'ereditarietà dei membri tramite tipi derivati. Nel contesto delle proprietà di dipendenza, significa che gli elementi figlio possono ereditare i valori delle proprietà di dipendenza dagli elementi padre.
I metadati di associazione dati, in particolare i flag BindsTwoWayByDefault e IsNotDataBindable. Per impostazione predefinita, le proprietà di dipendenza nel framework WPF supportano l'associazione unidirezionale. È consigliabile impostare l'associazione bidirezionale come predefinita per le proprietà che segnalano lo stato; e sono modificabili dall'azione dell'utente, ad esempio dall'azione IsSelected. È inoltre consigliabile impostare l'associazione bidirezionale come predefinita quando gli utenti di un controllo prevedono l'implementazione di una proprietà, ad esempio TextBox.Text.
BindsTwoWayByDefault
influisce solo sulla modalità di associazione predefinita. Per modificare la direzione del flusso di dati di un vincolo, configurare Binding.Mode. È possibile usareIsNotDataBindable
per disabilitare il data binding quando non esiste alcun caso d'uso. Per ulteriori informazioni sui collegamenti dati, consultare la panoramica sui collegamenti dati .Registrazione di metadati, in particolare il flag Journal. Il valore predefinito del flag
Journal
ètrue
solo per alcune proprietà di dipendenza, ad esempio SelectedIndex. I controlli di input utente devono impostare il flagJournal
per le proprietà i cui valori includono selezioni utente che devono essere archiviate. Il flagJournal
viene letto da applicazioni o servizi che supportano la registrazione, inclusi i servizi di registrazione WPF. Per informazioni su come archiviare i passaggi di navigazione, vedere la panoramica di navigazione .
FrameworkPropertyMetadata deriva direttamente da UIPropertyMetadatae implementa i flag descritti qui. A meno che non vengano impostati in modo specifico, i flag FrameworkPropertyMetadata
hanno un valore predefinito false
.
Lettura di FrameworkPropertyMetadata
Per recuperare i metadati per una proprietà dipendente, chiamare GetMetadata sull'identificatore DependencyProperty. La chiamata GetMetadata
restituisce un oggetto PropertyMetadata
. Se è necessario eseguire query sui valori dei metadati del framework, effettuare il cast di PropertyMetadata
a FrameworkPropertyMetadata.
Specificazione di FrameworkPropertyMetadata
Quando si registra una proprietà di dipendenza, è possibile creare e assegnare metadati. L'oggetto metadati assegnato può essere PropertyMetadata o una delle relative classi derivate, ad esempio FrameworkPropertyMetadata. Scegliere FrameworkPropertyMetadata
per le proprietà di dipendenza che si basano sulle API di presentazione WPF e sui file eseguibili per il rendering e il data binding. Un'opzione più avanzata consiste nel derivare da FrameworkPropertyMetadata
per creare una classe di report di metadati personalizzata con più flag. In alternativa, è possibile usare UIPropertyMetadata per le proprietà non del framework che influiscono sul rendering dell'interfaccia utente.
Anche se le opzioni dei metadati vengono in genere impostate durante la registrazione di una nuova proprietà di dipendenza, è possibile rispecificarle nelle chiamate OverrideMetadata o AddOwner. Quando si esegue l'override dei metadati, eseguire sempre l'override con lo stesso tipo di metadati usato durante la registrazione delle proprietà.
Le caratteristiche delle proprietà esposte da FrameworkPropertyMetadata
sono talvolta chiamate flag . Se si crea un'istanza di FrameworkPropertyMetadata
, è possibile popolare i valori dei flag in due modi:
Imposta i flag su un'istanza del tipo di enumerazione FrameworkPropertyMetadataOptions.
FrameworkPropertyMetadataOptions
consente di specificare flag di metadati in combinazione con l'operazione OR a livello di bit. Quindi, crea un'istanza diFrameworkPropertyMetadata
usando un costruttore che abbia un parametroFrameworkPropertyMetadataOptions
e passa il tuo oggettoFrameworkPropertyMetadataOptions
. Per modificare i flag di metadati dopo aver passatoFrameworkPropertyMetadataOptions
nel costruttore FrameworkPropertyMetadata, cambia la proprietà corrispondente nella nuova istanza diFrameworkPropertyMetadata
. Ad esempio, se si imposta il flag FrameworkPropertyMetadataOptions.NotDataBindable, è possibile annullare tale flag impostando il flag FrameworkPropertyMetadata.IsNotDataBindable sufalse
.Creare un'istanza di
FrameworkPropertyMetadata
usando un costruttore senza il parametroFrameworkPropertyMetadataOptions
e quindi impostare i flag di Boolean applicabili suFrameworkPropertyMetadata
. Imposta i valori dei flag prima di associare l'istanza diFrameworkPropertyMetadata
a una proprietà di dipendenza, altrimenti otterrai un InvalidOperationException.
Comportamento di sovrascrittura dei metadati
Quando si esegue l'override dei metadati delle proprietà del framework, i valori dei metadati modificati sostituiscono o vengono uniti con i valori originali:
Per un PropertyChangedCallback, la logica di merge predefinita mantiene i valori precedenti di
PropertyChangedCallback
in una tabella, e tutti vengono richiamati in risposta a una modifica della proprietà. L'ordine di callback è determinato dalla profondità della classe, dove un callback registrato dalla classe base nella gerarchia viene eseguito per primo. I callback ereditati vengono eseguiti una sola volta e sono di proprietà della classe che le ha aggiunte ai metadati.Per un DefaultValue, il nuovo valore sostituirà il valore predefinito esistente. Se non si specifica un
DefaultValue
nei metadati di override e se il FrameworkPropertyMetadata esistente ha il flagInherits
impostato, il valore predefinito proviene dall'antenato più vicino che ha specificatoDefaultValue
nei metadati.Per un CoerceValueCallback, il nuovo valore sostituirà un valore di
CoerceValueCallback
esistente. Se non si specifica unCoerceValueCallback
nei metadati di override, il valore proviene dal predecessore più vicino nella catena di ereditarietà che ha specificato unCoerceValueCallback
.Per i flag
FrameworkPropertyMetadata
non ereditati, è possibile sostituire il valore predefinitofalse
con un valoretrue
. È tuttavia possibile eseguire l'override di un valore ditrue
solo con un valore difalse
per Inherits, Journal, OverridesInheritanceBehaviore SubPropertiesDoNotAffectRender.
Nota
La logica di unione predefinita viene implementata dal metodo Merge. È possibile specificare la logica di unione personalizzata in una classe derivata che eredita una proprietà di dipendenza eseguendo l'override di Merge
in tale classe.
Vedere anche
.NET Desktop feedback