Ana Sayfa | English Blog | Seminer TV | Dil Cookie Sil  Blog'u Mail ile takip et!       
Daron Yöndem - Windows Phone 7
bir yazılımcının tasarıları...
 Thursday, May 20, 2010

Ürdün :) Son üç gündür Ürdün'deydim! Microsoft Ürdün ofisi için iş ortaklarına ve sektördeki yazılım geliştiren kurumlara özel bir seminer serisi düzenledik. Oturumlar boyunca Silverlight, WPF, Multitouch, Windows 7 Features, Sensor and Location API Development, .NET 4 Yenilikleri gibi konulara değindim. Gerçekten güzel geçen üç gün içerisinde maalesef pek Ürdün'ü gezme şansım olmadı. Fakat önümüzdeki hafta yine Ürdün'de yapacağımız laboratuar çalışmaları ve bir sonraki hafta da müşteri ziyaretleri düşünülürse :) Kesin arada bir fırsat bulacağımdan eminim.

Microsoft Ürdün Seminerlerim
Microsoft Ürdün Seminerlerim

Etkinlik boyunca Ürdün'den bir de Türk kardeşimize rastladım. Bu gibi etkinlikler halka açık olmadığı için genelde blogumda duyurmuyorum. Türkiye'de de bolca yapıldığını itiraf etmem gerek. Özellikle BizSpark, WebSiteSpark gibi programların üyeleri yazılım şirketleri için sıkı seminerler ve eğitim programları Türkiye'de de düzenleniyor. Fakat bahsettiğim gibi bu etkinlikler dışarıya kapalı olduğu için duyurmayı anlamlı bulmuyorum. Bazılarının kayıtlarını SeminerTV'de paylaştım o kadar :) İtiraf etmek gerekirse artık etkinliklerden sonra bloga da post atmayı unutur oldum, hatta bu konuda sitem bile alıyorum "Neden bizi yazmadınız" diye :) Atladığım her etkinliğin katılımcılarından özür dilerim bu vesile ile.

Neyse konuyu toparlayalım :) Eğer Ürdün'deyseniz ve bu yazıyı okuyorsanız :) ve tabi ki yazılımla ilgileniyorsanız bana bir mail atın beraber birer çay içelim ;)

Görüşmek üzere!

Thursday, May 20, 2010 7:40:45 AM (GTB Standard Time, UTC+02:00)  #    Comments [9]   .NET Framework 4.0 | Expression Studio | MultiTouch | Seminer | Silverlight 4 | Visual Studio 2010 | Windows 7 | Windows Phone 7 | WPF  | 
 Thursday, May 13, 2010

Şu ana kadar bildiklerimize dayanarak Windows Phone 7'nin multitasking desteklemeyeceğini rahatlıkla söyleyebiliriz. Bu durum birer yazılım geliştirici olarak çok işimize gelmese de aslında son kullanıcı açısından bunun birçok faydası var. Cihazların pil ömründen tutun performansına kadar çoğu noktada multitasking aslında cebimizde bu minik cihazların kaldıramayacağı bir yük gibi duruyor. Son kullanıcı tarafından baktığımızda sadece kabaca bu duruma iPhone ile herkes alışkın. İşin bir diğer komik yanı ise aslında hiçbir son kullanıcının pek de bu durumu önemsemiyor olması. Yani biz yazılımcılar kadar konuya teknik açıdan bakıp endişelenen pek yok gibi :)

Bir son kullanıcı için önemli olan aslında çalıştırdığı programın arkada çalışıp çalışmadığı bilmekten öte istediği işin yapılıp yapılmadığını veya daha sık karşılaştığımız senaryolarda herhangi bir işin takibinin yapılıp yapılmadığını bilmek. Daha somut bir örnek vermek gerekirse varsayalım ki bir mail istemcisi kullanıyorsunuz. Normalde bilgisayarımızda mail programını açık tutmamızın nedeni mail geldiğinde haberdar olmaktır. Oysa bunun için koca mail programının açık olmasına gerçekten gerek var mı? Yani daha ufak bir yapı arkada mail geldiğinde haberdar olsa da bize ufak bir uyarı mesajı verse? Sonra gerekiyorsa ben mail programını çalıştırıp istediğimi yapsam olmaz mı? İşte Windows Phone 7 içerisinde yer alan PushNotification sistemi de tam olarak bunu çözüyor.

Olayın işleyişine bir göz atalım...

Push mesajlarının gönderiminde toplam üç farklı kimlik bulunuyor diyebiliriz. Bunlardan biri mesajı dinlemede olan telefon, diğeri mesajı gönderen servis, bir diğeri ise iki servisin birbirine ulaşabilmesini sağlayan bir anlamda router görevi gören Microsoft servisi. Her telefon dinleme moduna geçerken bir kanal ismi tanımlayarak kendini "Microsoft Push Notification Service" üzerinde tanımlıyor.

Push Notification Service'inden cihaza özel ulaşım adresi alıyoruz.
Push Notification Service'inden cihaza özel ulaşım adresi alıyoruz.

Yukarıdaki şemada da görebileceğiniz üzere telefon kendi dinleme kanal adı ile servise başvurarak bir adres talep ediyor. Bu adres farklı servislerin telefona push notification gönderirken kullanacakları adres olacak. Böylece rahatlıkla bu adrese sahip her tür yazılım bu adres üzerinden notification gönderebilecek. Söz konusu notification'lar uygulamanız kapalı olsa da işletim sistemi tarafından dinleneceği için uyarılar her zaman kullanıcılara gösterilebilecek. Tabi bu sistemin çalışması için daha önce de bahsettiğimiz üzere bizim de push notificationları sağlayacak bir servise ihtiyacımız var ve bu servisin de telefonun adresine sahip olması gerekiyor.

Push Notification telefona gönderiliyor.
Push Notification telefona gönderiliyor.

İlk aşamada telefon bizim yazacağımız bir servise kendi adresini aktarıyor. Böylece servis artık telefona ulaşabileceği adresi bildiğine göre Push Notification yollmaya hazır. Aslında telefon verdiği adres tam olarak kendi adresi de değil :) Unutmayın bu adres Microsoft Push Notification Service'in verdiği adres. Telefon Microsoft Push Notification Service'den aldığı adresi bizim servise veriyor ve artık bizim servis de bu adrese istediği mesajı gönderiyor. Gönderilen bu mesaj özünde yine Microsoft Push Notification Service'e gidiyor ve Microsoft Push Notification Service'de mesajı telefona iletiyor. Böylece MSPush Notification Service ile cihaz bir Socket bağlantısına sahipken bizim servisimiz sadece istediğinde MS Push Notification Service ile bağlantı kurarak mesaj gönderebiliyor.

Peki nasıl yapacağız bu işleri?

Biz kendi servisimizi temsil etmek üzere bir WPF uygulaması yazalım. Böylece WPF uygulaması kendi içerisinden telefona PUSH mesaj yollayabilir olsun. Uygulamamızın içerisinde telefondan gelecek adres bilgisini alabilecek bir servis olması gerek. Bu servise gelen adrese sonrasında gönderim yaparak telefonu PUSH data yollamış olacağız. 

[VB]

Public Class Service1

    Implements IService1

 

    Public Sub SetURL(ByVal URL As System.Uri) Implements IService1.SetURL

        MainWindow.URL = URL.AbsoluteUri.ToString()

    End Sub

End Class

Gördüğünüz gibi servisimiz epey basit. Tek yaptığı adresi alıp WPF uygulamamızın içerisinde başka bir sınıfta tanımlı shared bir obeye atamak. Herhangi bir sorunla karşılaşmamak adına servisi basicHttpBinding olarak ayarlamanızı tavsiye ederim. Servisin default gelen design adresini kullanarak WP7 uygulamamıza referans olarak ekleyebiliriz hemen. WPF uygulamasında App.Config içerisinde http://localhost:8732/Design_Time_Addresses/WpfApplication1/Service1/ gibi bir adres göreceksiniz. Uygulamamız örnek amaçlı olduğu için doğrudan bu adresi kullanarak WP7 uygulamanıza service reference ekleyebilirsinzi. Tabi onun öncesinde bu servisin host edilmesini de sağlamamız gerek.

[VB]

    Public Shared URL As String

 

    Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded

        Dim SHost As New ServiceHost(GetType(Service1))

        SHost.Open()

    End Sub

İşte bu kadar basit. Uygulamamız açıldığı anda bu servisi host edecek ve böylece bizim WP7 uygulaması da bunu referans alıp kullanabilecek. İsterseniz şimdi de gelin WP7 uygulaması tarafındaki PushNotificationService tanımına bakıp Microsoft Push Notification Service üzerinden adres alıp bizim WPF uygulamasına göndermeye çalışalım.

