Makale Özeti

Silverlight 3.0 Beta ile beraber artık kullanıcıların Silverlight uygulamalarımızı tarayıcı dışına taşımasını da sağlayabiliyoruz. Tüm bu altyapı ile ilgili detayların yanı sıra tarayıcı dışı uygulama senaryolarında ihtiyacınız olacak yapılara da değiniyoruz.

Makale

Silverlight 3.0 Beta ile beraber gelen ilginç özelliklerden biri de herhangi bir Silverlight uygulamasını doğrudan masaüstüne alabiliyor olmamız. Gelin öncelikle hızlı bir demo ile yeni yarattığımız bir uygulamayı nasıl masaüstüne aldığımıza ve nasıl gözüktüğüne bakalım.

Yeni bir Silverlight uygulaması yarattıktan sonra tarayıcı içerisinde bu uygulamayı çalıştırıp üzerine farenizin sağ tuşu ile tıklarsanız gelen menüde ilginç bir komut dikkatinizi çekecektir.

Install onto this computer?
Install onto this computer?

Gördüğünüz üzere komutun anlamı aslında epey açık :) diyor ki "Bu uygulamayı bilgisayarına yükle!" Tabi şu an için bu komut kullanılamıyor çünkü aktif değil. Gelin hemen bu komutu nasıl aktif hale getirebileceğimize göz atalım.

AppManifest dosyamız burada.
AppManifest dosyamız burada.

Visual Studio içerisinde Solution Explorer'dan uygulamanızın AppManifest.xml dosyasına erişmemiz gerekiyor. Bunun için ilk olarak hemen Solution Explorer penceresinin en üstündeki ikinci düğme olan "Show all files" düğmesine tıklıyoruz ve "My Project" altında Manifest dosyamızı bulup açıyoruz.

[AppManifest.xml]

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"

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

>

    <Deployment.Parts>

    </Deployment.Parts>

 

    <!-- Uncomment the markup and update the fields below to make your application offline enabled

    <Deployment.ApplicationIdentity>

        <ApplicationIdentity

            ShortName="Out of Browser Silverlight Application"

            Title="Window Title of Your Silverlight Application">

            <ApplicationIdentity.Blurb>Description of your Silverlight application</ApplicationIdentity.Blurb>

        </ApplicationIdentity>

    </Deployment.ApplicationIdentity>

    -->

</Deployment>

Yukarıdaki manifest dosyasının içeriğini görebilirsiniz. Bu dosya içeriğinde "yorum" satırı olarak yerleştirilmiş olan yeşil kısımlar aslında uygulamanın "Out Of Browser" yani "Tarayıcı Dışı" moduna alınabilmesini sağlayacak olan kodların ta kendisi. Basit bir şekilde buradaki kodları yorum olmaktan çıkarmamız uygulamamızın tarayıcı dışına taşınabilmesini sağlayacaktır. Tabi bu süreçte var olan XML kodlarının anlamına da bir göz atalım.

[AppManifest.xml]

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"

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

>

    <Deployment.Parts>

    </Deployment.Parts>

 

    <Deployment.ApplicationIdentity>

        <ApplicationIdentity

            ShortName="Uygulama adı uraya gelir!"

            Title="Uygulama penceresinde gösterilecek metin burada!">

            <ApplicationIdentity.Blurb>Uygulamanın uzun uzun tanımı, açıklaması da buraya gelecektir.</ApplicationIdentity.Blurb>

        </ApplicationIdentity>

    </Deployment.ApplicationIdentity>

 

</Deployment>

ApplicationIdentity XML tagları aslında uygulamanızın kimliğini tanımlayacaktır. Bu kimlik tabi ki son kullanıcı tarafından farklı noktalarda uygulamanızın adını vs özelliklerini yansıtacak bilgileri barındırıyor. Örneğin ShortName özelliğine uygulama adını kısaca yazıyoruz, Title özelliğinde ise uygulama Windows içerisinde tarayıcı dışında çalıştırılırken sahip olacağı kendi penceresinin üstünde yazılacak metni tanımlıyor. Diğer yandan Blurb kısmında ise uygulama ile ilgili açıklayıcı bilgilere yer veriyoruz.

