İlkay İlknur

just a developer...

Windows Phone 7 Uygulamalarında Chooser Yapısı

Merhaba Arkadaşlar,

Bir önceki yazımızda Windows Phone 7 uygulamalarında önemli bir yere sahip olan launcher yapısını incelemiştik. Launcher'lar hatırlayacağımız üzere bir takım işlemleri gerçekleştirmek için işletim sistemi üzerinde bulunan built-in uygulamaları çalıştıran yapılardı. Ancak bu uygulamaları çalıştırarak kendi uygulamamız içerisine herhangi bir veri alamıyorduk. Sadece built-in uygulamayı çalıştırarak işlemi gerçekleştirebiliyorduk. İşte Chooser'lar ve Launcher'lar arasındaki en büyük farkta tam burada ortaya çıkmakta. Chooser'lar bir takım işlemleri gerçekleştirmek için yine built-in uygulama çalıştırmakta ancak işlem tamamlandığında Windows Phone 7 uygulamamıza bir veri döndürmekte. Bu veri kullandığımız Chooser'a göre kimi  zaman bir e-mail adresi olabileceği gibi kimi zaman da kamera tarafından çekilen  bir fotoğraf olabilmekte.

Windows Phone 7 uygulamalarımız içerisinde kullanabileceğimiz chooserlar da launcherların da aynı zamanda içerisinde bulunduğu Microsoft.Phone.Tasks isim uzayı içerisinde yer almakta. Şimdi kısaca bu isim uzayı içerisinde bulunan chooserları inceleyelim.

  • CameraCaptureTask : Windows Phone 7 uygulaması içerisinden telefon üzerinde bulunan kamera vasıtasıyla fotoğraf çekmeyi sağlayan Chooser.
  • EmailAddressChooserTask : Windows Phone 7 uygulaması içerisinde telefon içerisinde bulunan contact listesi içerisindeki kişilerin mail adreslerinin seçilmesini sağlayan chooser.
  • PhoneNumberChooserTast : Windows Phone 7 uygulaması içerisinde telefon içerisinde bulunan contact listesi içerisindeki kişilerin telefon numaralarının seçilmesini sağlayan chooser.
  • PhotoChooserTask : Windows Phone 7 uygulaması içerisinde telefon içerisinde bulunan fotoğrafları seçmeyi sağlayan chooser.
Şimdi isterseniz bahsettiğimiz Chooserların uygulamamız içerisinde nasıl kullanabileceğimizi inceleyelim.

CamereCaptureTask

Windows Phone 7 uygulamamız içerisine mobil cihaz üzerinde bulunan kamera tarafından çekilen fotoğrafı almak için kullandığımız CameraCaptureTask tipinin kullanımını görmek için öncelikle uygulamamız içerisinde bulunan sayfaya bir buton ve bir image kontrolü yerleştirelim ve ayrıca sayfa içerisinde bulunan başlıkları değiştirelim. Page kontrolü içerisinde bulunan LayoutRoot isimli kontrolden itibaren sayfa görüntüsünü XAML karşılığı ise şu şekilde.  
<Grid x:Name="LayoutRoot" Background="Transparent">        
<Grid.RowDefinitions>            
<RowDefinition Height="Auto"/>            
<RowDefinition Height="*"/>        
</Grid.RowDefinitions>

<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">            
<TextBlock x:Name="ApplicationTitle" Text="CHOOSERS" 
Style="{StaticResource PhoneTextNormalStyle}"/>            
<TextBlock x:Name="PageTitle" Text="Camera" Margin="9,-7,0,0" 
 Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">            
<Image Height="291" HorizontalAlignment="Left" Margin="6,6,0,0" 
 x:Name="camPhoto" Stretch="Fill" VerticalAlignment="Top" Width="444" /> 
<Button Content="Fotoğraf Çek" Height="72" Click="button1_Click" 
 HorizontalAlignment="Left" Margin="6,320,0,0" Name="button1" 
 VerticalAlignment="Top" Width="201" />        
</Grid>    
</Grid
Daha sonra ise kod tarafına geçerek button click handlerı içerisine geçerek CameraCaptureTask tipinden bir örnek yaratalım ve ilgili built-in uygulamayı çalıştırdıktan sonra çekilen fotoğrafı uygulamamız içerisinde bulunan Image kontrolü içerisinde gösterelim.
private void button1_Click(object sender, RoutedEventArgs e)
{
CameraCaptureTask camCapture = new CameraCaptureTask();
camCapture.Completed += (_sender, _args) =>    {
if (_args.TaskResult == TaskResult.OK)
{
BitmapImage image = new BitmapImage();
image.SetSource(_args.ChosenPhoto);
camPhoto.Source = image;
}
};
camCapture.Show();
}
Şimdi uygulamayı çalıştırarak "Fotoğraf Çek" butonuna tıklayalım ve CameraCaptureTask örneğimizin nasıl çalıştığını inceleyelim.  

Fotoğraf Çek butonuna basılınca açılan fotoğraf çekme uygulaması

Ekran görüntüsüne baktığınızda dikkatinizi çeken ilk noktalardan biri zannediyorum ki karşımıza çıkan siyah ekran. Çoğu kişi bu ekran açıldığında bilgisayarımız üzerinde bulunan kameranın açılmasını beklemekte. Ancak bunun yerine emulator üzerinde bulunan ekranda büyük bir dikdörtgen içerisinde dolaşan küçük bir dikdörtgen bulunmakta. Dolayısıyla emulator üzerinden çektiğimiz fotoğraflar da bu dikdörtgenler bulunmakta.