[C#]

        private void button1_Click(object sender, RoutedEventArgs e)

        {

            var Kanal = new HttpNotificationChannel("UygulamaKanali15");

            Kanal.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(Kanal_ChannelUriUpdated);

            Kanal.Open();

            Kanal.BindToShellNotification();

        }

Kodumuzda yarattığımız HttpNotificationChannel sınıfı Microsoft.Phone.Notification assembly'si altında olduğu için söz konusu DLL'i projeye referans olarak eklemeyi unutmayın. Sonrasında HttpNotificationChannel nesnemizi yaratarak kendi tanımladığımız bir de kanal ismi veriyoruz. Nesnemize ait ChannelUriUpdated event'ı Microsoft Push Notification Service'den cihazın adresi geldiğinde çalışıyor. Özünde biz şu anda hem Push Listener tanımlayıp bunun için Microsoft Push Notification Service'den adres isteyerek elimizdeki Push Notification Service'i de BindToShellNotification ile işletim sistemine aktarıyoruz. Adres geldiğinde söz konusu adresi bizim WPF uygulamasındaki servise aktaracağız.

[C#]

        ServiceReference1.Service1Client Servis = new ServiceReference1.Service1Client();

 

        void Kanal_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)

        {

            Servis.SetURLAsync(e.ChannelUri);

        }

WPF uygulamamızdaki servisi reference aldığımıza göre içerisindeki SetURL metodunu kullanarak ChannelUriUpdated eventinden gelen adresi gönderebiliriz. Böylece WP7 uygulamamız kendi adresini alıp bizim servise göndermiş oldu. Bir sonraki adımda bizim bu adrese yani Microsoft Push Notification Services'a bir mesaj yollamamız gerekiyor ki mesaj telefona iletilsin ve kullanıcıya gösterilsin. Bu nedenle geçiyoruz yine WPF uygulamamıza.

[VB]

        Dim MesajXML = <?xml version="1.0" encoding="utf-8"?>

                       <wp:PushNotification xmlns:wp="WindowsPhonePushNotification">

                           <wp:Toast>

                               <wp:Text1>Mesaj1</wp:Text1>

                               <wp:Text2>Mesaj2</wp:Text2>

                           </wp:Toast>

                       </wp:PushNotification>

 

        Dim Mesaj As String = "X-WindowsPhone-Target: toast" & vbCrLf & vbCrLf & MesajXML.ToString()

Yukarıdaki gördüğünüz XML paketi Microsoft Notification Service'e göndermemiz gereken paket. Bu paketin otomatik hazırlanması ile ilgili bir helper sınıfı eminim ki yakında yayınlanacaktır. Fakat şimdilik elle yapmamız gerekiyor. Paketin içerisinde iki adet String data var. Bu dataları istediğiniz gibi değiştirebilirsiniz. Son olarka hazırladığımız bu paketi daha önce servisimize iletilmiş olan adrese gönderiyoruz.

[VB]

        Dim Gonder As HttpWebRequest = WebRequest.Create(URL)

        Gonder.Method = "POST"

        Gonder.Headers = New WebHeaderCollection()

        Gonder.ContentType = "text/xml"

        Gonder.Headers.Add("X-NotificationClass", "2")

 

        Dim ByteArr = New UTF8Encoding().GetBytes(Mesaj)

        Gonder.ContentLength = ByteArr.Length

        Dim GStream = Gonder.GetRequestStream

        GStream.Write(ByteArr, 0, ByteArr.Length)

ToastNotificaton olarak adlandırılan ve telefonun ekranının üst kısmında bir uyarı olarak çıkan bu mesajlar için üç farklı aciliyet seviyesi belirleyebiliyorsunuz. Yukarıdaki kod içerisinde 2 değeri anında teslimat yapılması gerektiğini belirtliyor. 12 ve 22 gibi değer vererek mesajınızın ToastNotification'lar harici farklı Push Notification mesajları arasında da nasıl önceliklendirilebileceğini belirtebiliyorsunuz. Eh artık herşey hazır. WPF uygulamamızı çalıştırıp WP7 uygulamamızı da başlatabiliriz. WP7 uygulaması ilk olarak Microsoft Notification Services'a bağlanıp kendine bir adres yarattıracak. Sonrasında bu adresi bizim WPF uygulamamıza verecek. WPF uygulamamız da artık istediği zaman bu adres mesaj gönderebilecek. Burada önemli olan nokta telefonda uygulamanız kapalı olsa da mesaj işletim sistemi tarafından alınarak kullanıcıya gösterilebilecek.

ToastNotification sahnede.
ToastNotification sahnede.

Hepinize kolay gelsin.

Thursday, May 13, 2010 4:05:08 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Windows Phone 7  | 
 Wednesday, May 12, 2010

GPS sensörleri gün geçtikçe her yerde karşımıza çıkıyor. Kişisel olarak konuşmam gerekirse bir cep telefonu satın alırken GPS sensörüne sahip olması benim için satın alma kararımda çok önemli bir kriter. Özellikle harita uygulamalarına özgüymüş gibi düşünsek de aslında çoğu uygulamanın farklı şekilde kullanıcızı fiziksel konumuna ait bilgiyi kullanma şansı olabilir. En basit örnek olarak bir çeviri uygulaması düşünün İngilizceden Türkçe'ye çeviri yapıyor. Bu uygulama benim Fransa'da olduğumu anlasa ve hemen Fransızca'dan çeviri moduna geçse hoş olmaz mı? Tabi ki tüm bunların ayarlanabilir olması şart fakat bu tarz işlevsellikler uygulamalara eklenebilmesi için en önemli nokta uygulama geliştiriciler için donanımdan bağımsız kod yazma olanağı yaratmak.

Windows Phone 7 cihazlarında GPS sensörü bulunması şart. O nedenle uygulama geliştirirken her şekilde bir GPS sensörüne sahip olduğunuzu düşünebilirsiniz. Diğer yandan özünde bir kullanıcının dünya üzerindeki yerini tespit ederken ne kadar detaya ihtiyacınız olduğuna da karar vermelisiniz. Eğer benim bir önceki örneğimde bahsettiğim gibi sadece hangi ülkede bulunduğu sizin için önemli ise belki de bu bilgiyi doğrudan telefonun sinyal aldığı GSM servisi üzerinden alabilirsiniz. Eğer çok ciddi detaya ihtiyacınız varsa tabi ki GPS sensörünü çalıştırmanız gerekecektir. Hatta GPS konusunda da uydu pozisyonları ile ilgili ek verilerin indirilmesi için Wi-Fi veya 3G üzerinden internete çıkıp global veritabanlarından veri almanız gerekebilir. Tüm bunların hepsini Windows Phone 7 bizim yerimize yapıyor ve en önemlisi ise bize edinmek istediğimiz verinin ne kadar detaylı olması gerektiğine dair karar verme şansı tanıyor. Böylece belki de çok detaya ihtiyacınız olmayan bir senaryoda GPS sensörünü çalıştırmadan (kaynak tüketmeden) ilerleyebiliriz.

Başlayalım...

WP7'de Location API kullanabilmek için projenize ilk aşamada System.Device.Location DLL'ini referans almanız gerekiyor. Sonrasında aşağıdaki gibi uygulama ekranımızı tasarlayıp sensörümüze ulaşmaya başlayabiliriz.

[XAML]

<Grid x:Name="ContentGrid" Grid.Row="1">

  <Button Content="Button" Height="50" HorizontalAlignment="Left" Margin="116,23,0,0" Name="button1" VerticalAlignment="Top" Width="252" Click="button1_Click" />

  <TextBlock Height="57" HorizontalAlignment="Left" Margin="167,139,0,0" Name="textBlock1" Text="TextBlock" VerticalAlignment="Top" Width="144" />

  <TextBlock Height="57" HorizontalAlignment="Left" Margin="154,201,0,0" Name="textBlock2" Text="TextBlock" VerticalAlignment="Top" Width="144" />

</Grid>

Her zamanki gibi demo amaçlı olarak uygulama ekranına iki TextBlock ve bir de Button koyduk. Amacımız düğmeye basıldığında sensöre ulaşıp aldığımız koordinat bilgilerini de iki TextBlock üzerinde göstermek.

[C#]

    private void button1_Click(object sender, RoutedEventArgs e)

    {

        GeoCoordinateWatcher Pozisyon = new GeoCoordinateWatcher(GeoPositionAccuracy.High);

        Pozisyon.MovementThreshold = 15;

        Pozisyon.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(Pozisyon_PositionChanged);

        Pozisyon.Start();

    }

Uygulama içerisindeki düğmeye tıklandığı anda yeni bir GeoCoordinateWatcher nesnesi yaratıyoruz. Constructor'a bir parametre ile beraber gittiğimiz dikkatinizi çekmiştir. İşte buradaki parametre bizim istediğimiz lokasyon bilgisinin hassasiyeti ile ilgili. Eğer GPS sensörü kullanılsın istiyorsanız High, yok sadece GSM üzerinden lokasyon alınsın istiyorsanız Low seçeneklerini kullanabilirsiniz. İkinci adımda MovementThreshold adında ek bir parametremiz daha var. Malum GPS cihazları (özellikle antensiz ve telefon içerisinde olanlar) çok hassas cihazlar ve ufak hatalar yapabiliyorlar. Örneğin siz sabit dursanız da sizi hareket ediyormuş gibi gösterebilirler. Bunu kısmen engellemek için bir "paraziti engelleme" parametresi belirliyoruz :) Aslında bu parametre ile belirli bir miktarın altındaki koordinat değişikliklerin raporlanmamasını sağlamış oluyoruz. Böylece gerçeken bizim "umursadığımız" bir değişiklik olduğunda bize rapor geliyor.

Bir sonraki adımda GPS sensöründen yeni veri geldiğinde haberdar olmak için kullanacağımız event listener'ımızı GeoCoordinateWatcher'ın PositionChanged eventine bağlıyoruz. Son olarak da bilgi alma işlemini yani sensörü dinleme işlemini başlatıyoruz.

[C#]

    void Pozisyon_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)

    {

        Dispatcher.BeginInvoke(() => Degisti(e));

    }

Pozisyon değişikliğini dinleyen listener'ımız beraberinde argümanı ile geliyor ve söz konusu argüman içerisinde bizim istediğimiz tüm bilgiler mevcut. Diğer yandan bu event başka bir thread tarafından çalıştırıldığı için yine UIThread'i bilgi aktarmak için Dispatcher üzerinden ayrı bir metod çağırıyoruz.

[C#]

    void Degisti(GeoPositionChangedEventArgs<GeoCoordinate> e)

    {

        textBlock1.Text = e.Position.Location.Latitude.ToString();

        textBlock2.Text = e.Position.Location.Longitude.ToString();

    }

Argümanımızı artık UIThread'e kadar aldık. Geriye eldeki parametreleri ekrana yazmak kaldı. Tabi siz farklı uygulamalarda bu parametreleri farklı şekillerde kullanabilirsiniz. Kötü haber ise MIX ile beraber gelen emülatörün GPS simülasyonu yapamaması. O nedenle bu gibi uygulamalar geliştirirken kendi sallama değerlerinizi yaratan bir sınıf kullanmanız çok daha mantıklı olabilir. Son noktada da gördüğünüz üzere Location implementasyonu rahatlıkla yapılabilir.

Hepinize kolay gelsin.

Wednesday, May 12, 2010 1:44:48 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Windows Phone 7  | 
 Tuesday, May 11, 2010

Cep telefonlarının en önemli parçalarından biri de artık Accelerometer'lar. Telefonu farklı yönlenere çevirdiğimizde durumu algılayan donanım parçasından bahsediyorum :) Aslında bu donanım son dönemde cep telefonlarından çıkıp bilgisayarlarımıza kadar geldi hatta bu konuda Windows 7 ile beraber "Sensor and Location API" adında yeni bir API serisi bile var. Tabi Windows Phone 7 için uygulama geliştirirken de doğal olarak cihazlardaki Accelerometer'a ulaşmamız gerekecek. Merak edenler için özellikle belirtiyim; üzerinde WP7 bulunan her telefonun bir Accelerometer içermesi Microsoft tarafından şart koşuluyor. O nedenle uygulamalarınızı kodlarken rahat olabilirsiniz, her halükarda bir Accelerometer sahibi olacaksınız.

İlk olarak gelin yeni yaratacağımız bir WP7 uygulamasına bir düğme ve üç tane de TextBlock koyalım. Düğmeye basıldığı anda Accelerometer sensörüne bağlantıyı kuracağız sonrasında da sensörden yeni veri geldikçe X, Y ve Z koordinatlarını ayrı ayrı TextBlock'larda göstereceğiz.

[XAML]

<Grid x:Name="ContentGrid" Grid.Row="1">

  <Button Content="Button" Height="50" HorizontalAlignment="Left" Margin="116,23,0,0" Name="button1" VerticalAlignment="Top" Width="252" Click="button1_Click" />

  <TextBlock Height="57" HorizontalAlignment="Left" Margin="167,139,0,0" Name="textBlock1" Text="TextBlock" VerticalAlignment="Top" Width="144" />

  <TextBlock Height="57" HorizontalAlignment="Left" Margin="154,201,0,0" Name="textBlock2" Text="TextBlock" VerticalAlignment="Top" Width="144" />

  <TextBlock Height="57" HorizontalAlignment="Left" Margin="137,250,0,0" Name="textBlock3" Text="TextBlock" VerticalAlignment="Top" Width="144" />

</Grid>

Tasarım kısmını kabaca bitirdiğimize göre sıra geldi Accelerometer nesnemizi yakalamaya. Malum telefonlarda bir Accelerometer şart olsa da sadece bir tane olması gerektiğine dair herhangi bir kural yok. O nedenle eğer isterseniz sistemdeki tüm Accelerometer'ların bir listesini Microsoft.Devices.Sensors.AccelerometerSensor listesinden alabilirsiniz. Tabi tüm bunları yapabilmeniz için projenize Microsoft.Devices.Sensors assembly'sini referans olarak da eklemiş olmanız gerekiyor.

Eğer tüm liste sizi ilgilendirmiyorsa ve bir anlamda esas sensörü yani varsayılan Accelerometer'ı almak istiyorsanız hızlıca Microsoft.Devices.Sensors.AccelerometerSensor.Default diyebilirsiniz.

[C#]

    AccelerometerSensor accelerometer;

 

    private void button1_Click(object sender, RoutedEventArgs e)

    {

        accelerometer = AccelerometerSensor.Default;

        accelerometer.ReadingChanged += new EventHandler<AccelerometerReadingAsyncEventArgs>(accelerometer_ReadingChanged);

        accelerometer.Start();

    }

Kod içerisinde de görebileceğiniz gibi uygulamamızdaki düğmeye basıldığı anda sistemdeki varsayılan Accelerometer'ı hemen daha önce tanımladığımız AccelerometerSensor tipindeki bir değişkene aktarıyoruz. Özünde bunu yapmamızın tek bir nedeni. Sensörü dinleme işlemini başlatmak için Start ve bitirmek için de Stop metodlarını kullanabiliyorsunuz. Malum sensöre ileride ulaşıp durdurabilmek için global bir değişken tanımlamak en mantıklısı. Bunun haricinde unutmamamız gereken birşey daha var; o da sensörün ReadingChanged event'ine bir listener ataçlamak. Böylece sensörden yeni data geldiği anda haberdar olabileceğiz.

[C#]

    void accelerometer_ReadingChanged(object sender, AccelerometerReadingAsyncEventArgs e)

    {

        Dispatcher.BeginInvoke(() => Degisti(e));

    }

 

    void Degisti(AccelerometerReadingAsyncEventArgs e)

    {

        textBlock1.Text = e.Value.Value.X.ToString();

        textBlock2.Text = e.Value.Value.Y.ToString();

        textBlock3.Text = e.Value.Value.Z.ToString();

    }

ReadingChanged eventı başka thread tarafından çalıştırıldığı için doğrudan UIThread'e ulaşamıyoruz. Bu nedenle Dispathcher üzerinden metodumuzu çalıştırmamız gerek ki UIThread'de işlem yapabilelim. Tüm bu süreçte bizim için değerli olan datayı taşıyan ise ReadingChanged'e gelen argüman parametresi. Söz konusu parametreyi doğrudan UIThread'deki metodumuza da yolluyoruz ki değerleri alıp ekrana yazabilsin. Son olarak Degisti adındaki metodun içerisinde X, Y ve Z değerlerinin nasıl alınabildiğini de görebiliyorsunuz.

Artık elimizde sensörün o an için bize gönderdiği koordinat bilgisi var. Geriye kalan bu bilgilere dayanarak uygulama içerisinde farklı birşeyler yapmak. Tabi bu noktadan sonrası için makalemie devam edemeyeceğiz :) Çünkü özünde minik ama kötü bir haberim var. Şu anda MIX ile yayınlanan Windows Phone 7 CTP'sindeki simülatör sensör desteğine sahip değil :( O nedenle bu yazdığımız kodların hiçbirini test etme veya uygulama geliştirme şansımız olmuyor. Yine de şöyle bir bakış atmış ve olayın nihai manzarada da ne kadar kolay olabileceğine dair fikir edinmiş olduk.

Hepinize kolay gelsin.

Tuesday, May 11, 2010 7:45:36 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Windows Phone 7  | 
 Monday, May 10, 2010

Bugün neredeyse her cep telefonunda bir Accelerometer mevcut. Böylece en basit işlevsellik olarak telefonumuzu yana çevirdiğimizde algılamasını ve ekranı da ona göre toparlamasını isteyebiliriz. İtiraf etmek gerekirse zaten Accelerometer sahibi olup da bu işi yapmayan telefon kalmadı gibi :) Diğer yandan önemli olan bizim uygulamalarımızda bu durumu algılayıp uygun tepkiler verebilmemiz. Bunun için Windows Phone 7 üzerinde uygulama geliştirirken de kullanabileceimiz API'ler mevcut. İşte bu makalemizde bu API'lere göz atarak basit bir resim gösteren uygulama yazacağız.

[XAML]

<Grid x:Name="ContentGrid" Grid.Row="1">

    <Image HorizontalAlignment="Stretch" Name="image1"

          Stretch="Uniform" VerticalAlignment="Stretch"

          Source="/WindowsPhoneApplication5;component/Images/Koala.jpg" />

</Grid>

Yukarıda gördüğünüz kod ile ekrana bir Image nesnesi koyarak projemize eklediğimiz bir resmi göstermesini sağlıyoruz. Bu esnada Image nesnesinin her tarafa genişleyebilmesi için tüm Alignment özellikleri Stretch olarak ayarlanmış durumda fakat diğer yandan da resmin en boy oranı bozulmadan büyütülmesi için Stretch özelliği de Uniform olarak ayarlanmış durumda. Peki bu şekli ile uygulamamızı çalıştırdığımızda neler oluyor?

Farklı pozisyonlarda uygulamamız.
Farklı pozisyonlarda uygulamamız.

Eh herşey süper gibi duruyor. Resmimiz her şekilde kendine kalan alanda en büyük şekilde gözükmeye çalışıyor. Fakat genelde kullanıcıların telefonu yana çevirmiş olarak kullanmadıklarını :) ve eğer yana çeviriyorlarsa büyük ihtimal resmi ekrana yayıp daha geniş görmek istediklerini düşünebilir miyiz? Kesinlikle :) İşte bu durumda bizim kullanıcının telefonu çevirdiğini anlamamız, hangi tarafa çevirdiğinizi öğrenmemiz ve ona göre ekranı tekrar toparlamamız gerekecek. Hadi bakalım, başlayalım.

[C#]

        public MainPage()

        {

            InitializeComponent();

 

            SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;

 

            this.OrientationChanging += new EventHandler<OrientationChangedEventArgs>(MainPage_OrientationChanging);

        }

 

        void MainPage_OrientationChanging(object sender, OrientationChangedEventArgs e)

        {

            if (e.Orientation == PageOrientation.LandscapeLeft ||e.Orientation == PageOrientation.LandscapeRight )

            {

                TitleGrid.Visibility = System.Windows.Visibility.Collapsed;

                Grid.SetRow(ContentGrid, 0);

                Grid.SetRowSpan(ContentGrid, 2);

            }

            else

            {

                TitleGrid.Visibility = System.Windows.Visibility.Visible ;

                Grid.SetRow(ContentGrid, 1);

                Grid.SetRowSpan(ContentGrid, 1);

            }

        }

Kodumuzda ilk olarak sayfanın OrientationChanging event'ına bir listener ataçlıyoruz. Sayfamızın zaten başında SupportedOrientations kısmında hem yatay hem de dikey desteği olduğu için telefon sağa veya sola çevrildiği anda bu event çalışacaktır. Event'ımız çalıştıktan sonra yapmamız gereken ise telefonun hangi yöne nasıl döndüğünü angılayıp sonra da ekranda gerekli değişiklikleri yapmak. Bunun için söz konusu eventa gelen OrientationChangedEventArgs parametresi üzerinden Orientation özelliğini kullanabiliriz. Eğer telefon sola veya sağa döndürülmüş ve yan tutuluyorsa basit bir şekilde ekranın üstündeki yazıyı kaldırıp resmimizin bulunduğu kısmı ana sayfada ekrana yayıyoruz. Aksi durumda, yani telefon tekrar normal şeklinde tutulduğunda ise eski ayarları tekrar yüklüyoruz. Böylece çok basit bir şekilde telefonun durumunu algılayıp uygulamamızın tepki vermesini sağladık.

Farklı tutuşlara göre tepki veren uygulamamız.
Farklı tutuşlara göre tepki veren uygulamamız.

Sanırım son bir sorun kaldı. Dikkatinizi çektiyse örnek uygulamamızda bir de menü var (ApplicatioBar) ve söz konusu menü içerisindeki düğmeler bile telefonun durumuna göre sağa sola dönüyorlar fakat ekrandan yer kaybetmemiz neden oluyorlar. Aslında biz ekranda uygulamamızın ana yüzeyi dışında hiçbirşey gözüksün istemiyoruz. İşte bu gibi bir durumda uygulamayı tam ekran moduna alabilirsiniz.

[C#]

        void MainPage_OrientationChanging(object sender, OrientationChangedEventArgs e)

        {

            if (e.Orientation == PageOrientation.LandscapeLeft ||e.Orientation == PageOrientation.LandscapeRight )

            {

                TitleGrid.Visibility = System.Windows.Visibility.Collapsed;

                Grid.SetRow(ContentGrid, 0);

                Grid.SetRowSpan(ContentGrid, 2);

                this.FullScreen = true;

            }

            else

            {

                TitleGrid.Visibility = System.Windows.Visibility.Visible ;

                Grid.SetRow(ContentGrid, 1);

                Grid.SetRowSpan(ContentGrid, 1);

                this.FullScreen = false;

            }

        }

Yukarıda gördüğünüz şekilde basit bir değişiklik uygulamanın farklı durumda tamamen tam ekran çalışmasını sağlayabilir. Böylece ekranda uygulamamızın ana ekranı dışında hiçbirşey gözükmeyecektir.

FullScreen modunda uygulamamızın görünüşü.
FullScreen modunda uygulamamızın görünüşü.

Monday, May 10, 2010 12:19:18 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Windows Phone 7  | 
 Thursday, May 06, 2010

Windows Phone 7 ile beraber gelen uygulama için navigasyon sistemlerinin bir parçası da işletim sisteminin sunduğu menü altyapısı. Bu konuda radikal bir değişikliğe giden Microsoft artık işletim sistemin ekranının altında veya üstünde (fiziksel düğmelere en yakın kısımda) bir bar göstererek söz konusu bar üzerinden komutları sunuyor. Eskiden olduğu gibi uygulamaların alt kısımda iki düğme bulunarak bu düğmelere basıldığında da açılan uzun kısmi menülere artık yer yok.

WP7'de navigasyon menüleri...
WP7'de navigasyon menüleri...

Yukarıda gördüğünüz sistemde üst kısımda gördüğünüz dört düğme sürekli olarak gözüken düğmeler oluyor ve ApplicationBarIconButton sınıfı ile yaratılıyor. Bu düğmeler bir ApplicationBar'ın parçaları arasında. Ayrıca isterseni ApplicationBar'lara ek olarak ApplicationBarMenuItem da ekleyebiliyorsunuz. MenuItem'lar normalde gözükmüyor fakat BarIconButton'ların listesinin yanında yer alan üç noktaya tıkladığınızda MenuItem'lar da sahneye geliyor ve kullanılabiliyor. Duruma göre uygulamanızın istediğiniz ekranına istediğiniz ApplicationBar'ı yaratabilir ve duruma göre IconButton ve MenuItem'ları beraber veya ayrı ayrı kullanabilirsiniz.

ApplicationBar'lar ekran başına yani PhoneApplicationPage başına yaratılabilse de genelde merkezi bir yerde tutup birden çok ekranda kullanmak daha mantıklı olabilir böylece bar arkasındaki navigasyon vs kodları da Navigation API'yi kullanıyorsa rahatlıkla uygulama içerisinde tek bir merkezi bar ile gezilebilmesini sağlayabilirsiniz. Örnek projemizde de yaratacağımız barı App.XAML içerisine koyarak merkezi hale getireceğiz, böylece barımızı tüm Page'lerde kullanma şansımız olacak.

[XAML]

<Application

   x:Class="WindowsPhoneApplication5.App"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"      

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   xmlns:system="clr-namespace:System;assembly=mscorlib"

   xmlns:mpc="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"

   xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone.Shell"

   xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Navigation">

 

    <Application.RootVisual>

        <phoneNavigation:PhoneApplicationFrame x:Name="RootFrame" Source="/MainPage.xaml"/>

    </Application.RootVisual>

 

    <Application.Resources>

        <shell:ApplicationBar x:Key="MainAppBar" Visible="True">

            <shell:ApplicationBar.MenuItems>

                <shell:ApplicationBarMenuItem Text="Gel de tıklama..." Click="MenuTiklandi" />

            </shell:ApplicationBar.MenuItems>

 

            <shell:ApplicationBar.Buttons>

                <shell:ApplicationBarIconButton IconUri="1.png" Click="IconDugmeTiklandi" />

                <shell:ApplicationBarIconButton IconUri="2.png" Click="IconDugmeTiklandi" />

                <shell:ApplicationBarIconButton IconUri="3.png" Click="IconDugmeTiklandi" />

                <shell:ApplicationBarIconButton IconUri="4.png" Click="IconDugmeTiklandi" />

            </shell:ApplicationBar.Buttons>

        </shell:ApplicationBar>

Yukarıdaki gördüğünüz ApplicatioBar implementasyonu yapılmış bir App.XAML dosyası. ApplicationBar ve diğer kullanacağımız sınıflar Microsoft.Phone.Shell altında tanımlı olduğu için söz konusu assembly'i projemize referans olarak eklememiz sonrasında da XAML dosyası içerisinde özel bir namespace tanımlayarak import etmiş olmamız gerek. Kodun en üst kısmında kalın olarak göreceğiniz kısımda tam da bu işlemi yapıyoruz. Sonrasında sıra geliyor artık menümüz içerisinde düğmelere ve komutlara karar vermeye. Şimdilik deneme amaçlı olarak üst parafraglarda görselini gördüğümüz menüyü tanımlamak için dört adet IconButton ve bir tane de MenuItem yaratabiliriz. MenuItem'lar Text alırken IconButton'lara ise birer PNG dosya verebilirsiniz. Unutmayın PNG'lerinizi projenize ekledikten sonra Build Action olarak Content seçmeniz gerekecek. Son olarak Click eventlarını de bağlayarak kod tarafına geçebiliriz.

[C#]

        private void IconDugmeTiklandi(object sender, EventArgs e)

        {

            ((PhoneApplicationFrame)Application.Current.RootVisual).Navigate(new Uri("/OrnekSayfa.xaml", UriKind.Relative));

        }

 

        private void MenuTiklandi(object sender, EventArgs e)

        {

            ((PhoneApplicationFrame)Application.Current.RootVisual).Navigate(new Uri("/OrnekSayfa2.xaml", UriKind.Relative));

        }

Örneğimizin basitliğini korumak adına projemizde iki adet OrnekSayfa.xaml ve OrnekSayfa2.xaml adında Page olduğunu varsayalım ve IconButton'lardan herhangi birine basıldığında sayfalardan birine MenuItem'a basıldığında da diğerine yönlendirelim. Gördüğünüz üzere kod aslında olabildiğince basit. Navigation API'ye App.xaml içerisinden ulaşabilmek için uygulamanın RootVisual'ını buluyoruz ki o da zaten bizim PhoneApplicationFrame. Böylece AppFrame üzerinden de rahatlıkla Navigate metodunu çağırabiliyoruz.

Sıra geldi bu menüyü istediğimiz Page'lerle ilişkili hale getirmeye. Böylece söz konusu Page'ler uygulamada gösterilirken bu menü de ekrana gelecek.

[XAML]

<phoneNavigation:PhoneApplicationPage

   x:Class="WindowsPhoneApplication5.MainPage"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Navigation"

   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

   mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"

   FontFamily="{StaticResource PhoneFontFamilyNormal}"

   FontSize="{StaticResource PhoneFontSizeNormal}"

   Foreground="{StaticResource PhoneForegroundBrush}"

   ApplicationBar="{StaticResource MainAppBar}">

 

    <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneBackgroundBrush}">

Yukarıda gördüğünüz XAML kodu herhangi bir ApplicationPage'in kodu olabilir. Önemli olan App.xaml içerisinde aslında Resource olarak tanımladığımız menümüzü alıp istediğimiz sayfaya ApplicationBar olarak atamak. Böylece artık bu sayfada bizim menü gözükmeye başlayacak.

[XAML]

<phoneNavigation:PhoneApplicationPage

   x:Class="WindowsPhoneApplication5.MainPage"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Navigation"

   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

   xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone.Shell"

   mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"

   FontFamily="{StaticResource PhoneFontFamilyNormal}"

   FontSize="{StaticResource PhoneFontSizeNormal}"

   Foreground="{StaticResource PhoneForegroundBrush}">

    <phoneNavigation:PhoneApplicationPage.ApplicationBar>

        <shell:ApplicationBar Visible="True">

            <shell:ApplicationBar.MenuItems>

                <shell:ApplicationBarMenuItem Text="Gel de tıklama..." Click="MenuTiklandi" />

            </shell:ApplicationBar.MenuItems>

            <shell:ApplicationBar.Buttons>

                <shell:ApplicationBarIconButton IconUri="1.png" Click="IconDugmeTiklandi" />

                <shell:ApplicationBarIconButton IconUri="2.png" Click="IconDugmeTiklandi" />

                <shell:ApplicationBarIconButton IconUri="3.png" Click="IconDugmeTiklandi" />

                <shell:ApplicationBarIconButton IconUri="4.png" Click="IconDugmeTiklandi" />

            </shell:ApplicationBar.Buttons>

        </shell:ApplicationBar>

    </phoneNavigation:PhoneApplicationPage.ApplicationBar>

    <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneBackgroundBrush}">

Ayrıca isterseniz ApplicationBar'lar Page başına da tanımlayabilirsiniz. Yani App.xaml gibi global bir yere koymadan Bar'ları her sayfanın içine gömme şansına da sahipsiniz. Yukarıdaki XAML kodu bunun için güzel bir örnek olabilir.

Hepinize kolay gelsin.

Thursday, May 06, 2010 11:37:11 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Windows Phone 7  | 
 Wednesday, May 05, 2010

Windows Phone 7 içerisinden kullanıcılara doğrudan bir dosya sistemi gösterimi yapılmıyor aynı şekilde yazılım geliştiriciler de herhangi bir dosya sistemine erişim yapamıyor. Yani bizim Windows Mobile 6.x'ten alışık olduğum gibi uygulamalar dosyalarını dosya sisteminde bir yerlere kaydetmiyorlar. Kullanılacak model her uygulamanın kendi IsolatedStorage alanını kullanması. Varsayılan ayarlarla her uygulamaya 2GB kota veriliyor. Her uygulama kendi dosyalarını buraya saklayarak uygulama açıldığında da aynı alana erişerek kullanıcıya gerekli dosyaların bir listesini gösterebilir. Böylece son kullanıcı bakış açısı ile çok daha derli toplu bir sistem yaratılmış oluyor. Diğer yandan uygulamaların işletim sisteminin bulunduğu olası bir dosya sistemine erişmemesi de güvenlik açısından çoğu sorunun önünü kesiyor. Tüm bu sistem içerisinde uygulamanızın ayarları da aynı şekilde IsolatedStorage içerisinde tutulabiliyor. Bu örneğimizde WP7 içerisinde ufak bir Silverlight uygulaması yaparak kendi tanımladığımız custom bir entity'yi IsolatedStorage içerisinde uygulama ayarı olarak saklayacağız.

[XAML]

<Grid x:Name="ContentGrid" Grid.Row="1">

    <TextBox Height="74" HorizontalAlignment="Left" Margin="120,51,0,0" Name="textBox1" Text="TextBox" VerticalAlignment="Top" Width="322" />

    <TextBox Height="74" HorizontalAlignment="Left" Margin="120,131,0,0" Name="textBox2" Text="TextBox" VerticalAlignment="Top" Width="322" />

    <Button Content="Button" Height="63" HorizontalAlignment="Left" Margin="167,227,0,0" Name="button1" VerticalAlignment="Top" Width="242" Click="button1_Click" />

</Grid>

İlk olarak uygulama ekranına iki adet TextBox ve bir de Button yerleştiriyoruz. Bu TextBox'lar içerisindeki verileri bir Entity'ye aktardıktan sonra söz konusu Entity'yi de IsolatedStorage içerisinde ApplicationSetting olarak saklayacağız. Kaydetme işlemini doğrudan Button'un Click durumunda yapabiliriz.

[C#]

public class Urun

{

    public string Adi { get; set; }

    public int Stok { get; set; }

}

Yukarıdaki gördüğünüz sınıf örneğimiz için kullanacağımız basit bir Entity. TextBox'lar içerisindeki verileri ürünün adı ve stok bilgisi şeklinde ilişkilendireceğiz. IsoStore içerisinde tüm ApplicationSetting'ler birer String olarak saklanabildiği için bizim de eldeki Entity'yi bir şekilde string'e serialize etmemiz sonrasında da tabi aynı bilgisi IsoStore'dan okurken DeSerialize etmemiz gerekecek. Bunun için en uygunu hızlıca JSON formatını kullanabileceğimiz DataContractJsonSerializer sınıfından faydalanmak. System.ServiceModel.Web'i projemize referans olarak eklediğimiz gibi artık yolda devam etmeye hazırız.

System.ServiceModel.Web'i referans olarak alıyoruz.
System.ServiceModel.Web'i referans olarak alıyoruz.

[C#]

        private void button1_Click(object sender, RoutedEventArgs e)

        {

            Urun BirUrun = new Urun();

            BirUrun.Adi = textBox1.Text;

            BirUrun.Stok = int.Parse(textBox2.Text);

 

            string json = "";

 

            using (MemoryStream ms = new MemoryStream())

            {

                DataContractJsonSerializer serializer = new DataContractJsonSerializer(BirUrun.GetType());

                serializer.WriteObject(ms, BirUrun);

                ms.Position = 0;

 

                using (StreamReader reader = new StreamReader(ms))

                {

                    json =  reader.ReadToEnd();

                }

            }

            IsolatedStorageSettings.ApplicationSettings["BizimUrun"] = json;

        }

Yukarıdaki kodumuz kaydetme düğmemizin arkasındaki kod. Kaydet düğmesine basıldığı gibi Entity'mizden bir adet yaratıp gerekli bilgileri de TextBox'lardan Property'lere atadıktan sonra bir DataContractJsonSerializer yaratarak entity'yi eldeki MemoryStream'e serialize ediyoruz. Sonunda da MemoryStream'i okuyarak String bilgiyi alıp hızlıca ApplicationSettings içerisinde Key/Value Pair tadında saklıyoruz. Artık uygulamanızı kapatıp açsanız bile sürekli uygulamanıza ait IsoStore içerisinde bu Entity bulunacaktır. Son olarak sıra geldi kaydettiğimiz bu veriyi, uygulama ayarını bir şekilde IsoStore'dan okuyarak uygulama ilk açıldığında TextBox'lara eski değerleri atamaya.

[C#]

        void MainPage_Loaded(object sender, RoutedEventArgs e)

        {

            if (IsolatedStorageSettings.ApplicationSettings.Contains("BizimUrun"))

            {

                Urun BirUrun;

                string json = IsolatedStorageSettings.ApplicationSettings["BizimUrun"].ToString();

                using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))

                {

                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Urun));

                    BirUrun = (Urun)serializer.ReadObject(ms);

                }

                textBox1.Text = BirUrun.Adi;

                textBox2.Text = BirUrun.Stok.ToString();

            }

        }

Uygulamamız ilk açıldığında IsoStore içerisinde elimizdeki Key olan "BizimUrun"'e denk gelen bir Value var mı kontrolünü yaptıktan sonra eğer daha önce veri kaydedilmiş ise hemen okuma işlemine geçiyoruz. Yeni bir Entity yarattıktan sonra eldeki String JSON değerini AppSettings'den alıp ByteArray'den MemoryStream yaratıyoruz. Geriye kalan artık söz konusu MemoryStream içerisindeki verinin DataContractJsonSerializer tarafından bir Urun nesnesine DeSerialize edilmesi. İşlem tamamlandıktan sonra da Entity içerisindeki değerleri rahatlıkla uygulama arayüzündeki kontrollere atayabiliriz.

Sonuç

Gördüğünüz gibi aslında herşey normal Silverlight development tarafı ile neredeyse bire bir aynı. Bu noktada önemli olan aslında bunun artık WP7'de uygulama geliştirme modeli olması. IsolatedStorage WP7'de çok önemli bir yere sahip ve her uygulamanın doğrudan Runtime tarafından yönetilen kendi disk alanına sahip olmasına olanak tanıyor. Böylece artık dosya sisteminde dosyayı bulup ilişkili programlama açma devri kapanıyor onun yerine ilişkili program açılıp onun içerisinden dosyaların listesi görünerek uygun dosya seçilik açılabiliyor. Tabi bu bahsettiğimiz IsoStore'un normal FileSystem modunda kullanımı, diğer yandan uygulama ile ilgili kullanıcının doğrudan kaydetme işlemi yapmadığı ve bizim yönettiğimiz veriler bu makalede gördüğümüz üzere ApplicationSetting olarak saklanabiliyor.

Hepinize kolay gelsin.

Wednesday, May 05, 2010 6:17:19 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Windows Phone 7  | 
 Monday, May 03, 2010

Bu makalemizde Windows Phone 7 içerisinde uygulama geliştirirken kullanabileceğimiz hazır gelen navigasyon sistemine göz atacağız. Fakat bunun öncesinde tavsiyem benzerliklerinden dolayı Silverlight 3.0 içerisindeki Navigation API'yi bir incelemeniz. Sonrasında WP7 tarafında devam edebiliriz.

WP7 Kullanıcı Arayüzü Yapısı
WP7 Kullanıcı Arayüzü Yapısı

Her yeni yaratılan WP7 uygulamasında root element bir PhoneApplicationFrame olarak gelir. Bu çerçeve içerisinde birden çok sayfa farklı navigasyonlarda rahatlıkla gösterilebilir. Bu yapı kendi içerisinde SystemTray ve ApplicationBar'ı da sunar. Ayrıca PhonePage olarak geçen uygulama içerisindeki her sayfa da bu Frame tarafından gösterilir. Sayfalar ile kabaca iki bölüme ayrılır. Sayfa başlığının bulunduğu Title kısmı ve sayfanın tüm iç kontrollerinin bulunacağı Content bölümü.

[XAML]

<Application

   x:Class="WindowsPhoneApplication4.App"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"      

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   xmlns:system="clr-namespace:System;assembly=mscorlib"

   xmlns:mpc="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"

   xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Navigation">

 

    <!--RootFrame points to and loads the first page of your application-->

    <Application.RootVisual>

        <phoneNavigation:PhoneApplicationFrame x:Name="RootFrame" Source="/MainPage.xaml"/>

    </Application.RootVisual>

Yukarıda gördüğünüz kod herhangi bir WP7 uygulamasının App.XAML dosyasında ilk yaratıldığında bulunan kod. Kod içerisinde uygulamanın RootVisual'ı olarak bir PhoneApplicationFrame atandığını görebiliyoruz. Söz konusu PhoneApplicationFrame Microsoft.Phone.Controls.Navigation assembly'si altında Microsoft.Phone.Controls namespace'inde bulunuyor. Bahsettiğimiz namespace zaten phoneNavigation adında bir XML namespace olarak XAML dosyasında tanımlanmış durumda. PhoneAppFrame'in ilk açılıştaki Source değeri uygulama ilk açıldığında gösterilecek sayfayı yani PhoneApplicationPage'i hedefliyor. Söz konusu tanımlama XAP dosyasının iç yapısına ait bir Uri. Tam da bu noktada eğer istersek farklı UriMapping kuralları da tanımlayabiliyoruz ve buradaki Navigation API'yi aynı normal Silverlight uygulamalarında olduğu gibi kullanabiliyoruz.

[XAML]

<Application

   x:Class="WindowsPhoneApplication4.App"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"      

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   xmlns:system="clr-namespace:System;assembly=mscorlib"

   xmlns:mpc="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"

   xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Navigation"

   xmlns:nav="clr-namespace:System.Windows.Navigation;assembly=Microsoft.Phone.Controls.Navigation">

 

    <!--RootFrame points to and loads the first page of your application-->

    <Application.RootVisual>

        <phoneNavigation:PhoneApplicationFrame x:Name="RootFrame" Source="/MainPage.xaml">

            <phoneNavigation:PhoneApplicationFrame.UriMapper>

                <nav:UriMapper>

                    <nav:UriMapper.UriMappings>

                        <nav:UriMapping Uri="/urun/{ID}" MappedUri="/Sayfalar/Page1.xaml?ID={ID}"/>

                    </nav:UriMapper.UriMappings>

                </nav:UriMapper>

            </phoneNavigation:PhoneApplicationFrame.UriMapper>

        </phoneNavigation:PhoneApplicationFrame>

    </Application.RootVisual>

Yukarıdaki XAML kodu içerisinde önemli birkaç nokta var. Bunlardan ilki XAML NameSpace olarak tanımladığımız nav namespace'i. NAV NameSpace'i de yine Microsoft.Phone.Controls.Navigation assembly'si içerisinde fakat bu sefer System.Windows.Navigation altında gelen sınıfları kullanmanız gerekiyor. İstediğimiz şey bizim PhoneAppFrame için bir UriMapper tanımlamak. Böylece uygulama içerisinde vereceğimiz farklı linkler doğrudan XAP dosyası içerisinde path'lere (Uri'lere) dönüşebilecek ve uygun XAML dosyası (PhoneAppPage) sahneye gerekli parametrelerle getirilebilecek.

Örneğimizde sadece bir adet mapping var. Herhangi bir şekilde /urun/1 veya /urun/2 gibi bir adrese yönlendirme yapıldığında söz konusu sondaki ID'yi alarak XAP dosyası içerisinde Sayfalar klasöründe bulunan Page1.XAML adındaki bir dosyaya ID parametresi olarak gönderiyoruz. Yazım esnasında {Degisken} şeklinde tanımladığınız her deyim aslında birer local değişken gibi davranarak sizin gelen path'den bir değeri alarak yarattığınız hedef path'e aktarmnızı sağlıyor. Bu şekilde tanımlanan Mapping'ler kullandığınız PhoneAppFrame içerisindeki tüm navigasyonlarda otomatik olarak uygulanacaktır.

Sayfalar klasörü ve içerisindeki View'lerimiz....
Sayfalar klasörü ve içerisindeki View'lerimiz....

Tabi bu noktaya kadar biz ne Sayfalar klasörü yarattık ne de içinde Page1.xaml adında bir dosya var. O nedenle şimdi gelin XAP içerisinde bir Sayfalar klasörünü yukarıdaki ekran görüntüsündeki gibi yaratalım ve içerisine de yeni bir "Windows Phone Portrait Page" ekleyelim.

Uygulamamız yeni bir Page ekliyoruz.
Uygulamamız yeni bir Page ekliyoruz.

Eklediğimiz bu sayfa bizim daha önce App.XAML içerisinde tanımladığımız UriMapper'daki kurallar sayesinde çağrılacak. Hatırlarsanız mapping kuralı içerisinde Sayfalar/Page1.xaml?ID={ID} demiştik ve {ID} yerine de mapping esnasından uygun değer yerleştirilecekti. Peki Page1.XAML nasıl olacak da bu ID değerine ulaşacak. Her zamanki gibi Navigation API ile beraber gelen sistemi kullanacağız.

[C#]

        void Page1_Loaded(object sender, RoutedEventArgs e)

        {

            ListName.Text = this.NavigationContext.QueryString["ID"].ToString();

        }

Yukarıda gördüğünüz kod Page1.XAML içerisinde gelen ID parametresini yakalamanın yolu. Normal bir ASP.NET uygulamasını QueryString almaktan pek farklı değil. Artık sayfa içerisinde gelen parametreye göre farklı bilgiler gösterebilir, işlemler yapabilirsiniz. Şimdilik örneğimizde sadece gelen ID'yi ekrana yansıtıyoruz ki test edebilelim.

Mapping sistemimiz hazır, hedef sayfamız hazır ve kendisine gelen parametreyi dinliyor. Son adım olarak ana sayfada bu hedef sayfaya link vermek kaldı.

[XAML]

<Grid x:Name="ContentGrid" Grid.Row="1">

    <HyperlinkButton Content="HyperlinkButton"

                            Height="30" HorizontalAlignment="Left"

                            Margin="230,217,0,0" Name="hyperlinkButton1"

                            VerticalAlignment="Top" Width="200"

                            NavigateUri="/urun/1"/>

</Grid>

Kodumuzda basit bir HyperlinkButton kullanarak tek yapmamız gereken NavigateUri özelliğine istediğimiz Uri'yi vermek. Örneğimizde /Urun/1 adresini verdiğimiz bu adres UriMapper tarafından /Sayfalar/Page1.xaml?ID=1 şekline çevrilecek ve uygulama ekranında Page1.XAML'ı 1 ID değerini almış olarak göreceğiz. Eğer bu yönlendirme işlemini doğrudan bir kod ile yapmak isterseniz aşağıdaki gibi yine NavigationService üzerinden Navigate metodunu kullanarak Frame'i yönlendirebilirsiniz.

[C#]

        private void button1_Click(object sender, RoutedEventArgs e)

        {

            this.NavigationService.Navigate(new Uri("/urun/2", UriKind.Relative));

        }

Hepinize kolay gelsin.

Monday, May 03, 2010 5:18:19 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4 | Windows Phone 7  | 
 Sunday, May 02, 2010

Windows Phone 7'nin ilk duyurularında yapılan açıklamalarda özellikle WP7 ile çalışacak cihazlarla ilgili bazı şartların yerine getirilmesi gerektiğinin açıklanması çok sevindirici oldu. Bu şartlardan biri de cihazların WVGA (800x480) 4 point multitouch capacitive ekrana sahip olmaları şartıydı. Bu şartın WP7 yayınlanana kadar var olmaya devam edip etmeyeceğini bilemeyiz ama şimdiden WP7 dünyasında Silverlight ile Multitouch programlamaya ufak bir giriş yapabiliriz.

WP7 için yayınlanan Developer Tools paketini bilgisayarınıza yüklediğinizde yanında gelen emülatör aslında Multitouch emülasyonunu da bir anlamda destekliyor. Eğer emülatörü çalıştırdığınız sistem bir Windows 7 ise ve hali hazırda donanım / bilgisayar multitouch bir ekrana sahipse bu doğrudan emülatör üzerinde de WP7 arayüzünde Multitouch özelliklerini kullanabileceğiniz anlamına geliyor. Böylece rahatlıkla development ortamınıza da sahip olabiliyorsunuz. Bu yazımıda WP7 üzerindeki Silverlight'ın Multitouch yaklaşımına ayrıca göz atmamız gerekecek çünkü normal Silverlight Multitouch API'lerinden farklı olarak şu anki mobil ortamda Silverlight kabaca WPF'e çok daha yakın API'ler sunuyor. Özellikle Silverlight 3 veya 4'teki gibi kendi ManipulationProcessor'ınızı yazmanıza gerek kalmaması çok hızlı sonuçlar almanızı sağlıyor.

[XAML]

<Grid ManipulationDelta="ContentGrid_ManipulationDelta"  x:Name="ContentGrid" Grid.Row="1">

    <Image RenderTransformOrigin="0.5,0.5" Height="254" HorizontalAlignment="Left" Margin="70,66,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="336" Source="/WindowsPhoneApplication1;component/Images/Koala.jpg" >

        <Image.RenderTransform>

            <TransformGroup>

                <ScaleTransform x:Name="ImageScale" />

                <TranslateTransform x:Name="ImageTranslate" />

            </TransformGroup>

        </Image.RenderTransform>

    </Image>

</Grid>

Yukarıdaki XAML kodu örnek uygulamamızın ana ekranındaki Content kısmını temsil ediyor. Hemen projemize bir resim ekledikten sonra onu gösterecek Image kontrolünü de sahneye alıyoruz. Image nesnemizle ilgili pozisyon ve boyut değişikliği yapacağımız için uygun Transform nesnelerini de gruplayarak RenderTransform özelliğine atıyoruz. Böylece bu Transform'lara verdiğimiz isimlerle kod kısmından ulaşarak rahatlıkla resmin boyutunu ve konumunu değiştirebileceğiz. Dikkat edilmesi gereken nokta Touch durumunu yakalamak istediğiniz kontrolün ManipulationDelta event'ında bir listener ataçlamak. Peki nedir bu ManipulationDelta? Aslında bu otomatik olarak arka planda çalışan manipulasyon işlemi sonrasında gerekli hesaplamalar da yapıldıktan sonra çalışacak olan event. Böylece biz TouchPoint'ler arası koordinat değişikliklerinden kaynaklanan hesaplamaların sonuçları elde edildiğinde haberdar edileceğiz. Söz konusu event'ın argümanları üzerinden de hesaplamaların sonuçlarını alabileceğiz.

[C#]

        private void ContentGrid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)

        {

            if (e.CumulativeManipulation.Scale != null)

            {

                ImageScale.ScaleX = e.CumulativeManipulation.Scale.X;

                ImageScale.ScaleY = e.CumulativeManipulation.Scale.Y;

            }        

 

            ImageTranslate.X = e.CumulativeManipulation.Translation.X;

            ImageTranslate.Y = e.CumulativeManipulation.Translation.Y;

 

            e.Handled = true;

        }

Eventimiz içerisinde kod sanırım daha basit olamazdı! Argüman üzerinden gelen CumulativeManipulation nesnesi içerisinde tüm yeni hesaplanmış değerler bulunuyor. Tek yapmamız gereken özünde bu değerleri elimizdeki uygun nesnelere transfer etmek. Scale konusunda bir if kontrolü olduğunu göreceksiniz. ManipulationDelta eventı kullanıcı tek TouchPoint ile birşeyler yaptığında da çalışıyor. Yani kullanıcı tek parmağı ile birşeyleri sadece yerinden oynatıyor da olabilir. Böyle bir durumda Scale özelliği tabi ki null geliyor fakat Translation dolu gelmeye devam ediyor. Bu nedenle bir if kontrolü ile durumu kontrol altında tutmak mantıklı olabilir.

Hareket ve hız algılama!

Touch telefonlarda oluşan alışkanlıkardan biri de ekranda tek parmak ile sağa, sola doğru çizgiler oluşturarak aslında ekrandaki görseli ekranın sağına veya soluna itme hareketidir. Bu gibi bir işlevsellik için yine Manipulation sistemi kullanılabilir fakat bu sefer ManipulationDelta yerine ManipulationCompleted event'ına bir listener ataçlayabiliriz. Böylece tüm Manipulation işlemi bittiğinde son sonucu toplam olarak alabiliriz.

[C#]

        public MainPage()

        {

            InitializeComponent();

            this.ManipulationCompleted += new EventHandler<ManipulationCompletedEventArgs>(MainPage_ManipulationCompleted);

        }

 

        void MainPage_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)

        {

            if (e.FinalVelocities.LinearVelocity.X > 1000 && e.FinalVelocities.LinearVelocity.Y > 500)

            {

                SolaGit.Begin();

            }

        }

Yukarıdaki kod içerisinde ManipulationCompleted'da argüman üzerinden kullanıcının yaptığı hareketin hızını vektör olarak alıyoruz. FinalVelocities altında yer alan LinearVelocity özelliğinin X ve Y değerlerini kontrol ederek hangi yöne hangi hızda hareket yapıldığını kontrol edebilirsiniz. Yapılan hareketin yönüne ve hızına göre de farklı bir animasyon çalıştırılarak ekranda uygun değişiklikler yapılabilir.

Bu yazımızda hızlıca WP7 üzerinde Silverlight tarafındaki Touch API'lerine giriş yaptık. Özellikle WPF'e benzemesi ile API'ler çok tanıdık. Diğer yandan kişisel bir yorum olarak özellikle WP7'ye özel eklenen API'lerin isimlendirilmelerinden yola çıkarak üzerlerinde son sürüme kadar epey değişiklik olacağını da tahmin etmek zor değil.

Hepinize kolay gelsin.

Sunday, May 02, 2010 12:10:48 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4 | Windows Phone 7  | 
 Saturday, May 01, 2010

Windows Phone 7 için developer araçları bir süre önce MIX konferkansında duyurulmuştu. Bu yazımızda söz konusu araçlara bir giriş yaparak WP7 ortamında Silverlight'ın durumuna genel bir bakış atacağız. İlk olarak tabi ki WP7 development yapabilmemiz için bilgisayarımıza yüklememiz gereken araçlar söz konusu. Bunlardan ilki Visual Studio'nun bir türevini içerisinde Phone7 için özel bir Visual Studio Express sürümü.

Windows Phone Developer Tools CTP

Yazılım geliştirme tarafı için Developer Tools yeterli olurken tasarım noktasında tabi her zamanki gibi Expression Blend'e ihtiyacımız olacak. O nedenle şu anda elde bulunan seçenek ancak Blend 4 RC üzerine aşağıdaki yüklemeleri yapmak.

Expression Blend Add-in Preview 2 for Windows Phone
Expression Blend Software Development Kit (SDK) Preview 2 for Windows Phone

Gerekli yüklemeleri tamamladıktan sonra sisteminizde Visual Studio 2010 haricinde bir de "Visual Studo 2010 Express for Windows Phone" bulunacaktır. Yazılımın özellikle Express olarak adlandırılmasının anlamlı bir nedeni var. WP7 için hem Blend hem de Visual Studio tarafı yazılımlar son haline geldiğinde dahi tamamen ücretsiz olarak dağıtılacak. Böylece yazılım geliştiriciler rahatlıkla bu platforma geçiş yapabilecekler.

File / New Project dediğimizde....
File / New Project dediğimizde....

Yüklemeleri bitirdiğiniz gibi ilk yapacağınız şey tabi ki hemen "File / New Project" menüsüne gitmek olacak. Windows Phone 7 için development ortamı olan Visual Studio sürümünde File / New Project dediğimizde karşımıza iki seçenek geliyor. Bunlardan biri Silverlight, ikincisi ise XNA. Gördüğünüz üzere başka herhangi bir seçenek de yok. Konunun özüne dönersek Windows Mobile 6.x sürümlerinde çalışan hiçbir uygulama WP7'de çalışmayacak ve aynı tarz ile uygulama geliştirilemeyecek. İtiraf etmek gerekirse bu epey radikal bir hareket fakat bir o kadar da anlamlı ve güzel. İleriki adımlarda ilk uygulamamızı yarattığımızda da göreceksiniz ki Microsoft'un bu platformda yapmaya çalıştığı şey aslında herşeyi biraz daha düzene sokup, kuralları da belirleyerek toplam kullanıcı deneyimi kalitesinin artmasını sağlayacak şekilde yazılımcı ve tasarımcıları yönlendirmek. Bu yeni "New Project" penceresi aslında bize şu mesajı veriyor; "WP7 için uygulama geliştirecekseniz tek platformunuz Silverlight, eğer Oyun geliştireceksiniz platformunuz XNA!"

Ufak bir kişisel deneyim paylaşımı....

İlginç bir alt başlık attığımın farkındayım. Şimdi yukarıdaki manzaraya baktığımızda en azından biliyoruz ki XNA için Hardware Acceleration şart. Aynı şekilde WP7'de Silverlight ta bu HW'a sahip. Fakat acaba nasıl? Gerçekten güzel olacak mı? gibi sorular eminim ki içinizi kemiriyordur (en azından benim öyleydi). Son Amerika ziyaretimde aslında pek de yeni bir ürün sayılmayacak Zune HD'lerden satın aldım. İlk fırsatta onunla ilgili de bir inceleme yayınlamayı düşünüyorum blogumda. Zune HD hali hazırda NVIDIA'nın Tegra chipseti ile gelen Multitouch Capacitive ekrana sahip ilginç bir cihaz. En güzeli ne? Üzerinde XNA oyunları çalışıyor! Keşke ülkemizde de Zune HD satışı olsaymış Avrupa'da bile maalesef belirli ülkelerde var. Özetle çok uzatmadan hikayeyi şöyle özetliyim, cihazın ne kadar rahat ve yüksek performans ile XNA oyunlarını çalıştırdığını emin olun tahmin edemezsiniz. Ben ilk denediğimde ağzım açık kaldı ve işte o an! Windows Phone 7'ye inanmaya başladım! WP7 sadece telefon özelliği eklenmiş bir Zune HD bile olmaz emin olun çok büyük ses getirecek! Cümlelerle anlatmak zor fakat ümidinizi kaybetmeyin! ;)

İlk WP7 projemiz....

İlk WP7 projemizde "Windows Phone Application" proje şablonunu kullanacağız. Diğer şablonlardan biri zaten klasik Class Library diğeri ise bazı hazır kodlar da içeren ve sisteme hızlı göz atmanızı sağlayan sample şablon gibi birşey özünde. İçi en boş olan şablon "Windows Phone Application" ile başladığımızda karşımıza her zaman alıştığımız XAML kodunun yanında da "Preview" ekranı geliyor. Tabi bu sefer Preview ekranı biraz farklı çünkü malum bir telefon uygulaması geliştiriyoruz ve bu nedenle Visual Studio da bize tasarımı bir telefon ekranında gösteriyor. Hatta ekranda gördüğümüz yazıların da sanki renkleri büyüklükleri vs ayarlı gibi duruyor değil mi? İşte WP7 ile gelen tasarım şablonu aynen bu şekilde. Genelde beklenen tüm uygulama geliştiricilerin bu tasarım öğelerine istisnalar hariç olabildiğince sadık kalmaları. Böylece ne gibi uygulama geliştirilerse geliştirilsin tüm uygulamalar özellikle son kullanıcı tarafından bir sistemin parçası şeklinde algılanabilecek. Yarattığımız bu yeni projede bulunan bütün renkler ve stiller uygulama içerisinde Resource olarak App.Xaml içerisinde duruyor.

[App.Xaml]

 ......
xmlns
:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Navigation">

<Application.RootVisual>

    <phoneNavigation:PhoneApplicationFrame x:Name="RootFrame" Source="/MainPage.xaml"/>

</Application.RootVisual>
........

App.xaml içerisinde önemli kısımlardan bir tanesi yukarıda. Koddan da anlaşılabileceği üzere aslında uygulama WP7'de ilk başlatıldığında açılacak XAML dosyasının XAP içerisinde Uri'siniz burada vermeniz gerekiyor. Özünde XAML koduna daha da dikkatli bakarsak sanki SL'deki Navigation API gibi birşeyler var değil mi? Çünkü normal SL uygulamalarında biz RootVisual olarak bir UserControl verirken burada PhoneApplicationFrame adında bir nesne verilmiş ve söz konusu nesnenin de başlangış Source'u MainPage.Xaml olarak gösterilmiş. Aynı Navigation API mantığı ;) Zaten en üstteki XMLNS tanımında kullanılan Assembly'den de bunun sadece Phone uygulamalarına özel olduğunu görebiliriz.

WP7'de boş bir Silverlight projesi.
WP7'de boş bir Silverlight projesi.

Yarattığımız bu sıfır projeye şöyle genel bir bakacak olursa içerisinde alıştığımız Silverlight uygulamalarında farklı olarak Background.png ve ApplicationIcon.png gibi iki resmin olduğunu görüyoruz ilk aşamada. Bu PNG'lerden biri uygulaman telefon içerisinde programlar listesinde gözükecek ikonuyken diğeri ise eğer uygulama telefonun ana ekranına pinlenirse gözükecek olan ikon oluyor. Bir diğer ek gelen dosya ise yine WP7'ye özel uygulama özelliklerine ait ayarların saklı olduğu WMAppManifest.xml dosyası. Bu dosya ile ilgili ayarları aslında projesine sağ tıklayarak gelen menüden "Properties"i seçerek de yapabilirsiniz.

Proje özellikleri.
Proje özellikleri.

WP7 için yaratılan bir SL projesinin özellikleri baktığımızda şu anda tek garip gelen seçenek "Supports central settings" seçeneği oluyor. Nedir acaba bu? Şu an için bu özellik MIX ile beraber duyurulan Developer Tools ve Runtime'a dahil edilmiş değil. Fakat ileride uygulama içerisindeki bir "Ayarlar" sayfasının doğrudan telefonun kendi "Settings" menüsüne eklenmesini sağlayacak olan Chechbox şimdiden karşınızda diyebiliriz. Hatta işaretlediğiniz şu anda simülatör'de de uygulamanızı telefonun ayarlar sayfasında görebiliyorsunuz fakat şimdilik sadece ismi gözüküyor.

Uygulamayı çalıştırırken...

Uygulamanızı geliştirirken her zamanki Silverlight bilginizi kullanabilirsiniz. Hiçbir farkı yok. Çalıştırırken ise tabi ki bir WP7 simülatörüne ihtiyacınız olacak. Simülatör zaten Developer Tools ile birlikte bilgisayarınıza yüklenmiş oluyor o nedenle hemen F5'e basarak uygulamayı çalıştırabilirsiniz. Simülatörü her defasında kapatmanıza gerek yok, Visual Studio'dan da Debug'ı durdurup sonra aynı simülatör kopyasını kullanmaya devam edebilirsiniz. Bu noktada dikkat etmeniz gereken ufak bir detay var. Simülatör hali hazırda aslında bir sanal makine yani :) yani aslında bir simülatör değil sanallaştırılmış bir WP7 işletim sistemi çalıştırıyorsunuz test esnasında. O nedenle eğer bir sanal makine kullanıyorsanız sistem çalışmayacaktır :( Test fiziksel bir makineye geçmeniz gerekecek ve unutmayın tüm bunlar yayınlanmamış ürünler o nedenle normal kullandığınız işletim sistemi kopyalarına da yüklememenizde büyük fayda var.

Simülatörü seçerek ilerleyebilirsiniz.
Simülatörü seçerek ilerleyebilirsiniz.

Expression Blend tarafında neler oluyor?

Expression Blend de kendi tarafında tabi ki WP7 desteği ile geliyor. Özellikle App.xaml içerisinde gelen stillere sahip kontrolleri sahneye yerleştirme konusunda Blend'in sağladığı kolaylıklar vazgeçilemez şeyler. Artık bildiğiniz tüm Silverlight animasyonlar ve herşey bire bir aynı şekilde WP7 üzerinde de çalışıyor.

Expression Blend 4 içerisinde WP7 desteği.
Expression Blend 4 içerisinde WP7 desteği.

Önümüzdeki dönemde sizlerle WP7 üzerinde SL development konusunda makalelerimi paylaşmaya devam edeceğim fakat tüm bu süreçte unutmamamız gereken bir nokta var. WP7 şu anda hala bebek yaşlarını yaşıyor hatta belki de cenin :) o nedenle özellikle Silverligt dünyasında daha önce deneyimi olanlara söylemem gerek ki karşılaşacağınız eksikler olacaktır ve bunların hepsinin son yayınlanan sürümde toparlanacağı söylemi söz konusu. O nedenle şimdilik bu yapıyı bir "oyun alanı" olarak değerlendirmeniz ve ileriki sürümlere kadar deneyim edinme amacıyla kullanmanız doğru olur.

Hepinize kolay gelsin.

 

 

Saturday, May 01, 2010 12:17:45 PM (GTB Standard Time, UTC+02:00)  #    Comments [5]   Silverlight 4 | Windows Phone 7  | 
 Tuesday, April 27, 2010

Son iki gündür Isparta, Süleyman Demirel Üniversitesi'ndeyim. Isparta'ya neredeyse her yıl gider oldum :) Tabi burada öğrencilerin ilgisi çok önemli ama bir o kadar da öğretim görevlileri! Özellikle sevgili Mehmet Albayrak hocama buradan tekrar teşekkür etmek istiyorum. Dikkat ediyorsanız ilk defa bir postuma teşekkürle başlıyorum :) Çok üniversite ziyaret ettim, biliyorsunuz. Bazen karşılaştığım eğitim görevlisi hocalarımızla konuştukça "Off burada öğrenci olmak vardı" diyesim geliyor. İşte Mehmet hocamız da bana bu duyguyu yaşatan hocalardan. İnsanın tekrar öğrenci olası geliyor...