Tüm bu ayarları tamamladıktan sonra uygulamamızı çalıştırmanın zamanı geldi.

Uygulamamızı artık tarayıcı dışına alabiliyoruz!
Uygulamamızı artık tarayıcı dışına alabiliyoruz!

Artık uygulamamızın ekranında herhangi bir yere sağ tuş ile tıkladığımızda gelen menüdeki "Install" deyiminin bulunduğu komutun aktif olduğunu görebiliyoruz. Ayrıca bizim manifest içerisinde ShortName olarak tanımladığımız uygulama adının da hemen bu komut içerisinde uygun yere yerleştirildiğini gördük. Eh bu durumda söz konusu komuta tıklayalım bakalım neler oluyor.

Uygulamayı yükleme onay penceresi.
Uygulamayı yükleme onay penceresi.

Yükleme komutunu verdiğimiz anda karşımıza yukarıdaki ekran geliyor ve bizi manifest içerisinde Title olarak verdiğimiz değeri de gösterek söz konusu uygulamayı bilgisayarımıza yüklemek üzere olduğumuza dair uyarıyor. Yükleme süresince istersek uygulamanın birer kısayolunu masaüstüne ve/veya başlat menüsüne alabiliyoruz.

Yükleme işlemini onayladığımız gibi Silverlight uygulaması karşımıza normal bir Windows programıymış gibi geliyor. Kendi penceresine sahip, tamamen tarayıcıdan bağımsız olarak uygulamamız karşımızda.

Silverlight artık tarayıcının dışında!
Silverlight artık tarayıcının dışında!

Bu noktada dikkat etmeniz gereken noktalardan biri de uygulamanın penceresinde Title metninin yanı sıra uygulamanın yüklendiği adresin (bizim örneğimizde localhost) de aynı şekilde pencere adına eklenmiş olması. Böylece kullanıcılar her zaman uygulamayı hangi adresten yüklediklerine görebilecekler. Unutmayın artık uygulamamızın masaüstünde ve başlat menüsünde kısayolları var!

Silverlight uygulamamızın masaüstü ve başlat menüsünde!
Silverlight uygulamamızın masaüstü ve başlat menüsünde!

Yukarıdaki ekran görüntüsünde de görebileceğiniz üzere uygulamamızın bir kısayolu masaüstünde bulunuyor. Bu kısayolun adı manifest içerisinde ShortName. Aynı şekilde başlat menüsüne konan kısayolun adı da ShortName üzerinden gelirken bu kısayollar üzerinde fare ile durduğumuzda gelen açıklamada ise Blurb bilgisini görüyoruz. Artık Silverlight uygulamamızın söz konusu bilgisayarda internet bağlantısı olmasa da rahatlıkla bu kısayollardan çalıştırılabilecektir.

Eğer kullanıcılar bu programı bilgisayarlarından silmek isterlerse doğrudan programı çalıştırıp Silverlight uygulamasının üzerinde herhangi bir yerde sağ tuş ile gelen menüden  "Remove Application" komutunu seçmek durumundalar. Silverlight 3 Beta ile beraber gelen bu özellik ile bilgisayarlara yüklenen Silverlight uygulamaları Denetim Masası'nda "Program/Ekle Kaldır" bölümünde gözükmeyecektir.

Silvelright uygulamasının bilgisayardan kaldırmak isterseniz...
Silvelright uygulamasının bilgisayardan kaldırmak isterseniz...

Tüm bu manzara içerisinde belki de hemen değiştirmek isteyeceğiniz şeylerden biri uygulamanın her yerde gözüken varsayılan ikonu olacaktır. Hem masaüstündeki hem başlat menüsündeki hem de uygulama penceresindeki ikonların hepsini birden tek tek değiştirebiliyorsunuz.

Tek tek ayarlanmış logolar...
Tek tek ayarlanmış logolar...

