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

Arşiv

Windows 8 kategorisi için arşiv

Windows 8 uygulamasında seçilen resmin hakim rengini bulma

09 June 2015 Yorum yapılmamış

Uygulamalarımızda sıklıkla resimler kullanırız ve bir resimde hakim olan (en çok kullanılan) rengi bulmak ve uygulama içerisinde kullanabilmek çok faydalı olabilir.

Resmi hafızaya yükledikten sonra pixel pixel üzerinde gezip her pixel‘in değerlerini toplayıp ve ortalamasını alarak hakim rengi bulabiliriz. Fakat aşağıda kodlarını paylaşacağım yöntem ile bu işi çok daha hızlı ve az hafıza gerektiren bir şekilde gerçekleştirebiliriz.

Öncelikle hakim rengini bulacağımız resim dosyasını StorageFile sınıfının GetFileFromApplicationUriAsync() methodunu kullanarak bir değişkene alıyoruz;

var file = await StorageFile.GetFileFromApplicationUriAsync(imageUri);

Şimdi dosyayı açacak, BitmapDecoder nesnesi oluşturacak, resim dosyasını GetPixelDataAsync() methodunu kullanarak 1×1 boyuta boyutlandıracak, 1×1 boyutlu yeni resmin renk değerini okuyacağız;

using (var stream = await file.OpenAsync(FileAccessMode.Read))
{
	var decoder = await BitmapDecoder.CreateAsync(stream);

	var transform = new BitmapTransform { ScaledHeight = 1, ScaledWidth = 1 };

	var pixels = await decoder.GetPixelDataAsync(
			BitmapPixelFormat.Rgba8,
			BitmapAlphaMode.Ignore,
			transform,
			ExifOrientationMode.IgnoreExifOrientation,
			ColorManagementMode.DoNotColorManage);

	var bytes = pixels.DetachPixelData();

	var dominantColor = Color.FromArgb(255, bytes[0], bytes[1], bytes[2]);
}

Örnek resim ile kullandığımızda aşağıdaki sonucu elde etmeliyiz;

Kaynak : #WinRT : how to easily get the dominant color of a picture

Windows 8 uygulamasında Toast Notification göstermek

19 November 2014 Yorum yapılmamış

Windows 8 için geliştirdiğiniz uygulamada kolayca toast notification gösterebilmek için yapmanız gerekenler aslında çok basit.

Öncelikle Windows.UI.Notifications namespace‘inde yer alan ToastNotificationManager sınıfının static olan GetTemplateContent() method’unu ToastTemplateType enum‘ından bir değer ile çağırıyoruz ve geri dönen XmlDocument tipindeki cevabı bir değişkende saklıyoruz;

var template = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01);

GetTemplateContent() methodunu ToastTemplateType.ToastText01 parametresi ile çağırdığımızda aşağıdaki cevabı alıyoruz;

<toast>
	<visual>
		<binding template="ToastText01">
			<text id="1"></text>
		</binding>  
	</visual>
</toast>

text isimli element’i bulup, içine toast notification‘da göstermek istediğimiz metni yazıyoruz;

var elements = template.GetElementsByTagName("text");
elements[0].AppendChild(template.CreateTextNode("çok önemli mesaj!"));

Artık yapmamız gereken elimizdeki template değişkenini kullanarak yeni bir ToastNotification nesnesi oluşturmak;

var toast = new ToastNotification(template);

Son olarak ToastNotificationManager sınıfının static CreateToastNotifier() methodunu ve gene static olan Show() methodunu çağırmamız yeterli;

ToastNotificationManager.CreateToastNotifier().Show(toast);

ToastTemplateType enum‘ının diğer değerleri ve metin dışında resim de içerebilen template’lerinin listesi için MSDN‘deki The toast template catalog sayfasına bakabilirsiniz.

Universal App ekran çözünürlüğünü bulmak

05 July 2014 Yorum yapılmamış

Windows Store ve Windows Phone için tek bir uygulama geliştiriyorsunuz (Universal App) ve uygulamanın çalıştığı cihazın ekran çözünürlüğünü bulmanız gerekiyor.

Öncelikle Windows.Graphics.Display namespace‘inde yeralan DisplayInformation sınıfının RawPixelsPerViewPixel property‘sinin değerini okuyalım;

var rawPixelPerView = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel;

Şimdi ekran genişliği ve yüksekliği bilgilerini okuyarak yukarıda bulduğumuz değişken ile çarparak ekran çözünürlüğünü hesaplayabiliriz;

var width = Window.Current.Bounds.Width * rawPixelPerView;
var height = Window.Current.Bounds.Height * rawPixelPerView;

Hesapladığımız ekran çözünürlüğünü bir MessageDialog aracılığı ile kullanıcıya göstermek için ShowAsync() methodunu kullanıyoruz;

