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

Arşiv

Etiketlenen yazılar parameter

Javascript Mouse Events (Olaylar) arasındaki farklar

25 April 2016 Yorum yapılmamış

HTML sayfalarında mouse ile ilgili çeşitli events (olaylar) yakalayabilir ve Mouse‘un durumuna göre çalışacak kodlar yazabiliriz.

Fakat mouse ile ilgili birden fazla events (olaylar) mevcut ve aralarındaki farkları bilmekte fayda var.

Aşağıdaki liste ile mouse events (olaylar) arasındaki farkları görebilirsiniz;

mousedown
Mouse butonlarından birine basıldığında gerçekleşir. Parametrede yer alan button özelliği eğer 0 ise sol buton, 1 ise orta buton, 2 ise sağ buton basılmıştır.

mouseup
Basılan Mouse butonu bırakıldığında gerçekleşir.

mouseclick
Mouse butonuna basılması ve bırakılması durumunda gerçekleşir.

mouseenter
Mouse, bir Html elementin üzerine geldiğinde gerçekleşir.

mouseleave / mouseout
Mouse, bir Html elementin üzerinden çıktığında gerçekleşir. Html element, başka bir element içeriyorsa, mouseleave event (olay) içerilen elementin üzerine geldiğinde gerçekleşmez, mouseout event (olay) gerçekleşir.

mouseover / mousemove
Mouse, bir Html elementin üzerinden geçerken gerçekleşir. Eğer Html element başka bir elementin içindeyse veya içerisinde başka elementler varsa da mouseover event (olay) gerçekleşir. Mouse ilgili elementin üzerinde gezdikçe mouseover event (olay) sadece bir defa gerçekleşir, mousemove event (olay) her seferinde gerçekleşir.

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.

C# Liste’nin eleman içerdiğini kontrol etmek

30 November 2010 1 yorum

Aşağıdaki kod parçasına, programlama üzerine yazılmış bir makaleyi okurken rastladım;

public void IsNullOrEmpty<T>(IEnumerable<T> koleksiyon)
{
	if (koleksiyon == null || koleksiyon.Count() == 0)
	{
		/// Koleksiyon'da hiç eleman yok
		/// Koleksiyon boş
	}
}

Yukarıdaki method IEnumerable generic tipinde parametre alıyor, null veya boş olup/olmadığını kontrol ediyor.

Karşılaştırmada kullanılan,

Liste.Count() == 0

kod parçası dikkatimi çekti.

Eğer IsNullOrEmpty fonksiyonuna parametre olarak ICollection<T> interface‘ini implemente etmeyen tipten bir değer gönderecek olursak (mesela LINQ sorgusu sonucu olarak IQueryable) Count method’u tüm liste üzerinde satır-satır ilerleyerek listedeki eleman adedini hesaplayacaktır.

Eğer fonksiyona parametre olarak IEnumerable interface‘ini implemente eden tipten bir değer gönderecek olursak, Count method’u, optimize edilmiş haliyle, sadece koleksiyonun Count özelliğini sorgulayacaktır.

Türkçe ifadesiyle; “Koleksiyonda eleman var mı?” sorusu yerine “Koleksiyon’da sıfır eleman mı var?” sorusunu sormuş oluyoruz.

Aslında çözüm basit, System.Linq namespace‘inde yeralan Any extension method‘unu kullanmamız gerekiyor;

public void Test<T>(IEnumerable<T> koleksiyon)
{
	if (koleksiyon == null || !koleksiyon.Any())
	{
		/// Koleksiyon'da hiç eleman yok
		/// Koleksiyon boş
	}
}

Bu yöntemin güzelliği, IEnumerable interface‘inin MoveNext methodunu sadece bir kere çağırması. Koleksiyonda bulunan eleman adedi ne olursa olsun, Any methodu sonucu çok hızlı birşekilde döndürecektir.

Hatta kendi extension method‘umuzu da Any methodunu kullanarak yazabiliriz;

public static bool IsNullOrEmpty<T>(this IEnumerable<T> koleksiyon)
{
	return koleksiyon == null || !koleksiyon.Any();
}

Artık extension method‘u da yazdığımıza göre, asıl method‘u iyileştirebiliriz;

public void Test<T>(IEnumerable<T> koleksiyon)
{
	if (koleksiyon.IsNullOrEmpty())
	{
		/// Koleksiyon'da hiç eleman yok
		/// Koleksiyon boş
	}
}

C# siz olsanız hangisini yazardınız?

27 July 2010 6 yorum

İnternette gezerken şöyle bir kod parçasına rastladım;

public void ShowPanelWindow(bool isVisible)
{
	Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
}
 
public void ShowBusy(bool isBusy)
{
	BusyIndicator.ShowIsBusy = isBusy;
}

Bu kodu yazan kişi, eğer yukarıdaki kodu şimdi yazsaydım şöyle yazardım demiş ve aşağıdaki kod parçasını yazmış;

public void HidePanelWindow()
{
	Visibility = Visibility.Collapsed;
}

public void ShowPanelWindow()
{
	Visibility = Visibility.Visible;
}

public void LookBusy()
{
	BusyIndicator.ShowIsBusy = true;
}

public void StopLookingBusy()
{
	BusyIndicator.ShowIsBusy = false;
}

Bu iki kodu okuduktan sonra, kendi kendime sordum ve ben de ikinci tarz yaklaşımı kullanırdım.

Peki siz olsanız hangi tarz kodu tercih ederdiniz?

Kısa kod mu? Kendini anlatan kod mu?