Makale Özeti

Bu yazımızda Silverlight 2.0 uygulamalarında asenkron olarak sunucudan özel font dosyaları indirerek uygulama içerisindeki kontrollere bağlanmasını ve kullanımını inceliyoruz.

Makale

Silverlight 1.0 ile beraber istemci tarafında herhangi bir font yüklemesi olmadan istediğimiz fontları TextBlock ve TextBox gibi kontrollerde kullanabilir hale gelmiştik. Silverlight 2.0 tarafında gelen yeniliklerle beraber artık her şeyi VB veya C# kodumuz ile halletmemiz gerekiyor. Bu yazımızda Silverlight 2.0 ile beraber özel font kullanımını inceleyeceğiz.

Sunucudan asenkron font indirerek kullanmak

Sunucudaki istediğimiz bir fontu asenkron olarak istemci tarafına indirip istediğimiz kontrollere bağlayabiliriz. Böylece gerekli fontları sadece gerekli olduğunda istemci tarafına taşımış oluruz. Bunun için Silverlight 2.0 tarafında bir WebClient nesnesi kullanarak ilk olarak font dosyasını istemci tarafına indirmemiz gerekiyor.

[VB]

    Private Sub Page_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded

        Dim Yukleme As New WebClient

        AddHandler Yukleme.OpenReadCompleted, AddressOf Yukleme_OpenReadCompleted

        Yukleme.OpenReadAsync(New Uri("/SilverlightApplication33Web/deveload.ttf", UriKind.Relative))

    End Sub

[C#]

        public Page()

        {

            InitializeComponent();

 

            WebClient Yukleme = new WebClient();

            Yukleme.OpenReadCompleted += new OpenReadCompletedEventHandler(Yukleme_OpenReadCompleted);

            Yukleme.OpenReadAsync(new Uri("/SilverlightApplication34Web/deveload.ttf", UriKind.Relative));

        }

Kodumuzda Silverlight uygulaması yüklendiği gibi hemen bir WebClient nesnesi yaratarak ardından OpenReadCompleted event'ı için dinamik bir event handler bağlıyoruz. Söz konusu event handler WebClient nesnesinin sunucudan aldığı dosyanın download işlemi bittiğinde çalıştırılacak ve böylece biz de veri geldiğinde istediğimiz kontrole bağlayabileceğiz. Event-handler bağlantısını da tamamladıktan sonra OpenReadAsync ile sunucudan verimizi almaya başlıyoruz.

[VB]

    Private Sub Yukleme_OpenReadCompleted(ByVal sender As Object, ByVal e As System.Net.OpenReadCompletedEventArgs)

        Label1.FontSource = New FontSource(e.Result)

        Label1.FontFamily = New FontFamily("DEVELOAD")

    End Sub

[C#]

        void Yukleme_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)

        {

            Label1.FontSource = new FontSource(e.Result);

            Label1.FontFamily = new FontFamily("DEVELOAD");

        }

Veri sunucudan geldiğinde, download işlemi bittiğinde çalışan event-handler içerisinde hemen elimizdeki TextBlock olan Label1 adındaki kontrolün FontSource özelliğini değiştiriyoruz. Tanımladığımız yeni FontSource veri kaynağını e.Result ile alıyor, yani WebClient'ın indirdiği Stream'i doğrudan FontSource'a çevirerek TextBlock'a aktarıyoruz. Son olarak tabi ki TextBlock'un FontFamily özelliğini de uygun şekilde değiştirmemiz gerek.

İsterseniz WebClient nesnesinin DownloadProgressChanged durumuna da bir event-handlar bağlayarak Fontların yüklenmesi esnasında yüklemenin ne kadarının tamamlandığını da takip edebilirsiniz.

Hepinize kolay gelsin.

Daron Yöndem
MVP, MCT, MCPD, MCITP, MCTS
MCSD, MCAD, MCDBA, MCP, ACP, ICSD
Blog: http://daron.yondem.com
Sorularınız için: http://daron.yondem.com/tr/sorusor