Isparta, Süleyman Demirel Üniversitesi
Isparta, Süleyman Demirel Üniversitesi

Konumuza dönersek :) Isparta'da iki gün geçirdim, malum artık Isparta yeni bir yer değil benim için :) Fakat bu sefer üniversitede farklı birşeyler yaptık. İlk gün üç oturumla "Visual Studio 2010 ve .NET Yenilikleri", "Silverlight 4" ve "Windows Phone 7 Development" anlattım. (Biliyorum, biliyorum! WP7 içeriğini bloga da ekleyeceğim az kaldı :))  İkinci gün ise bir LAB çalışması gerçekleştirdik. Sabahtan başlayarak yaklaşık 75 öğrenci kardeşimle laptoplarını çalışır hale getirip :) güzel bir Silverlight ve Data Lab'ı gerçekleştirdik. Tabi bu LAB süresince sevgili MSP, Ahmet Ali Süzen'in asistanlığı ÇOK değerliydi! Yoksa 75 kişi lab nasıl olur :) Ahmet'e de buradan binlerce teşekkür! Siz de tavsiyem Isparta'daysanız Ahmet'e yapışın ;) şehrinizin SL Kahramını'dır kendisi ;) Çekin kenara zorla anlattırın ;)

Isparta Geceleri :)
Isparta Geceleri :)

