Silverlight 2.0 introduktion, del 6 - forstå XAML resourcer

Det sidste jeg vil tage på mig i denne omgang XAML er hvordan du kan genbruge noget af det XAML kode du allerede har skrevet før.

Resources er et ret bredt felt og jeg kommer slet ikke ind på alt sammen i denne omgagng, men jeg vil dog alligevel lige give jer en forsmag på hvordan man nemt og med lidt kode kan bruge og genbruge resourcer i XAML. Følg med.

Vi kender det fra (X)HTML og CSS. Før CSS kunne vi "tagge" vores HTML med font farver, størresler, opførsel osv. Det kan vi sådan set stadig gøre, men det er hverken særlig pænt, god skik og heller ikke nemt når man skal tilbage og rette i noget.

i XAML kan du desværre gøre det samme som du kan gøre i (X)HTML med CSS (lave meget grim kode), men heldigvis kan vi ligsom i CSS angive nogle regler for hvordan visse elementer enten skal eller kan se ud.

Lad os se på et eksempel:

<UserControl x:Class="SilverlightApplication10.Demo"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
    <UserControl.Resources>
        <SolidColorBrush x:Key="Brush1" Color="#FFF91B1B"/>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
        <Ellipse HorizontalAlignment="Stretch" Margin="40,50,42,119" VerticalAlignment="Stretch" Fill="#FF1F43A5" Stroke="{StaticResource Brush1}" StrokeThickness="5"/>
    </Grid>
</UserControl>

Her kan se et glimrende eksempel på hvordan man kan gøre brug af netop en resource (se <UserControl.Resources>). Der er defineret en "regel" som faktisk er en SolidColorBrush med navnet Brush1 der siger at de elementer der bruger denne resource få farven #FFF91B1B.

Vores ellipse bruger denne resource i dens Stroke attribute og det giver en effekt der betyder at den nu vil få en rød ("#FFF91B1B) kant rundt om sig. Denne type scenarie kan vi da sagtens nikke genkendende til fra CSS og (X)HTML.

Prøv selv at tilføj en Rectangle og brug den pågældende resource vi lige har lavet.

Der findes et par forskellige typer af Resourcer i XAML, MEN kun en enkelt er understøttet i Silverlight, og det er StaticResource. I WPF har du også noget der hedder en DynamicResource som kan håndtere data der bliver ændret ved runtime.

StaticResource:

En StaticResource skal du se som værende en en slags "container" for en værdi der ikke ændres på. Som i vores ovenstående tilfælde bruger vi en StaticResource til en Brush og den ændres ikke - den er statisk! (Hvis du er udvikler og tænker på static i C# kontekst, så er du galt på den). Du kan bruge StaticResource til at gemme og genbruge statiske (stille/døde/non-moving) værdier, og det vil du komme til at se meget mere til.

Koden bagved StaticResource siger "læs værdien af den her resource én gang og lad være med at kigge efter ændringer".

Prøver du at ændre en StaticResource værdi ved hjælp af .NET kode får du en fejl da denne funktionalitet ikke er indbygget.

Placering af XAML resourcer:

Der er et par muligheder når du tænker på hvor dine resourcer skal placeres i din applikation. Du kan vælge at placere dine resourcer direkte i den XAML fil hvor resourcens behov er opstået - lokal resource.

Du kan også vælge at placere dine resourcer på applikations niaveau så det ikke kun er den enkelte side der kan tilgå resourcen, men alle sider i applikationen. Dette gøres via filen App.xaml som ligger i et Silverlight project pr. default.

<Application.Resources>
   <System:String x:Name="string1">Hej verden!</System:String>
</Application.Resources>

Der er flere ulemper ved at arbejde med Resources i Silverlight i forhold til WPF. I WPF har man mulighed for at samle ens Resourcer i et fil hieraki så man både kan strukturere sine resourcer meget lækkert gøre det nemmere at rette og læse i. Det kan du desværre ikke i Silverlight som det ser ud nu. Forstil dig at du har mange applikations resourcer - så bliver din App.xaml meget stor.

Det var lidt omkring resources i Silverlight