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.
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")
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öndemMVP, MCT, MCPD, MCITP, MCTSMCSD, MCAD, MCDBA, MCP, ACP, ICSDBlog: http://daron.yondem.com Sorularınız için: http://daron.yondem.com/tr/sorusor