Bu da Isparta'da geçirdiğim gece dolunay fotoğrafım :) Paylaşmadan edemedim. Bir ara böyle fotoları paylaşacağım bir site planlıyorum bakalım hayırlısı :)

Tuesday, April 27, 2010 7:21:58 PM (GTB Standard Time, UTC+02:00)  #    Comments [9]   .NET Framework 4.0 | Silverlight 4 | Visual Studio 2010 | Windows Phone 7  | 
 Thursday, March 25, 2010

Sevgili Tayfun Akçay bir süre önce TechTalk PostCast serisine başladı. Serinin en keyifli yanı Tayfun'un PodCast'lerini arabada çekiyor olması :) Böylece hem Tayfun için araba kullanırken geçen zamanı değerlendirme adına faydalı oluyor hem de izleyiciler için keyifli bir bilgi paylaşım alanı oluşuyor. Geçen iki günde ben de Ankara'da Microsoft'un "Architect Advisor" ve "BizSpark" eğitim serilerinde konuşmacıydım ve Tayfun'un arabasına konuk oldum :) Eh hazır ortam yaratılmışken sohbetimizi de kayıt altına alalım diyince ortaya bir TechTalk daha çıktı :)

Tayfunu hem fikri hem de emeği için kutluyorum. Umarım çok daha uzun bir süre bu seriyi kazasız belasız devam ettirir ;)

