Elementele personalizate oferă un mod destul de nedureros, dar într-un fel limitat de a crea controale speciale. Pentru a înțelege de ce, să aruncăm o privire mai atentă la modul în care UserControl funcționează.
"În spatele scenei", clasa UserControl funcționează în același mod ca și clasa ContentControl, din care este moștenit. De fapt, există câteva diferențe cheie:
Clasa UserControl modifică unele dintre valorile implicite. Anume: stabilește IsTabStop și focalizabil la fals (astfel încât să nu ocupe un loc separat în secvența traversării cheii
Clasa UserControl aplică un nou șablon de control, constând dintr-un element de frontieră care înfășoară ContentPresenter. Elementul ContentPresenter stochează conținutul adăugat de codul de markup.
Clasa UserControl modifică sursa evenimentelor rutate. Atunci când un eveniment este propagat de o bubble sau este tunelat de la un controler din interiorul elementului utilizator la un element care se află în afara acestuia, sursa se schimbă și indică spre controlul utilizatorului în locul elementului original. Acest lucru crește ușor gradul de încapsulare.
De exemplu, atunci când procesați un eveniment UIElement.MouseLeftButtonDown într-un container de aspect care conține un pointer de culoare creat anterior, un eveniment va fi primit când butonul mouse-ului este apăsat în interiorul dreptunghiului. Cu toate acestea, sursa acestui eveniment nu este dreptunghiul, ci obiectul ColorPicker care conține acest dreptunghi. Dacă creați același pointer de culoare ca un element obișnuit cu conținut, acest lucru nu se va întâmpla - în acest caz, aveți responsabilitatea de a intercepta evenimentul în control, de a procesa și de ao invoca.
Cea mai importantă diferență dintre elementele utilizatorului și alte tipuri de controale speciale este modul în care sunt proiectate. Ca toate controalele, elementele personalizate au un șablon. Cu toate acestea, acest model este schimbat rar. În schimb, codul de markup este creat ca parte a clasei de clasă de control specială a utilizatorului și acest cod de marcare este procesat folosind metoda InitializeComponent () atunci când elementul este creat. Pe de altă parte, un control care nu are aspect nu are un marcaj. Tot ce are nevoie este un șablon.
Conținutul obișnuit ContentControl are următorul șablon simplificat:
Acest șablon se completează numai cu conținutul primit și aplică un șablon de conținut opțional. Proprietăți precum Padding, Background, HorizontalAlignment și VerticalAlignment nu au efect decât dacă le obligați în mod explicit.
UserControl are un model similar, dar cu câteva subtilități suplimentare. Cel mai evident, el adaugă un element Frontieră și leagă proprietățile de proprietățile BorderBrush, BorderThickness, Background și Padding ale controlului utilizatorului, astfel încât acestea să facă ceva. În plus, conținutul ContentPresenter este legat de proprietățile de aliniere.
Formal, șablonul controlului utilizatorului poate fi modificat. De fapt, puteți să mutați tot codul de marcare într-un șablon, modificându-l ușor. Dar, de fapt, nu este nevoie de a face acest lucru: dacă aveți nevoie de un control mai flexibil, care este separată de aspectul interfeței furnizate de clasa elementului, este mai bine pentru a crea un control personalizat, care este lipsit de aspectul, așa cum este descris în următorul articol.