Condividi tramite


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 e ArrangeOverride forniscono informazioni sul comportamento e sul rendering specifici dell'implementazione nel sistema di layout. Quando AffectsArrange, AffectsMeasureo AffectsRender sono impostati su true 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 usare IsNotDataBindable 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 flag Journal per le proprietà i cui valori includono selezioni utente che devono essere archiviate. Il flag Journal 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:

  1. 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 di FrameworkPropertyMetadata usando un costruttore che abbia un parametro FrameworkPropertyMetadataOptions e passa il tuo oggetto FrameworkPropertyMetadataOptions. Per modificare i flag di metadati dopo aver passato FrameworkPropertyMetadataOptions nel costruttore FrameworkPropertyMetadata, cambia la proprietà corrispondente nella nuova istanza di FrameworkPropertyMetadata. Ad esempio, se si imposta il flag FrameworkPropertyMetadataOptions.NotDataBindable, è possibile annullare tale flag impostando il flag FrameworkPropertyMetadata.IsNotDataBindable su false.

  2. Creare un'istanza di FrameworkPropertyMetadata usando un costruttore senza il parametro FrameworkPropertyMetadataOptions e quindi impostare i flag di Boolean applicabili su FrameworkPropertyMetadata. Imposta i valori dei flag prima di associare l'istanza di FrameworkPropertyMetadata 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 flag Inherits impostato, il valore predefinito proviene dall'antenato più vicino che ha specificato DefaultValue nei metadati.

  • Per un CoerceValueCallback, il nuovo valore sostituirà un valore di CoerceValueCallback esistente. Se non si specifica un CoerceValueCallback nei metadati di override, il valore proviene dal predecessore più vicino nella catena di ereditarietà che ha specificato un CoerceValueCallback.

  • Per i flag FrameworkPropertyMetadata non ereditati, è possibile sostituire il valore predefinito false con un valore true. È tuttavia possibile eseguire l'override di un valore di true solo con un valore di false 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