İyi seyirler...

Thursday, March 25, 2010 11:26:42 AM (GTB Standard Time, UTC+02:00)  #    Comments [6]   IE 9 | OData | Silverlight 4 | Visual Studio 2010 | Windows Phone 7  | 
 Tuesday, March 16, 2010

Son birkaç gündür Twitter üzerinde beni takip edenler biliyorlar Microsoft'un yıllık MIX konferansı için Las Vegas yollarındaydım. Las Vegas konusunda şimdilik ek bir yorum yapmayacağım :) merak edenler geçen seneki yazımı okuyabilirler. Bu seni benim için ilginç olan yolculukta karşılaştığım sorunlar oldu. Uzun süredir yurt içi ve yurt dışı bir çok uçak seyahati yapıyorum ve sürekli etrafımdaki dostlardan karşılaştıkları sorunları dinler ve şaşırırdım. "Valla benim başıma hiç böyle sorunlar gelmiyor" derken :) Las Vegas seyahatimde çok garip şeyler oldu. Şimdi konuya şuradan başlayalım, toplam iki aktarma ile Istanbul-Amsterdam, Amsterdam-Detroit ve Detroit-LasVegas şeklinde ard arda uçuşlarım vardı. "Vardı" diyorum çünkü üçüncü uçuşun peronuna gittiğimde görevlilerden aldığım cevap "Siz bu uçuşta yoksunuz" şeklinde oldu :) Eh be kardeşim ben iki bağlantılı şekilde satın aldığım bir seri biletin üçüncü ayağında nasıl yok olurum? :) Sanırım Transaction'da bir sorun olmuş veritabanında :D Allah'tan Rollback yapmamışlar yoksa İstanbulda kalacaktım herhalde :P Şaka bir yana durumun garipliğini hava yolu şirketi yetkilileri de anlayınca benim son uçuşumu tekrar ayarlamak gerektiğini söylediler. Ha ama bu arada benim bagaj çoktan uçağa binmişti :) ve malum benden önce Las Vegas'a vardı.

