Windows Phone 8 için geliştirdiğiniz uygulamanın veya Button, Image gibi nesnelerin arkaplan görselinin periyodik olarak değişmesini isteyebilirsiniz. Böylece uygulamanızın içerisinde sürekli olarak güncellenen bir bölüm oluşturabilirsiniz.
Microsoft‘un geliştirdiği arama motoru olan Bing, ana arama ekranının arkaplan görselini periyodik olarak arkaplan görselini değiştirir.
Öncelikle Bing‘in arkaplan görselini nasıl değiştirdiğini anlamamız lazım. Eğer Bing tarayıcınızda açıldıktan sonra yaptığı isteklere bakacak olursanız, http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 adresine bir çağrı yaptığını görebilirsiniz.
Bu isteğin parametreleri;
format, bu parametre ile dönüş cevabının xml formatında olması sağlanıyor idx, bu parametre ile Bing’in arkaplan görsellerinden kaçıncı sıradakinin alınacağı belirleniyor n, bu parametre ile kaç görselin bilgisinin alınacağı belirleniyor
http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 adresine yapacağımız istek ile Bing‘in ilk sıradaki arkaplan görsellerinin bilgilerini xml formatında elde edeceğiz.
Öncelikle MainPage.xaml dosyasını aşağıdaki gibi güncelleyelim;
<phone:PhoneApplicationPage x:Class=”BingBackground.MainPage” xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” xmlns:phone=”clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone” xmlns:shell=”clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone” xmlns:d=”http://schemas.microsoft.com/expression/blend/2008” xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006” mc:Ignorable=”d” FontFamily=”{StaticResource PhoneFontFamilyNormal}” FontSize=”{StaticResource PhoneFontSizeNormal}” Foreground=”{StaticResource PhoneForegroundBrush}” SupportedOrientations=”Portrait” Orientation=”Portrait” shell:SystemTray.IsVisible=”True”>
<StackPanel>
<StackPanel.Background>
<ImageBrush x:Name="imgBackground"></ImageBrush>
</StackPanel.Background>
</StackPanel>
</phone:PhoneApplicationPage></pre>
Böylece StackPanel nesnesinin arkaplanını imgBackground isimli ImageBrush nesnesi ile güncelleyebileceğiz.
MainPage.xaml.cs dosyasında yeralan MainPage class’ının constructor‘ında LoadBackgroundImage() method’unu çağıralım. LoadBackgroundImage() method’unda WebClient sınıfından yeni bir örnek oluşturup http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 adresine istek yapacağız;
private async void LoadBackgroundImage() { WebClient client = new WebClient(); client.DownloadStringCompleted += (sender, e) => { if (e.Error == null && !string.IsNullOrEmpty(e.Result)) { var doc = XDocument.Parse(e.Result); var url = (from node in doc.Descendants("url") select node.Value).FirstOrDefault(); var uri = new Uri("http://www.bing.com" + url); client.OpenReadCompleted += (s, args) => { var image = new BitmapImage(); image.SetSource(args.Result); imgBackground.ImageSource = image; }; client.OpenReadAsync(uri); } }; client.DownloadStringAsync(new Uri("http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1")); } DownloadStringAsync() method'unu kullanarak yaptığımız isteğin cevabını DownloadStringCompleted event'i ile alabiliyoruz. string tipindeki cevabın *boş* veya *hatalı* olmadığını kontrol ettikten sonra XDocument sınıfının **static** Parse() method'unu kullanarak *parse* ediyoruz. *url* isimli **element**'in içinde yeralan arkaplan görseli adresinin başına *http://www.bing.com* bilgisini ekliyoruz, böylece **Bing**'in arkaplan görselinin adresini tam olarak elde ediyoruz. Aynı *WebClient* değişkenini kullanarak tam adresini elde ettiğimiz görsel dosyasına ulaşmak için OpenReadAsync() method'unu çağırıyoruz ve cevabı OpenReadCompleted event'i ile elde ediyoruz. *OpenReadCompleted* event'i içerisinde elde ettiğimiz Stream ile yeni bir BitmapImage nesnesini dolduruyoruz ve *MainPage.xaml* içerisinde tanımladığımız *imgBackground* nesnesinin görseli olarak belirliyoruz. Böylece **Bing**'in arkaplan görseli değiştikçe bizim uygulamamızda ilgili alanın görseli değişecektir.
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484