Value | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar value

Windows Phone 8 uygulama arkaplan görselini Bing servislerinden almak

05 February 2014 1 yorum

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>

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.

Nullable Tipler

26 September 2010 Yorum yapılmamış

Nullable tipler, ilgili tip‘in değer aralığına ve karakteristiğine sahip olmakla birlikte ek olarak null değer de içerebilen yapılardır.

Basit olarak, değişkenin değer içerip içermediği bilgisini saklar.

Nullable tipler, System.Nullable<T> türündedirler (T, değer tipi olmalıdır)

Unutmayın! Sadece değer tipleri (value type) nullable olabilir.

C# dili değer tipi listesi‘ne daha önce yazdığım makale veya MSDN üzerinden ulaşabilirsiniz.

C# dilinde, Nullable tipte değişkenler iki şekilde tanımlanabilir.

Birinci yöntemde, System.Nullable generic tipini ilgili değer tipi ile birlikte yazabiliriz;

System.Nullable<int> adet;
System.Nullable<bool> sonuclandi;

İkinci yöntem, daha çok kullanılır ve daha kısa yazım şekline sahiptir. İlgili değer tipinin yanına soruişareti (?) karakteri koyarak yazılır;

int? adet;
bool? sonuclandi;

Bir nullable değişken, tanımlandığı anda null değerini içermez, sizin null eşitlemesini yapmanız beklenir;

int? adet = null;

Nullable tipteki bir değişkene değer ataması yapmak, normal bir değişkene değer ataması yapmak ile aynıdır.

adet = 100;

Nullable bir değişkenin değer içerip içermediğini anlamanın iki yolu vardır.

Birinci yöntemde, değişkenin null olup/olmadığı kontrol edilebilir.

if (adet != null)
{
	/// değeri var
}

Eğer değişken null değilse, değer içeriyor demektir.

İkinci yöntemde, değişkenin System.Nullable tipinden gelen sadece-okunabilir (read-only) HasValue özelliği kontrol edilir.

if (adet.HasValue)
{
	/// değeri var
}

Eğer değişken değer içeriyorsa, değeri okumak için, değişkenin System.Nullable tipinden gelen Value özelliği kullanılır.

Eğer değer içermeyen nullable bir değişkenin Value özelliğinden değer okumaya çalışırsanız, System.InvalidOperationException istisnası fırlatılır.

using System;

class NullableTipTest
{
	public static void Main()
	{
		int? adet = null;

		if (adet.HasValue)
			Console.WriteLine("adet değeri: " + adet.Value);
		else
			Console.WriteLine("adet değeri yok.");

		adet = 10;

		if (adet.HasValue)
			Console.WriteLine("adet değeri: " + adet.Value);
		else
			Console.WriteLine("adet değeri yok.");
	}
}

Yukarıdaki kodun çıktısı şöyle olacaktır;

adet değeri yok.
adet değeri: 10