Uygulamamızda kullanılmak üzere dört farklı boyutta logolar ayarlamamız gerekiyor. Bu logoların 16, 32, 64, 128 piksellik dosyalarını doğrudan PNG olarak kaydedebilirsiniz. Söz konusu dosyaları Silverlight projenize eklemek için Visual Studio içerisinde Solution Explorer'a sağ tıklayıp "Add Existing Item" diyebilirsiniz. Önemli olan tüm bu dosyaları projenize ekledikten sonra Build Action'larını Content olarak ayarlamanız.

PNG'lerinin hepsinin de Content olarak ayarlanması şart!
PNG'lerinin hepsinin de Content olarak ayarlanması şart!

Artık logolarımız hazır olduğuna göre geçip manifest dosyamızdaki ayarları yapabiliriz. Kabaca manifest dosyasında ApplicationIdentity tagına Icons adında bir seri ekleyip farklı boyutlar için hangi dosyaların kullanılması gerektiğini belirteceğiz.

[AppManifest.xml]

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"

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

>

  <Deployment.Parts>

  </Deployment.Parts>

 

  <Deployment.ApplicationIdentity>

    <ApplicationIdentity

        ShortName="Uygulama adı uraya gelir!"

        Title="Uygulama penceresinde gösterilecek metin burada!">

      <ApplicationIdentity.Blurb>Uygulamanın uzun uzun tanımı, açıklaması da buraya gelecektir.</ApplicationIdentity.Blurb>

      <ApplicationIdentity.Icons>

        <Icon Size="16x16">logo_16.png</Icon>

        <Icon Size="32x32">logo_32.png</Icon>

        <Icon Size="64x64">logo_64.png</Icon>

        <Icon Size="128x128">logo_128.png</Icon>

      </ApplicationIdentity.Icons>

    </ApplicationIdentity>

  </Deployment.ApplicationIdentity>

 

</Deployment>

Artık manifest dosyamızın son halini yukarıda inceleyebilirsiniz. Icons adındaki serinin içerisinde tek tek Icon'ları tanımladık ve her Size için ayrı ayrı hazırladığımız Content olarak uygulama içerisinde bulunan dosyaların adlarını verdik. Silverlight uygulamamızın bulunduğu sayfayı açıp uygulamayı masaüstüne kaydetmeye kalktığımızda artık bu ikonlar ile karşılaşacağız.

Yükleme esnasında özel logo! :)
Yükleme esnasında özel logo! :)

Uygulamanın kısayollarında özelleştirilmiş logolar...
Uygulamanın kısayollarında özelleştirilmiş logolar...

Uygulama penceresinde özel logo!
Uygulama penceresinde özel logo!

Here yere özel logolarımız geldiğinde göre artık uygulama kimliğini çok daha rahat bir şekilde müşteriye yansıtabiliriz. Hatta Windows Taskbar'da da söz konusu logomuz ayrıca gözüküyor.

Taskbarda özel logo.
Taskbarda özel logo.

Ya kullanıcılar sağ tıklamaz ise uygulamamıza?

Bu noktaya kadar hoş bir şekilde uygulamaya sağ tıkladık yükledik ve aynı şekilde sağ tıklayıp bilgisayarımızdan sildik. Diyelim ki silme işlemi çok önemli değil :) Kimsenin pek de uygulamamızı silmesini istemiyoruz fakat yükleme noktasında daha kolay bir kullanıcı deneyimi sağlamak zorundayız. İnsanların uygulamamıza sağ tıklayarak o yükleme komutunu keşfetlemelerini bekleyemeyiz. Böyle bir durumda basit bir şekilde uygulama içerisinde herhangi bir yere "Yükle" düğmesi koymak bile sorunumuzu çözebilir.

[VB]

        If App.Current.Detach Then

            MessageBox.Show("Oldu!")

        End If

Yukarıdaki kodu herhangi bir düğmenin arkasına yazabilirsiniz. App.Current.Detach metodu otomatik olarak daha önceki örneklerimizde gördüğümüz yükleme ekranını kullanıcının karşına getirecektir. Bu metod geriye bir Boolean döndürdüğü için kullanıcının yükleme işlemini yapıp yapmadığını da rahatlıkla öğrenebilirsiniz. Burada özellikle dikkat etmeniz gereken bir nokta var, App.Current.Detach metodunu kullanıcı tarafından başlatılmış metodlarda çağırabilirsiniz, yani Page.Load gibi istediğiniz yerlerde bu pencereyi açamazsınız :) Bilginize.

