WPF --- WPF Elemente de bază --- Detectarea și înregistrarea proprietăților de dependență
Proprietățile dependenței trebuie create mult mai puțin frecvent decât cele utilizate. Cu toate acestea, există multe motive pentru care trebuie să vă creați propria proprietate de dependență. Evident, ele vor fi un ingredient cheie atunci când creați un element personalizat WPF. Dar acestea vor fi de asemenea necesare atunci când aveți nevoie să adăugați legare de date, animație sau altă caracteristică WPF la un fragment de cod care altfel nu ar putea să-l susțină. Crearea unei proprietăți de dependență nu este foarte dificilă, deși trebuie să vă obișnuiți cu sintaxa. Este complet diferită de sintaxa proprietății obișnuite .NET.
Proprietățile de dependență pot fi adăugate numai la obiectele dependente-clase derivate din DependencyObject. Din fericire, majoritatea componentelor-cheie ale infrastructurii WPF sunt derivate indirect din DependencyObject. Cel mai evident exemplu al acestei generații sunt elementele.
În primul rând, trebuie să definiți obiectul care va reprezenta proprietatea. Aceasta este o instanță a clasei DependencyProperty. Informațiile despre proprietăți trebuie să fie disponibile permanent și, eventual, chiar și în alte clase (ca de obicei pentru elementele WPF). Din acest motiv, obiectul DependencyProperty ar trebui să fie definit ca un câmp static în clasa asociată.
De exemplu, clasa FrameworkElement definește proprietatea Margini care este accesibilă tuturor elementelor. Desigur, marja este o proprietate a dependenței. Aceasta înseamnă că este definită în clasa FrameworkElement după cum urmează:
Se face o înțelegere conform căreia domeniul reprezentând proprietatea de dependență are numele proprietății obișnuite, cu adăugarea cuvântului proprietate la sfârșit. În acest fel, puteți separa definiția proprietății de dependență de numele proprietății în sine. Câmpul este definit cu cuvântul cheie readonly - aceasta înseamnă că valoarea acestuia poate fi setată numai în constructorul static pentru clasa FrameworkElement, dar acesta este următorul pas.
Înregistrarea proprietății dependenței
Definiția obiectului DependencyProperty este doar primul pas. Pentru ao activa, trebuie să înregistrați proprietatea de dependență în WPF. Acest lucru trebuie făcut înainte de a utiliza această proprietate în cod, deci definiția trebuie făcută în constructorul static al clasei asociate.
WPF garantează că obiectele DependencyProperty nu vor fi create direct, deoarece clasa DependencyProperty nu are un constructor public. O instanță a DependencyProperty poate fi creată numai utilizând metoda statică DependencyProperty.Register (). WPF garantează, de asemenea, că nu este posibilă modificarea obiectelor de dependență după ce au fost create, deoarece toți membrii DependencyProperty sunt doar pentru citire, iar valorile lor trebuie specificate ca argumente în metoda Register ().
Următorul fragment de cod arată un exemplu de creare a unei proprietăți de dependență. Aici, clasa FrameworkElement utilizează un constructor static pentru a inițializa MarginProperty:
Înregistrarea proprietății dependenței se realizează în două etape. În primul rând, creați FrameworkPropertyMetadata obiect care specifică serviciile pe care le doriți să utilizați cu proprietatea de dependență (de exemplu, date cu caracter obligatoriu sprijin, animație, și exploatare forestieră). Apoi, proprietatea este înregistrată, pentru care se numește metoda DependencyProperty.Register (). Aici trebuie să identificați câteva ingrediente cheie:
numele proprietății (în acest exemplu este Marja);
tipul de date utilizat de proprietate (în acest exemplu, este o structură de grosime);
Tipul de care aparține această proprietate (în acest exemplu, este clasa FrameworkElement);
un obiect FrameworkPropertyMetadata cu parametri de proprietate suplimentari (opțional);
callback, care verifică dacă proprietatea este corectă (opțional).
Cu primele trei ingrediente, totul pare să fie clar. Mai interesante sunt obiectul FrameworkPropertyMetadata și apelul de testare.
Obiectul FrameworkPropertyMetadata este folosit pentru a configura caracteristicile suplimentare ale proprietății de dependență care este în curs de creare. Majoritatea proprietăților clasei FrameworkPropertyMetadata sunt steagurile logice obișnuite care sunt activate pentru a activa aceste funcții (în mod implicit, toate aceste steaguri sunt setate la false). Dar unele dintre ele sunt callbacks care indică metodele definite de utilizator care sunt create pentru a efectua sarcini specifice. Una dintre aceste proprietăți este FrameworkPropertyMetadata.DefaultValue - stabilește valoarea implicită pe care WPF o va folosi la inițializarea proprietății. Următoarele sunt proprietățile FrameworkPropertyMetadata:
Proprietățile clasei FrameworkPropertyMetadata
AffectsArrange, AffectsMeasure, AffectsParentArrange, AffectsParentMeasure
Dacă este adevărat, atunci proprietatea dependenței poate afecta localizarea elementelor adiacente (sau a elementului părinte) în timpul etapelor de măsurare și de dispunere în operația de construire. De exemplu, proprietatea dependenței de marjă stabilește AffectsMeasure la true - aceasta înseamnă că atunci când schimbați câmpurile membre, containerul de aspect trebuie să repete etapa de măsurare pentru a determina noua plasare a elementelor
Dacă este adevărat, atunci proprietatea de dependență poate afecta aspectul elementului, ceea ce necesită redeschiderea elementului
Dacă este adevărat, atunci proprietatea de dependență va folosi nu una față-verso (implicit), dar legarea datelor bidirecționale. Cu toate acestea, atunci când creați o legătură, puteți specifica în mod explicit comportamentul acestuia
Dacă este adevărat, atunci valoarea proprietății dependenței se propagă prin arborele elementului și poate fi moștenită de elementele imbricate. De exemplu, o proprietate moștenită de dependență este font: dacă ați setat la un element de cel mai înalt nivel, este moștenită de elemente imbricate, cu excepția cazului în setările de fonturi rescrisă în mod explicit
Dacă este adevărat, atunci proprietatea dependenței nu poate fi utilizată în animație
Dacă este adevărat, atunci valoarea proprietății dependenței nu poate fi stabilită în expresia obligatorie
Dacă este adevărat, atunci în aplicația de pagină valoarea proprietății dependenței va fi stocată în jurnal (istoricul paginilor vizitate)
Dacă este adevărat, WPF nu va redrage obiectul atunci când una dintre proprietățile sale este schimbată (proprietatea proprietății)
Setează valoarea implicită pentru proprietatea Binding.UpdateSourceTrigger când această proprietate este utilizată în expresia de legare. Proprietatea UpdateSourceTrigger determină momentul în care se aplică modificările valorii limită. Puteți seta proprietatea UpdateSourceTrigger manual când creați o legare
Setează valoarea implicită pentru proprietatea de dependență
Oferă un apel invers care încearcă să "repare" valoarea unei proprietăți înainte de a fi bifată