var dialog = new MessageDialog(string.Format("Çözünürlük: {0} * {1}", width, height);
dialog.ShowAsync();

Page CodeBehind dosyasını Universal App Shared Project içerisinde kullanmak

25 June 2014 Yorum yapılmamış

Universal App projesi oluşturduktan sonra Solution Explorer içerisine bakacak olursanız [ProjectName].Shared isimli bir projenin daha yer aldığını görürsünüz.

Shared Project içerisinde hem Windows Store, hem de Windows Phone projelerinizde ortak olarak kullanacağınız dosyaları barındırabiliyorsunuz.

Örneğin, App.xaml ve App.xaml.cs dosyaları Shared Project içerisinde oluşturuluyor ve hem Windows Store hem de Windows Phone projeleri tarafından ortak kullanılıyor.

Shared Project içerisinde Assets isminde bir dizin oluşturabilir ve iki projede de ortak kullanacağımız görsel dosyalarını, ses dosyalarını tek bir yerden yönetebiliriz.

Hatta Pages isminde bir dizin içerisinde, iki projede de ortak olacak ekranları oluşturabiliriz.

Bazı durumlarda bir ekranın her iki projede de aynı şekilde gözükmesini ama farklı davranmasını isteyebiliriz. Bu durumda ilgili ekranın xaml uzantılı dosyasını Shared Project içerisine, xaml.cs (CodeBehind) dosyalarını ise her projenin içerisine ayrı ayrı koyabiliriz.

Tam tersi durum da söz konusu olabilir, bir ekranın iki projede de farklı gözükmesini ama aynı şekilde davranmasını isteyebiliriz. Bu durumda da ilgili ekranın xaml uzantılı dosyalarını her projenin içerisinde, xaml.cs uzantılı (CodeBehind) dosyasını da Shared Project içerisinde oluşturabiliriz.

Shared Project içerisinde yer alan kod dosyalarında platform’a özel değişiklik yapmamız gerekiyorsa aşağıdaki örnekte gözüktüğü gibi kontroller yapabilmemiz mümkün;

#if WINDOWS_PHONE_APP
//Windows Phone platformunda çalışacak kodlar
#endif

#if WINDOWS_APP
//Windows platformunda çalışacak kodlar
#endif

Windows 8 uygulaması içerisinden fotoğraf ve video çekmek

10 June 2014 Yorum yapılmamış

Windows Store için geliştireceğimiz uygulama içerisinden fotoğraf ve video çekecek ve Fotoğraflar ve Videolar dizinlerine kaydedeceğiz.

Yeni oluşturduğumuz projenin Package.appxmanifest dosyasını açıyor ve Capabilities tabında yeralan Webcam, Videos Library, Pictures Library kutucuklarını işaretliyoruz. Böylece uygulamamızın çalışırken ihtiyaç duyacağı yetkileri kullanıcıdan talep edilmesini sağlıyoruz.

MainPage.xaml dosyasını açarak içerisine aşağıdaki xaml kodlarını ekleyelim ve ekranın altında bir AppBar gözükmesini, içerisinde bir adet StackPanel iki adette Button olmasını sağlayalım;

<Page.BottomAppBar>
	<AppBar>
		<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
			<Button Style="{StaticResource PhotoAppBarButtonStyle}" Click="PhotoButton_Click /">
			<Button Style="{StaticResource VideoAppBarButtonStyle}" Click="VideoButton_Click /">
		</StackPanel>
	</AppBar>
</Page.BottomAppBar>

Öncelikle PhotoButton_Click methodunun içini dolduralım;

private async void PhotoButton_Click(object sender, RoutedEventArgs e)
{
	var camera = new CameraCaptureUI();

	var capture = await camera.CaptureFileAsync(CameraCaptureUIMode.Photo);

	if (capture != null)
	{
		var file = await KnownFolders.PicturesLibrary.CreateFileAsync(Guid.NewGuid().ToString("N") + ".jpg", CreationCollisionOption.ReplaceExisting);

		await capture.CopyAndReplaceAsync(file);
	}
}

İlk olarak CameraCaptureUI sınıfından yeni bir değişken oluşturup, CaptureFileAsync() methodunu çağırıyoruz, parametre olarak CameraCaptureUIMode.Photo değerini veriyoruz, böylece fotoğraf çekmek için gerekli hazırlıklarımızı tamamlamış oluyoruz.

KnownFolders sınıfının PicturesLibrary özelliği sayesinde cihazın fotoğraf kütüphanesine erişiyoruz ve CreateFileAsync() methodunu kullanarak çekilen fotoğrafı kaydedebileceğimiz bir dosya oluşturuyoruz.

capture ismindeki değişkenin CopyAndReplaceAsync() methodu sayesinde webcam kullanılarak çekilen resmi kaydediyoruz.

Video çekimi yapacak VideoButton_Click methodunun içi PhotoButton_Click methoduna çok benziyor;

private async void VideoButton_Click(object sender, RoutedEventArgs e)
{
	var camera = new CameraCaptureUI();

	var capture = await camera.CaptureFileAsync(CameraCaptureUIMode.Video);

	if (capture != null)
	{
		var file = await KnownFolders.VideosLibrary.CreateFileAsync(Guid.NewGuid().ToString("N") + ".wmv", CreationCollisionOption.ReplaceExisting);

		await capture.CopyAndReplaceAsync(file);
	}
}

Üç önemli değişiklik var;

  • camera değişkeninin CaptureFileAsync() methoduna parametre olarak CameraCaptureUIMode.Photo değeri yerine CameraCaptureUIMode.Video değerini veriyoruz
  • KnownFolders sınıfının PicturesLibrary özelliği yerine VideosLibrary özelliğini kullanıyoruz
  • CreateFileAsync() methoduna parametre olarak verdiğimiz dosya isminin uzantısını jpg yerine wmv yapıyoruz

Böylece Windows 8 uygulaması içerisinden hem fotoğraf hem video çekebilir ve uygun dizinlere kaydedilmesini sağlayabiliriz.