Derinlere dalalım!

Artık uygulamamızı kendi kendimize kod ile de tarayıcıdan bağımsız hale getirebiliyoruz fakat ortalık biraz karışık durumda. Kendi yarattığımız düğmeler aracılığı ile kod ile kullanıcı uygulamamızı masaüstüne alırsa biz de bundan haberdar olabiliyoruz fakat ya kullanıcı gibip sağ tuş ile gelen menüden uygulamayı bilgisayarına alırsa? Bazı durumlarda biz bundan da haberdar olmak isteyebiliriz. Peki neden mi haberdar olmak isteriz?

Unutmayın ki bir Silverlight uygulaması normal şartlarda Online çalışmak üzere hazırlanır ve programlanır. Örneğin veritabanından veri çekmek için sonuçta bir sunucuya bağlanırız. Uygulama masaüstüne alındıktan sonra ise Offline da çalışabilir hale geliyor. Yani artık Silverlight uygulamanız her çalıştığında internete erişimi olmayacak! Bu durumda bizim uygulamanın tarayıcı içerisinde mi çalıştırıldığını yoksa dışarıda mı olduğunu anlamamız gerekiyor. Diğer yandan uygulama tarayıcı dışında olabilir fakat internet bağlantısı da o an için makinede bulunabilir.

İnternet var mı?

İlk olarak gelin uygulama her nerede olursa olsun, ister tarayıcı içinde ister tarayıcı dışında, internet bağlantısının durumundan nasıl haberdar olabileceğimize bakalım. Söz konusu durumla ilgili bize bilgi verecek olan Event-Handler System.Net.NetworkInformation.NetworkChange olarak geliyor. Bu event'ı yakalayarak bir değişiklik olduğunda System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable komutu ile makinede net olup olmadığını anlayabilirsiniz.

[VB]

Partial Public Class MainPage

    Inherits UserControl

 

    Public Sub New()

        InitializeComponent()

        AddHandler System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged, AddressOf Network_NetworkAddressChanged

    End Sub

 

    Private Sub Network_NetworkAddressChanged(ByVal sender As Object, ByVal e As System.EventArgs)

        If System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable Then

            MessageBox.Show("NET VAR!")

        Else

            MessageBox.Show("yok")

        End If

    End Sub

End Class

[C#]

    public partial class MainPage : UserControl

    {

        public MainPage()

        {

            InitializeComponent();

            System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged +=

                new System.Net.NetworkInformation.NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged);

        }

 

        void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)

        {

            if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())

            {

                MessageBox.Show("NET VAR!");

            }

            else

            {

                MessageBox.Show("yok");

            }

        }

    }

Yukarıdaki kodumuzda ilk olarak sayfanın Init durumunda ihtiyacımız olan NetworkAddressChanged event'ını bağlıyoruz. Sonrasında ise söz konusu event her çağrıldığında GetIsNetworkAvailable ile internet bağlantısı olup olmadığını kontrol ediyoruz. Böylece siz de uygulamalarınızda İnternet bağlantısından haberdar olup farklı senaryolar oluşturabilir belki kullanıcılarının offline data üzerinde çalışabilmesini sağlayıp değişiklikleri de IsolatedStorage içerisinde bir süre için kaydedebilirsiniz.

Uygulamam nerede çalışıyor?

Silverlight uygulamalarımızı hiçbir değişiklik yapmadan masaüstüne taşıyabiliyor olsak da aslında uygulamanın masaüstündeki hali ile internet tarayıcı içerisinde hali arasında görsel anlamda farklılıklar da yaratmak isteyebilirsiniz. Özetle uygulamanızın tarayıcı içerisinde mi yoksa dışarısında mı çalıştırıldığını anlamanız gerekebilir. Bu gibi bir durumda basit bir şekilde App.Current.RunningOffline metodundan faydalanabilirsiniz. Bu metod size doğrudan bir Boolean döndürecektir. Eğer sonuç True olursa uygulamanın tarayıcı dışında, False olursa tarayıcı içerisinde olduğunu anlayabilirsiniz. Metodun ismi aklınızı karıştırmasın söz konusu metodun internet bağlantısı olup olmaması ile herhangi bir ilişkisi yok.

