Silverlight 3.0 ve harici Resource dosyalarının MergedResourceDictionary yapısı ile kullanımı

0 dakikada yazıldı

6027 defa okundu

Düzenle

Silverlight ve WPF ile beraber gelen Resource yapıları özellikle web
tasarımcıları tarafından alışılmış CSS'in çok daha gelişmiş bir hali
şeklinde tanımlanabilir. Sadece görsel anlamda değil aynı anda
kontrollerin veya nesnelerin işlevsellik anlamında da birçok
özelliklerinin birer stil olarak saklanmasını ve tekrar
kullanılmalarının yanı sıra uygulama çerçevesinde merkezi yönetim
sağlamasını da düşünürsek Silverlight projelerde Resource kullanımının
büyük önemi var.

Maalesef Silverlight 2.0 ile beraber elimizdeki tek seçenek
Resource'larımızı App.xaml içerisine yerleştirerek uygulama çapında
kullanmaktı. Oysa çoğu zaman harici CSS dosyaları gibi Silverlight
tarafında da Resource'larımızı harici dosyalara alarak farklı
uygulamalarda da ortak olarak kullanmak istedik. Microsoft bizi dinlemiş
olsa gerek ki Silverlight 3.0 ile beraber MergedDictionaries yapısı
geliyor.

Nedir bu MergedDictionaries?

MergedDictionary'ler sayesinde harici bir dosyada yer alan
ResourceDictionary'lerimizi Silverlight uygulamalarımda yer alan
kontrollerinin Resources koleksyonlarına ekleyebiliyoruz. Böylece artık
harici dosyalarda Resource'larımızı saklayabiliriz. Peki nasıl
yapacağız? Gelin basit bir örnek ile adım adım bu işlemleri nasıl
yapabileceğimiz ve ne gibi seçeneklerin bizi beklediğine bir göz atalım.

[XAML / HariciResource.xaml]

<ResourceDictionary

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"\>

    <SolidColorBrush
x
:Key="OzelRenk"
Color
="#FF499422"/>

</ResourceDictionary>

Yukarıda gördüğünüz kod harici bir XAML dosyası içerisinde tek başına
bulunuyor. Aslında bu dosya harici bir ResourceDictionary tanımlıyor
ve içerisinde de sadece bir adet SolidColorBrush var. Bunun gibi
farklı Resource tiplerini de bu dosya içerisinde saklayabiliriz. Biz
şimdilik kodlarımız kısa ve anlaşılır olsun diye bu basit örnek
üzerinden ilerleyelim. OzelRenk adındaki bu Resource'u uygulamanız
içerisinde kullanabilmeniz için ilk olarak dosyayı Silverlight projenize
eklemeniz gerekiyor. Ekleme işlemi sonrası Solution Explorer içerisinden
dosyayı seçtiğinizde Properties panelinde Build Action'ın
Content olmasına dikkat edin. Böylece XAML dosyası XAP içerisindeki
DLL'inize eklenecektir.

Dosyamızı projemize ekledik fakat hala onu herhangi bir yerde
tanımlamadık. Bu noktada iki seçenek var, bunlardan biri söz konusu
tanımlamayı App.XAML içerisinde yaparak harici Resource dosyasındaki tüm
Resource'ların uygulamada her yerde kullanılabilmesini sağlamak,
ikincisi ise sadece UserControl başına harici dosyayı Import etmek. Her
iki seçenekte de aynı kod kullanılacağı için gelin App.XAML içerisinde
nasıl bir değişiklik yapmamız gerektiğine göz atalım.

[XAML / App.xaml]

<Application
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

            x:Class="SilverlightApplication14.App"

            >

    <Application.Resources>

 

        <ResourceDictionary>

            <ResourceDictionary.MergedDictionaries>

                <ResourceDictionary Source="HariciResource.xaml"/>

            </ResourceDictionary.MergedDictionaries>

        </ResourceDictionary>

 

    </Application.Resources>

</Application>

Gördüğünüz gibi Application.Resources içerisinde bir
MergedDictionaries serisi yaratarak içerisine de harici
ResourceDictionary'imizi koyuyoruz. Böylece artık harici
dosyamızdaki tüm Resource'lar rahatlıkla uygulama genelinde
kullanılabilecek.

[XAML / UserControl1.xaml]

<UserControl
x
:Class="SilverlightApplication14.MainPage"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   Width="400"
Height
="300">

    <Grid
x
:Name="LayoutRoot"
Background
="White">

        <Rectangle
Fill
="{StaticResource OzelRenk}"
Stroke
="#FF000000" Height="64"
Margin
="74,75,159,0" VerticalAlignment="Top"/>

 

    </Grid>

</UserControl>

Yukarıda gördüğünüz basit UserControl içerisinde bir Rectangle
bulunuyor. Bu Rectangle aslında bizim biraz önce uygulamamıza
eklediğimiz harici Resource dosyası içerisindeki bir kaynağı kullanıyor.
Sadece buradaki koda baktığımızda aslında söz konusu Resource'ların
App.xaml içerisinde olması ile harici dosyada olması arasında bir
fark yok.

Ya harici projelerdeki Resource dosyaları?

Şu ana kadarki örneğimizde Resource dosyası kendi projemiz
içerisindeydi. Oysa belki de Resource'larınızı harici Silverlight
Class Library
'ler içerisinde tutuyor olabilirsiniz. İşte böyle bir
durumda da doğrudan söz konusu DLL'i referans alarak onun içerisindeki
bir Resource Dictionary'yi projenizde kullanmak isteyeceğiniz kesin.
Bu gibi bir durumda değişen tek şey hedeflediğiniz XAML dosyasının
adresi yani Source.

[XAML / App.xaml]

<Application
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

            x:Class="SilverlightApplication16.App"

            >

    <Application.Resources>

        <ResourceDictionary>

            <ResourceDictionary.MergedDictionaries>

                <ResourceDictionary Source="SilverlightClassLibrary1;component/HariciResource.xaml"/>

            </ResourceDictionary.MergedDictionaries>

        </ResourceDictionary>

    </Application.Resources>

</Application>

Yukarıdaki şekli ile örneğimizi incelediğinizde unutmayın ki projemize
referans aldığımız ve Assembly adı SilverlightClassLibrary1 olan bir
DLL bulunuyor. Söz konusu DLL içerisinde yine bir önceki örnekte
kullandığımız HariciResource.xaml dosyası bulunuyor. App.xaml
dosyamızdaki tek farklılık HariciResource.xaml dosyasına ulaşırken
kullandığımız yol tanımı.

Böylece Resource'larınızı harici DLL'lerde tutabilir ve istediğiniz
projeye referans alarak kullanabilirsiniz. Veya projelerinizde Static
Resource isimleri kullanarak yer geldiğinde sadece referansı
değiştirerek tüm projenin görselliğinin değişmesini sağlayabilirsiniz.

Hepinize kolay gelsin.