Arhivă blog - Proprietăți dependente

  1. introducere
  2. Domeniul variabilelor
  3. Magia expunerii
  4. Cum se creează proprietăți dependente
  5. Proprietăți dependente numai de citire
  6. Proprietăți dependente de proprietăți
  7. Urmărirea modificărilor în proprietățile dependente
  8. Cum să ștergeți o variabilă locală

Când începeți să vă dezvoltați aplicațiile WPF, veți fi în curând în DependencyProperties. Ele sunt aproape identice cu proprietățile normale ale .NET, însă conceptul lor este de multe ori mai complicat și mai funcțional.







Principala diferență constă în faptul că variabila în proprietatea .NET normală este citită de la un membru privat al clasei, în timp ce aceasta se numește DependencyProperty dinamic atunci când apelați GetValue (), care, la rândul său, este moștenit de la DepedencyObject.

Când setați o valoare pentru o proprietate dependentă, aceasta nu este stocată în câmpul obiectului dvs., dar este stocată în dicționarul cheilor și valorilor furnizate de clasa de bază DependencyObject. Cheia pe care o introduceți este numele proprietății, iar variabila este valoarea pe care doriți să o setați.

Avantajele proprietatilor dependente:

Păstrarea unui câmp pentru fiecare proprietate reprezintă o risipă uriașă de resurse, mai ales atunci când credeți că mai mult de 90% din proprietățile interfeței cu utilizatorul stau de obicei în starea inițială. Proprietățile dependente rezolvă această problemă stocând numai proprietatea modificată. Valorile implicite sunt salvate o singură dată.

Când vă referiți la o proprietate dependentă, valoarea se găsește utilizând o tehnică specifică. Dacă valoarea locală nu este deja stabilită, proprietatea dependentă deplasează copacul logic până când găsește această valoare. Când setați parametrul FontSize pentru root (elementul de nivel superior), parametrul va fi alocat automat tuturor blocurilor de text inferioare, cu excepția celor care au fost redefinite.

Proprietățile dependente au un mecanism încorporat pentru a-și notifica modificările. Când înregistrați un apel invers în metadate, veți ști când o valoare sau o proprietate a fost modificată. Acest mecanism este, de asemenea, utilizat atunci când se utilizează legarea datelor.

Domeniul variabilelor

De fiecare dată când accesați proprietatea dependentă, valoarea este selectată automat în funcție de prioritate - de la ridicat la scăzut. Apoi, valoarea locală este verificată sau nu. Dacă nu (declanșatorul de stil personalizat este activ), ... această procedură se face din nou până când se găsește o valoare. Când valoarea implicită este întotdeauna disponibilă.

Arhivă blog - Proprietăți dependente

Magia expunerii ...

Fiecare registru al registrului de control WPF este o colecție de proprietăți dependente, clasa Dependență Property. Fiecare dintre ele constă într-o cheie care trebuie să fie unică pentru tip; și metadatele care conțin valori de apel invers și valori implicite.

Toate tipurile care utilizează DependencyProperties trebuie moștenite din Obiectul de dependență. Această clasă de bază va determina cheia și valoarea dicționarului, care conține valorile locale ale proprietăților dependente. Ie Cheia pe care o introduceți este cheia definită de proprietatea dependentă.

Când accesați proprietatea dependentă prin wrapperul proprietății .NET, GetValue (DependencyProperty) este chemat să acceseze valoarea. Această metodă obține valoarea folosind procedura prezentată în imaginea de mai jos. Dacă este disponibilă o variabilă locală, ea o citește direct fără un dicționar. Dacă nu există nici o variabilă, ea urcă arborele logic și caută valoarea mostenită. Dacă nu se găsește nicio valoare, este nevoie de valoarea implicită setată în proprietățile metadatelor. Această secvență este ușor simplificată, dar prezintă conceptele de bază ale funcționării mecanismului.







Arhivă blog - Proprietăți dependente

Cum se creează proprietăți dependente?

Pentru a crea o proprietate dependentă, adăugați un câmp static de tip DependencyProperty la tipul dvs. și apelați funcția DependencyProperty.Register () pentru a crea o instanță a unei proprietăți dependente. Numele proprietății dependente trebuie să se încheie întotdeauna cu ... Proprietatea. Deci, convenția, cu privire la numele în WPF solicită.

Pentru a permite accesul la aceasta ca o proprietate .NET normală, trebuie să creați un pachet pentru această proprietate. Acest înveliș nu face altceva decât să primească și setează valoarea utilizând metoda GetValue () și SetValue (), moștenit de la DependencyObject și transmite o proprietate de dependență - DependencyProperty ca o cheie.