Telefon tarafından çekilen fotoğrafın uygulamamız içerisine aktarılması

Gördüğünüz gibi telefon tarafından uygulama tarafına gönderilen fotoğraf biraz önce bahsettiğimiz iç içe dikdörtgenler. Bunun dışında uygulama kodlarında da farkedebileceğiniz gibi fotoğraf çekme uygulaması içerisinde uygulamanın başarılı bir şekilde işlevini tamamlayıp tamamlamadığını da TaskResult enumı yardımıyla kontrol edebilmekteyiz.

PhotoChooserTask

Telefon içerisinde bulunan fotoğraflar arasından uygulamamız için fotoğraf seçmek için kullanılan PhotoChooserTask tipi üzerinden fotoğraf seçimi ile ilgili bir takım(Maksimum width,height) kriterler verebilmekteyiz. Bunun haricinde yine bu tipi üzerinde bulunan ShowCamera propertysini true olarak belirleyerek kullanıcının fotoğraf seçme işlemi içerisinde dilerse fotoğraf çekme işlemine geçmesini sağlayabilmekteyiz. Arayüzümüz aynı kalmak suretiyle buton click handlerını PhotoChooserTask'ı çalıştıracak şekilde değiştirelim ve uygulamayı çalıştıralım.

private void button1_Click(object sender, RoutedEventArgs e)
{
PhotoChooserTask photoChooser = new PhotoChooserTask();
photoChooser.ShowCamera = true;
photoChooser.Completed += (_sender, _args) =>
{
if (_args.TaskResult == TaskResult.OK)
{
BitmapImage image = new BitmapImage();
image.SetSource(_args.ChosenPhoto);
camPhoto.Source = image;
}
};
photoChooser.Show();
}

Adım adım fotoğraf seçme işlemi

EmailAddressChooserTask

Telefon üzerinde bulunan contact listesi içerisinden e-mail adresi seçmek için kullanılan EmailAddressChooserTask tipinin kullanımını incelemek için sahneye bir textblock ve bir buton koyalım.

<Grid x:Name="LayoutRoot" Background="Transparent">        
<Grid.RowDefinitions>            
<RowDefinition Height="Auto"/>            
<RowDefinition Height="*"/>        
</Grid.RowDefinitions>

<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">            
<TextBlock x:Name="ApplicationTitle" Text="CHOOSERS" 
 Style="{StaticResource PhoneTextNormalStyle}"/>            
<TextBlock x:Name="PageTitle" Text="Email" Margin="9,-7,0,0"
 Style="{StaticResource PhoneTextTitle1Style}"/>        
</StackPanel>

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">            
<Button Content="Email Adresi Getir" Height="72" 
 Click="button1_Click" HorizontalAlignment="Left" 
 Margin="6,63,0,0" 
 Name="button1" VerticalAlignment="Top" Width="268" />
 <TextBlock Height="30" HorizontalAlignment="Left"
  Margin="21,14,0,0" Name="tbEmailAddress" Text="" 
 VerticalAlignment="Top" />        
</Grid>   
</Grid>

Butona tıklandığında ise EmailAddressChooserTask tipinde bir örnek yaratarak çalıştıralım ve dönen sonucu uygulama içerisinde bulunan TextBlock içerisine yazdıralım.

 
private void button1_Click(object sender, RoutedEventArgs e)
{
EmailAddressChooserTask emailChooser = new EmailAddressChooserTask();
emailChooser.Completed += (_sender, _args) =>
{
if(_args.TaskResult == TaskResult.OK)
tbEmailAddress.Text = _args.Email;
};
emailChooser.Show();
}

Adım adım e-mail seçme işlemi

Gördüğümüz gibi burada da telefon içerisinde bulunan contact listesi açılmakta ve contact listesinden seçilen kişinin e-mail adresi uygulamaya döndürülmekte.  Diğer geri kalan PhoneNumberChooserTask sınıfı da yine bu şekilde çalışmaktadır.

Chooserların Ortak Çalışma Özellikleri

Yazımızın sonuna gelmeden önce sizinde yazıyı okurken farkedeceğiniz üzere Chooser'ların bir takım ortak çalışma özellikleri bulunmakta.

Bunlar,

  • Chooserlar üzerinden bir takım built-in uygulamalar çalıştırılırken ilgili veriyi elde etmek için Chooserların Completed eventi kullanılır.
  • Her chooserın çalışması sırasında işlemler başarılı olmayabilir. Örneğin kullanıcı fotoğraf seçme işlemine başlayıp ancak daha sonra bu kararından vazgeçebilir. Bu gibi durumlarda veri chooser üzerinden elde edilmeden önce TaskResult enumı kullanılarak Chooser işleminin durumu kontrol edilmelidir.
  • PhotoChooserTask diğer chooser mekanizmalarına göre bir takım ek propertyler içermekte. PixelWidth ve PixelHeight fotoğraf seçme işleminde birer kriter olarak yer alırken ShowCamera propertysi fotoğraf seçme işlemi içerisinden aynı anda fotoğraf çekme özelliğini aktif eder.
Bir Windows Phone 7 ile ilgili yazımızın sonuna geldik. Bir sonraki yazıda görüşmek üzere.
Hoşçakalın


Yorum Gönder