Gün 1 Keynote başlangıcı!
Gün 1 Keynote başlangıcı!

Her neyse çok uzatmiyim, Allah'tan MIX'ten bir gün önce Las Vegas'ta olacak şekilde planlamıştım herşeyi. Neden mi? Benim Detroit Las Vegas uçuşunu bir sonraki güne bıraktılar. Başka uçuş yokmuş. Güzel güzel geceyi Detroit'te geçirdim. Sonraki gün öğleden sonra olan uçağı fırsat bilip arada Detroit'te Henry Ford Müzesini bile gezdim :) Pazar akşamı 8'de RD partimiz vardı ve uçağım 7'de şehre indi. Herşeye rağmen partiye bile yetiştim ;)

Sanırım bu kadar geyik yeter :) Gelelim MIX'in ilk gününe. İlk gün ciddi anlamda efsanevi geçti diyebilirim. Benim için çok heyecan verici olmadı :) çünkü MIX'te gösterilen çoğu şeyi zaten en son MVP Summit'te görmüştüm fakat tabi paylaşamıyordum. Artık herşey alenen ortada olduğuna göre süper haberlerim var sizlere!!!

Silverlight 4 ile gelenler....
Silverlight 4 ile gelenler....

Silverlight 4 RC (Release Candidate)

Doğru okudunuz :) Silverlight 4 RC oldu! Yani artık Beta değil tabi daha tam olarak release de olmadı. Fakat RC olması güzel bir gelişme. Bu süreçte bir sürü değişiklik ve yenilikler var. Bunların detaylarını çok yakında blogdan sizlerle tek tek paylaşıyor olacağım. En önemli haberlerden biri ise Silverlight 4'ün önümüzde ay içerisinde çıkacak olması! Yani son halini alacak! Release olacak! Bir diğer güzel haber ile Silverlight 4 ile beraber WCF RIA Services'in da release olacağının kesinleşmesi. Tüm bu senaryoda hemen SL 4 RC'yi bilgisayarınıza yüklemek istiyorsanız öncesinde bir Visual Studio 2010 RC edinmeniz gerekiyor. Sonrasında aşağıdaki linklerden hem Silverlight 4 Tools paketini hem de SL 4 RC destekli Blend sürümü olan Blend 4 Beta'yı indirebilirsiniz.