Update mekanizması ne durumda?

İnternet üzerinden bilgisayarına Silverlight uygulamamızı yüklemiz kişiler rahatlıkla offline olarak da çalışabilecekler fakat eğer biz sunucu tarafında bir değişiklik yapar ve Silverlight uygulamamızı değiştirirsek ne olacak? Aslında buradaki Update mekanizması .NET Framework içerisinde ClickOnce mekanizmasına çok benziyor. Silverlight uygulaması masaüstünden çalıştırıldığında hemen online olup olmadığını otomatik olarak kontrol ediyor ve eğer online ise webdeki sürüme bakıyor. Webdeki uygulama ile lokaldeli aynı ise zaten bir sorun yok demektir. Eğer webdeki daha yeni bir sürüm ise arkaplanda yeni sürüm bilgisayara indiriliyor ve uygulama tekrar çalıştırıldığında istemci tarafında artık yeni sürüm çalıştırılmış oluyor. Bu mekanizma bu şekilde ilerlerken biz de tabi ki bu işleyişten haberdar olabiliyoruz. Örneğin belki de yeni bir sürüm var ise kullanıcıyı uyarmak isteyebiliriz!

Uygulamanın update mekanizmasının işleyişinden haberdar olmak için Application (uygulama) bazındaki event'lardan birini kullanmamız gerekiyor. Söz konusu event'ın adı ExecutionStateChanged. Bu event'a tabi ki uygulama içerisinde App.XAML'ın arkasında kod dosyasından ulaşabiliyoruz.

[VB]

    Private Sub App_ExecutionStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ExecutionStateChanged

        If App.Current.ExecutionState = ExecutionStates.DetachedUpdatesAvailable Then

            MessageBox.Show("Yeni sürüm var lütfen uygulamayı baştan başlatın!")

        End If

    End Sub

[C#]

        public App()

        {

            this.Startup += this.Application_Startup;

            this.Exit += this.Application_Exit;

            this.UnhandledException += this.Application_UnhandledException;

            this.ExecutionStateChanged += new EventHandler(App_ExecutionStateChanged);

            InitializeComponent();

        }

 

        void App_ExecutionStateChanged(object sender, EventArgs e)

        {

            if(App.Current.ExecutionState== ExecutionStates.DetachedUpdatesAvailable)

            {

                MessageBox.Show("Yeni sürüm var lütfen uygulamayı baştan başlatın!");

            }

        }

App.xaml arkasında ExecutionStateChanged event'ı çalıştığı anda o anki uygulamanın ExecutionState'ini kontrol ediyoruz. Eğer ExecutionState DetachedUpdatesAvailable olarak geliyorsa demek ki yeni bir update var. Bu durumda kullanıcıya gerekli uyarıyı gösterebiliriz.

Arkaplanda neler oluyor?

Peki nasıl oluyor da bizim Silverlight uygulaması offline çalışıyor? Aslında konu epey basit. Herhangi bir Silverlight uygulaması Detach edildiğinde uygulamanın XAP dosyasının bir kopyası kullanıcının bilgisayarına alınıyor.

C:\Users\KullaniciAdi\AppData\LocalLow\Microsoft\Silverlight\Offline   

Yukarıda gördüğünüz yolda bulunan klasörün altına Silverlight uygulamasının bulunduğu alan adına ait bir klasör açılır ve söz konusu klasörün içerisinde XAP dosyası bir takım başka bilgilerle beraber kaydedilir.

Silverlight uygulaması diskte saklı.
Silverlight uygulaması diskte saklı.

Yukarıdaki ekran görüntüsünde de görebileceğiniz üzere XAP dosyamız orada duruyor. İçerisindeki ikonlarımızdan bir ico dosyası yaratılmış ve dışarıya yerleştirilmiş. Böylece işletim sisteminde tüm kısayollarda bu ico dosyası kullanılıyor. Uygulamamızı host eden bir de HTML var :) Bu HTML'i kim açıp bize gösteriyor kısmına birazdan geliriz. Onun öncesinde metadata dosyasının içeriğine bir bakalım.

