Mis need on?
User Controlid ehk kasutajakontrollid (?) on viis kasutajaliidese ja ka loogika kaspeldamiseks Silverlight ja ASP.NET rakendustes.
Lihtsaim näide sellest on tavaline vorm aadressi sisestamiseks – teate ju küll neid (riik, maakond, linn/küla,indeks, maja, korter), selle tegemine nõuaks mingi ~10 rida XAML koodi ilmselt. Aga kujutagem ette stsenaariumit, kus on vaja kaht sellist vormi näiteks arve aadressi ja postiaadressi jaoks, siis läheks ju juba ~20 rida XAML koodi + ehk on veel ka mingi loogika, mis kontrollib, kas vormid on hästi täidetud. Et vähem koodi oleks, on meil vaja aadressivorm kapseldada kasutajakontrolliks nii et seda saaks taaskasutada!
Kes tahab teada, kuidas see aadressi vormide näide täpselt edasi käib, võib lugeda Scott Guthre’i blogipostitust, mina jätkan näitega, kus mul on väga paljudest Path punktidest koosnev lumehelves, mida ma tahaks sadu kordi kloonida, et tuleks korralik lumesadu!
Miks neid vaja läheb?
Esialgne lumehelves on selline, see koosneb 1857 tähemärgist, ehk siis on piisavalt suur, et ma ei tahaks seda 100 kordi lõigata ja kleepida:
<Path x:Name="Snowflake" Width="40" Height="40" Stretch="Fill"
Fill="#FFD9F3F2" Data="F1 M 20.205,19.59L 20.205,17.7075L />
18.765,16.8L 17.3775,17.7075L 17.3775,19.59L
18.765,20.4975L 20.205,19.59 Z M 37.5825,24L
34.275,24L 32.115,20.64L 29.1375,20.64L
31.2975,24L 27.9825,24L 25.8225,20.64L
21.885,20.64L 23.805,23.8575L 27.7425,24L
29.4225,26.88L 25.44,26.925L 26.925,29.61L
30.9075,29.76L 32.5425,32.64L 28.56,32.355L
29.52,33.9825L 26.31,35.805L 25.395,34.2225L
23.4225,37.92L 21.7575,34.9275L 23.6775,31.3275L
22.275,28.8L 20.3025,32.64L 18.63,29.58L
20.55,25.845L 18.6075,22.515L 16.755,25.7775L
18.6225,29.3325L 16.9425,32.16L 15.0675,28.6575L
13.5825,31.245L 15.4575,34.755L 13.8225,37.5825L
11.955,34.08L 11.04,35.6625L 7.8225,33.84L
8.7825,32.205L 4.6575,32.355L 6.2925,29.52L
10.4175,29.3775L 11.9025,26.835L 7.7775,26.925L
9.4575,24.09L 13.5375,23.9475L 15.5025,20.5425L
11.805,20.5425L 9.69,23.9025L 6.285,23.9025L
8.4,20.5425L 5.565,20.5425L 3.45,23.9025L
0.0449994,23.9025L 2.16,20.5425L 0.3375,20.5425L
0.3375,16.845L 2.16,16.845L 0,13.3425L 3.2625,13.3425L
5.475,16.845L 8.4,16.845L 6.24,13.3425L 9.5475,13.3425L
11.7075,16.845L 15.645,16.845L 13.7775,13.5825L 9.795,
13.44L 8.16,10.56L 12.0975,10.56L 10.6125,8.085L
6.675,7.8975L 5.04,5.1825L 8.9775,5.28L8.0625,3.675L
11.28,1.875L 12.195,3.4575L 14.115,0L 15.855,2.7825L
13.8675,6.3675L 15.315,8.88L 17.28,5.28L 18.96,8.1975L 17.01,11.7825L
18.9225,15.12L 20.835,11.8575L 18.96,8.355L 20.64,5.475L 22.4625,9.0225L
23.955,6.435L 22.125,2.925L 23.76,0.0974998L 25.5825,3.6L 26.5425,1.965L
29.715,3.7575L 28.8,5.28L 32.925,5.28L 31.29,8.1375L 27.165,8.235L
25.68,10.845L 29.805,10.56L 28.125,13.305L 24,13.44L 22.08,16.8L
25.8225,16.8L 27.9375,13.44L 31.245,13.44L 29.1375,16.8L 32.115,16.8L
34.2225,13.44L 37.485,13.44L 35.3775,16.8L 37.245,16.8L 37.245,20.64L
35.3775,20.64L 37.5825,24 Z" />
Uue kasutajakontrolli loomine
Selleks on kaks võimalust. Kasutades programmi Expression Blend tuleb valida need objektid, mida kasutajakontrolliks kapseldada soovitakse, teha paremklikk ning valida Make Control.
Selle tulemusena avaneb veel üks aken, mis küsib kasutajakontrollile nime ning, mis tuleks teha esialgse sisuga (meie puhul, siis selle 1857 tähemärgiga) – kas asendada kasutajakontrolli koodiga või jätta nii kuis on.
Lõpuks saame faili Snowflake.xaml, mille sisuks on kõik see, mis üleeelmises sammus valitud sai (aadressi vormi puhul, siis kõik vormi väljad, nende kirjeldused …).
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc=http://schemas.openxmlformats.org/markup-compatibility/2006
x:Class="Projekt.Snowflake">
<Path Width="40" Height="40" Stretch="Fill" Fill="#FFD9F3F2"
Data="F1 M 20.205,19.59L 20.205,17.7075L 18.765,16.8L..."/>
</UserControl>
Kasutajakontrolli loomine Visual Studio abil on samuti lihtne. Tuleb Silverlight projektis valida Add New Item ning seejärel suure hulga valikute seast leida üles Silverlight User Control ning anda talle nimi. Kui Expression Blendis oli kood juba õiges kohas, siis Add new Item meetodit kasutades tuleb õige kood ise Grid märgendite vahele kleepida.

Kuidas iganes see kasutaja kontroll ka loodud sai, selle kasutamine on õige lihtne
Kuidas kasutada?
Esmalt tuleb XAML faili päises kasutajakontrollile viidata:
Süntaks selleks on xmlns:MINU_ENDA_VALITUD_LÜHEND=””clr-namespace:PROJEKTINIMI”
Näiteks projektis nimega Projekt näeb see asi välja nii:
xmlns:u="clr-namespace:Projekt"
Nüüd edaspidi võin luua lumehelbeid nii:
<u:Snowflake/>
Mis asendab kõik need 1857 tähemärki või mitu neid oligi.
A ja see kurikuulus lumehelbeke näeb välja selline:

1200 kordne suurendus … vektorgraafika ruulib