Silverlight 4 RC Tools for Visual Studio 2010 RC
Blend 4 Beta for Silverlight 4 RC

Blend 3 sahibi olanlara Blend 4 BEDAVA!

Günün en ilginç haberlerinden biri de buydu. Aslında epey ilginç haberler var :) ama Blend 4 yeni bir sürüm olarak gelecek olsa da Blend 3 lisansına sahip herkese ücretsiz verilecek olması bence güzel bir hareket! Siz ne dersiniz? Malum Blend 4 hem WPF 4 hem de Silverlight 4 desteğine sahip olarak release olacak ve içerisinde güzel yenilikler de var ;)

Silverlight Mobile
Silverlight Mobile

Silverlight for Windows Phone 7

Sonunda!!! Sonunda Silverlight mobil dünyaya zıplıyor. Windows Phone 7 üzerinde Silverlight ve XNA çalışıyor olacak. Hatta daha iddialı bir bakış açısı ile Windows Phone 7 üzerinde ana uygulama geliştirme platformu Silverlight olacak diyebilirim. Bu konuda şimdilik çok detaylara girmesem de en azından şunu söylemek istiyorum. Silverlight Windows Phone 7'de tarayıcı içerisinde çalışmayacak! işletim sisteminde bir uygulama olacak çalışacak! Şu anda WP7 cihazlar olmasa da tüm developer / designer araçları ve simülatörler MIX'in ilk günü itibari ile downloada açıldı! Aşağıdaki adresten indireceğiniz Developer Tools ile Mobile Silverlight dünyasına yelken açabilirsiniz.

Windows Phone Developer Tools CTP

Blend 4 tarafında da Blend 4 Beta'yı indirdikten sonra üzerine aşağıdaki yüklemeleri yaparsanız Blend 4 içerisinde de Windows Phone 7 uygulamalarınızı tasarlayabilirsiniz.

Expression Blend Add-in Preview for Windows Phone
Expression Blend Software Development Kit (SDK) Preview for Windows Phone

Ve süper bir haber daha !!! Windows Phone 7 Development için özel Blend ve Visual Studio sürümüleri ile development ve design araçları ÜCRETSİZ OLACAK!

Tüm bu haberlerle birlikte artık heyecanla ikinci gün Keynote'u bekliyorum! Benim tahminim Internet Explorer 9'la ilgili sürprizler olacağı üzerine ;) Bakalım zaman gösterecek.

Tuesday, March 16, 2010 7:52:26 AM (GTB Standard Time, UTC+02:00)  #    Comments [11]   Silverlight 4 | Windows Phone 7  | 
Copyright © 2010 Daron Yöndem. Tüm hakları saklıdır.