[metadata]

LaunchPath=C:\Users\KullaniciAdi\AppData\LocalLow\Microsoft\Silverlight\Offline\localhost.1\index.html

CustomIcon=1

SourceDomain=localhost

OriginalUri=http://localhost:1559/ClientBin/SilverlightApplication29.xap

AppID=localhost.1

Description=Uygulamanın uzun uzun tanımı, açıklaması da buraya gelecektir.

Title=Uygulama penceresinde gösterilecek metin burada!

Name=Uygulama adı uraya gelir!

Gördüğünüz gibi uygulama içerisinde bazı manifest bilgilerimiz buraya da alınmış. Önemli noktalardan biri OriginalUri bilgisinde uygulamanın orijinal adresinin saklanıyor olması. Sistem bu bilgi üzerinden yeni sürüm kontrolü yapabiliyor. Peki tüm bunları kim çalıştırıyor? Silverlight Runtime kullanıcıların bilgisayarına yüklenirken beraber bir de sllauncher.exe adında bir program yükleniyor. Bu program aldığı parametreye göre bilgisayarda yüklü Silverlight uygulamalarını birer masaüstü uygulamasıymış gibi çalıştırabiliyor.

Hmm bu Adobe AIR değil mi?

Adobe tarafını takip edenlerin hemen soracakları ilk soru eminim ki "Bu Adobe AIR değil mi?" olacaktır. Hayır, değil. Neden mi? İlk olarak aradaki en büyük fark Adobe AIR için bilgisayarınıza ayrıca AIR Runtime yüklemek zorunda olmanız. Silverlight tarafında böyle bir durum yok. Hali hazırda yüklü olan Silverlight Runtime ile hayatınıza devam edebiliyorsunuz. İkinci en büyük fark ise Silverlight'ın bir masaüstü uygulaması haline dönüşse de hala tarayıcının güvenlik sınırlarında çalışıyor olması. Yani masaüstüne alsanız da bir Silverlight uygulaması masaüstündeki dosyalara kafasına göre erişemez, donanıma erişemez! Nasıl ki tarayıcı içerisinden sadece OpenFileDialog vs kullanarak dosyalara erişebiliyorsak masaüstüne alınmış bir Silverlight uygulaması da aynı şartlara tabidir. Özellikle donanım erişimi konusunda farklı senaryoların sertifikasyonlarla belki sağlanabileceğini söylese de Microsoft şu ana kadar resmi bir duyuru yok. Adobe tarafında AIR uygulamaları tam donanım erişimi ile çalıştığı için o tarafta sertifikasyon şart oluyor ve Silverlight'ın masaüstüne alınabildiği gibi bir tıkla kullanıcıya farklı bir deneyim sağlamak mümkün olmuyor. Diğer yandan Adobe tarafında update mekanizması için de ayrı bir SDK paketinde gelen sistemi kullanmak gerekiyor, oysa Silverlight 3.0 içerisinde söz konusu sistem entegre olarak geliyor.

Sonuç olarak baktığınızda Adobe elindeki teknoloji ile bir Windows uygulama geliştirme platformu oluşturmaya çalışırken Microsoft ise Windows tarafında WPF gibi zaten kendini kanıtlamış ve arkasında .NET Framework olan yapısını korurken web uygulamalarının rahatlıkla Offline kullanıma açılmasını hedefleyen ve çok kolay kullanılan bir yapıyı hedefliyor.

Kapanış!

Özünde Silverlight 3'ün bu özelliği ile çok ilginç senaryolar üretilebilir. Online ve Offline senaryoların beraber kullanımının çok daha rahat ve hoş bir kullanıcı deneyimi sağlayacağı kesin. Tüm bunları yapabilmek için de birkaç satır koddan ödeye geçmenize gerek kalmıyor.

Hepinize kolay gelsin!