[Important]: Nu adăugați nicio logică acestor proprietăți, deoarece acestea sunt numite o singură dată când instalați proprietatea din cod. Dacă setați o proprietate din XAML, metoda SetValue () este apelată direct.

Dacă utilizați mediul de dezvoltare VisualStudio, puteți introduce "propdp" și faceți dublu clic pe TAB. pentru a crea o proprietate dependentă.

Fiecare proprietate dependentă este prevăzută cu o funcție de apel invers în scopul de a putea notifica, deține o valoare sau verifică.

Notificarea schimbării valorii (apel invers)

O notificare de modificare a valorii este o metodă statică care se numește de fiecare dată când se modifică valoarea TimeProperty. Noua valoare este transmisă EventArgs; Obiectul la care sa schimbat valoarea este transmis ca sursă.

Ținerea valorii (apel invers)

Redirecționarea forțată vă permite să ajustați valoarea dacă aceasta nu se află în raza de acțiune, fără a genera o excepție. Un bun exemplu este banda de sarcină a cărei valoare poate fi stabilită sub minim sau mai mare decât valoarea maximă. În acest caz, putem forța valoarea în interiorul limitelor. Exemplul arată modul în care am stabilit o limită de timp pentru a păstra timpul în trecut.

Verificarea valorii (apel invers)

Verificând valoarea pentru corectitudine, verificați dacă valoarea valabilității este corectă. Dacă este falsă, înseamnă că o ArgumentException va fi aruncată. Acest exemplu necesită ca datele să nu fie o excepție de la DateTime.

Proprietățile dependente sunt numai pentru citire

Unele proprietăți dependente în controalele WPF sunt doar pentru citire. Ele sunt adesea folosite pentru a monitoriza starea controlului. De exemplu, proprietatea IsMouseOver. Nu este nevoie să setați nicio valoare pentru această proprietate.

Poate vă întrebați, de ce nu utilizați o proprietate .NET normală? Unul dintre principalele motive este că nu puteți seta declanșatorul la o proprietate .NET normală.

Crearea unei proprietăți care este doar pentru citire este similară cu crearea unei normale DependencyProperty.Insted. În loc de a apela DependencyProperty.Register (), numiți DependencyProperty.RegisterReadonly (). Aceasta se întoarce la dvs. DependencyPropertyKey. Această cheie trebuie stocată într-un câmp privat sau într-un câmp protejat static, pentru citire, din clasa dvs. Cheia vă oferă acces la valorile de setare din cadrul clasei dvs. și vă permite să o utilizați ca proprietate dependentă de normă.

Cel de-al doilea lucru este să înregistrați o proprietate dependentă publică care este atribuită funcției DependencyPropertyKey.DependencyProperty. Această proprietate este numai pentru citire, cu acces extern.

Proprietăți imbricate

Proprietățile imobile sunt un tip special de DependencyProperty. Acestea vă permit să specificați o valoare pentru un obiect care nu știe nimic despre această valoare.

Un bun exemplu este mecanismul de aranjare a panourilor. Fiecare panou are nevoie de date diferite, pentru capacitatea de aliniere a copiilor. Suprafața de lucru (Canvas) necesită parametrii Top și Stânga. Panoul atașat necesită parametrul Dock, etc. În cele din urmă, puteți să vă scrieți aspectul aspectului propriu al panourilor, această listă este nesfârșită. Puteți vedea că nu puteți avea aceleași proprietăți în toate controalele WPF.

Această problemă poate fi rezolvată prin proprietăți imbricate. Acestea sunt definite de elemente care la rândul lor au nevoie de date de la alte elemente într-un context specific. De exemplu, un element care este aliniat pe panoul părinte.

Pentru a seta valorile proprietății imbricate, adăugați atributul XAML cu prefixul elementului care furnizează proprietatea imbricată. Pentru a seta proprietățile butoanelor Canvas.Top și Canvas.Left, aliniate în interiorul suprafeței de lucru. Puteți scrie:

Urmărirea modificărilor în proprietățile dependente

Dacă doriți să urmăriți o proprietate de dependență, moștenesc tipul care definește proprietatea, și apoi suprascrie metadatele de proprietate, și să treacă un apel invers - PropertyChangedCallback (). Cu toate acestea, este mult mai ușor să obțineți un DependencyPropertyDescriptor și să conectați un apel invers folosind apelul AddValueChanged ().

Cum pot elimina o valoare locală?

NULL este, de asemenea, o valoare locală valabilă. Prin urmare, există o constantă DependencyProperty.UnsetValue, care descrie o valoare unset.







Articole similare

Trimiteți-le prietenilor: