Ana Sayfa | English Blog | Seminer TV | Dil Cookie Sil  Blog'u Mail ile takip et!       
Daron Yöndem - April, 2009
bir yazılımcının tasarıları...
 Wednesday, April 29, 2009

Bu hafta sonu için sizlere iki ayrı etkinlik duyurum var. Her ikisi de Ankara'da! Cumartesi günü SQL Kampı etkinliğimizin Ankara ayağını yapıyoruz, Pazar günü ise benim de konuşmacı olacağım NedirTV'nin 3. yıldönümü kutlama etkinliği olacak. Her ikisinin de planını aşağıda bulabilirsiniz.

02.05.2009 / SQL Kampı
09.30-10.30 Silverlight 3.0 ve İş Uygulamaları - Daron Yöndem
10.30-12.00 SQL 2008 Platform ve Development Yenilikleri - Tarık Kranda
13.00-15.00 Index Strategies and Performance Tunning - Pamir Erdem
15.30-17.00 IIS 7 üzerinde PHP ve MSSQL - Muammer Benzeş

03.05.2009 / NedirTV Günü
09:45-11.15 ASP.NET MVC - Uğur Umutluoğlu
11:30-13.00 What is SharePoint? - Burak Batur
14:00-15.30 WCF 4.0 & WF 4.0 - Burak Selim Şenyurt
15:30-16.30 WPF ve MultiTouch Programlama – Daron Yöndem

Her iki etkinlik de Bilkent Üniversitesi'nde gerçekleştirilecek. Merkez Kampüs Rektörlük Binası Mithat Çoruh Amfi Salonu'nda olacağız. Hepinizi bekliyoruz!

Not: Etkinlik sonrası "Haberimiz olsa gelirdik" diyen her birey saçımdan bir tel daha kopartıp üzerinde tepinmeme neden oluyor :) O nedenle sizden ricam etrafınızda bu etkinlik ile ilgilenebilecek herkesi haberdar etmeniz. Görüşmek üzere...

Wednesday, April 29, 2009 1:17:35 PM (GTB Standard Time, UTC+02:00)  #    Comments [1]   ASP.NET 3.5 | MultiTouch | Silverlight 3.0 | SQL Server 2008 | WPF  | 
 Tuesday, April 28, 2009

Bugün Muğla Üniversitesi'ndeydim. LINQ, WPF, Silverlight ve AJAX oturumları yaparak yine bir günde bolca bilgi paylaşımı gerçekleşti diyebilirim. Üniversitedeki gençlerin özellikle sınav sonrası olmasına rağmen seminerlerdeki enerjileri beni hayran bıraktı diyebilirim. Ne kadar şanslı olduklarını pek farkında değiller belki ama Visual Basit.NET gördükleri için bence çok ayrıcalıklılar :) Uzun süreden sonra ilk defa demolarımı rahat rahat VB ile yapabildim ve rezalet bir şekilde C# alışkanlıkları edinip VB'ye bulaştırmaya başladığımı gördüm :) Gereksiz toString'ler falan :) Her neyse...

Muğla üniversiteden mezun olan bir gencin VB.NET, ADO.NET ve SQL bilerek mezun olduğunu görmek beni çok sevindirdi. Bu üçlünün bir biri ile bağlantısını da kurduktan sonra aslında yapamayacağınız pek bir şey kalmıyor gibi. Üzerine bir de seminerlerimizdeki konuları eklerseniz süper yazılımcılar olacağınızdan emin olabilirsiniz.

Muğla Üniversitesi Seminerlerim
Muğla Üniversitesi Seminerlerim

Buradan etkinlikteki katkılarından dolayı Hasan Burak Öztürk kardeşim ve sevgili hocalarımıza çok teşekkür ediyorum. Umarım herkes için faydalı bir etkinlik olmuştur. ;)

Tuesday, April 28, 2009 8:43:29 AM (GTB Standard Time, UTC+02:00)  #    Comments [1]   AJAX | LINQ | Silverlight 3.0 | WPF  | 

Bugün Konya, Selçuk Üniversitesi'ndeydim. WPF MultiTouch, Silverlight 3.0 ve AJAX oturumları ile yoğun ve bir o kadar da eğlenceli bir gün geçirdik. Yine efsane potlar kırdım ama bu sefer yazdığım kodlarla :) Her neyse, konuya dönersek... Benim için biraz da duygusal bir buluşma oldu bu sene Selçuk Üniversitesi'ni ziyaretim. Geçen seneki ziyaretimde dördüncü sınıf öğrencilerinden bir grup cengaveri çok net hatırlıyordum. İşte o grup bir gördüm ki kendi şirketini kurmuş ve yurt dışında Outsource yazılım satıyor! İşte budur! Özellikle Anadolu üniversitelerini ziyaretimde gençlerin "Bu meslekte İstanbul'a gitmek lazım" şartlanmasının anlamsız olduğunu kanıtlayan bu örneği özellikle sizlerle buradan paylaşmak istedim.

Konya, Selçuk Üniversitesi Seminerlerim
Konya, Selçuk Üniversitesi Seminerlerim

Etkinlikteki katkılarından dolayı sevgili Serkan Cura'ya ve Nevzat Örnek hocamıza buradan çok teşekkür ediyorum. Umarım katılan herkese olabildiğince faydalı olmuştur. Seneye tekrar görüşmek üzere ;)

Monday, April 27, 2009 11:18:43 PM (GTB Standard Time, UTC+02:00)  #    Comments [4]   AJAX | MultiTouch | Silverlight 3.0 | WPF  | 
 Sunday, April 26, 2009

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!

Sunday, April 26, 2009 5:29:59 PM (GTB Standard Time, UTC+02:00)  #    Comments [2]   Silverlight 3.0  | 
 Saturday, April 25, 2009

Silverlight içerisinde tamamen kod ile çizim yapmanın ötesinde bazı durumlarda sıfırdan bir Bitmap oluşturmak da isteyebilirsiniz. Bazı durumlarda ise belki de elinizde var olan bir Bitmap nesnesini değiştirmek isteyebilirsiniz. Bu gibi durumlarda Silverlight 2.0 içerisinde derdimize derman olabilecek hazır bir API gelmezken artık Silverlight 3.0 içerisinde WriteableBitmap nesnesi bulunuyor. WriteableBitmap ile beraber istediğimiz Bitmap'i sıfırdan kod ile yaratabiliyoruz. Hatta bununla kalmayıp çok güzel şeyler de yapılabiliyor ama tüm bu güzel şeyleri görebilmek için biraz daha makeleyi okumaya devam etmeniz gerekecek :)

Hadi sıfırdan Bitmap yaratalım?

Sıfırdan bir Bitmap yaratmak demek aslında bir resim veya fotoğraf yaratırken her bir pikselde yer alacak renge karar vermek demektir. Bununla ilgili kullanabileceğiniz çok ilginç algoritmalar oluşturabilirsiniz. (Mandelbrot :)) Örneğin Quake1 zamanında 3D bir oyun olarak gözükse de özünde bu şekilde ekrana Bitmap'ler pompalayan bir yapıdan farklı bir mimarisi yoktu. Neyse konumuza dönelim ve bakalım biz kendi bitmapimizi nasıl yaratabileceğiz.

[XAML]

    <Grid x:Name="LayoutRoot" Background="White">

        <Image

           x:Name="imgFoto" />

    </Grid>

Yukarıdaki şekli ile basit bir Image nesnesini Silverlight uygulamamızın sahnesine yerleştiriyoruz. Bundan sonraki kodlarımızda söz konusu nesnenin içerisine farklı Bitmap'ler oluşturarak yerleştireceğiz.

[VB]

        Dim bitmap As New Imaging.WriteableBitmap(100, 100, Media.PixelFormats.Bgr32)

[C#]

            System.Windows.Media.Imaging.WriteableBitmap bitmap =

                new System.Windows.Media.Imaging.WriteableBitmap(100, 100,

                    System.Windows.Media.PixelFormats.Bgr32);

WriteableBitmap nesnesini yaratırken oluşturacağımız Bitmap'in genişlik ve yükseklik değerlerinin yanı sıra bir de Piksel formatını tanımlıyoruz. Bu aşamada iki seçenek söz konusu. Eğer Bgr32 kullanırsanız resminizde R (Red), G (Green) ve B (Blue) kanalları yer alacaktır. Eğer Pbgra32 kullanırsanız RGB'ye ek olarak bir de Alpha (şeffaflık) kanalı kullanabilirsiniz. Yani özünde eğer oluşturacağınız resmin şeffaflığı olacak ise Pbgra32, olmayacaksa Bgr32 kullanmanız uygun olacaktır.

[VB]

        bitmap.Lock()

Lock ve Unlock metodlarını Bitmap yaratma işleminin başında ve sonunda kullanacağız. Bu metodların amacı Bitmap yaratılırken veya değiştirilirken söz konusu değişikliklerin görsel olarak ekrana yansımasını engellemek. Lock işlemini de yaptığımıza göre artık yavaş yavaş çizimimizi yapmaya başlayalım.

[VB]

        For y As Integer = 0 To 99

            For x As Integer = 0 To 99

                Dim renkler(3) As Byte

                renkler(0) = x 'B (Mavi)

                renkler(1) = x 'G (Yeşil)

                renkler(2) = y 'R (Kırmızı)

                bitmap((x * 100) + y) = BitConverter.ToInt32(renkler, 0)

            Next

        Next

[C#]

            for (int y = 0; y <= 99; y++)

            {

                for (int x = 0; x <= 99; x++)

                {

                    byte[] renkler = new byte[4];

                    renkler[0] = (byte)x; //B (Mavi)

                    renkler[1] = (byte)x; //G (Yeşil)

                    renkler[2] = (byte)y; //R (Kırmızı)

                    bitmap[(x * 100) + y] = BitConverter.ToInt32(renkler, 0);

                }

            }

WriteableBitmap içerisinde herhangi bir piksele ulaşmak gerçekten çok kolay. Ulaşmak istediğiniz bir pikselin indeks numarasını doğrudan bitmap(0) şeklinde vererek söz konusu piksele ulaşabiliyorsunuz. Indeks numarası sürekli soldan sağa giderek satır bittiğinde de bir alt satıra geçerek devam ediyor. Böylece iç içe iki döngü kullanarak rahatlıkla tüm pikselleri gezebiliyoruz. Piksellere renk atama işlemini yaparken üçlü bir byte yaratıp 255 üzerinden RGB değerlerini verip sonra da Byte'ımızı Int32'ye çevirip Bitmap'imize atıyoruz. Şimdilik örneğimizde döngülerden değerler alıp kullandık ki her seferinde biraz daha farklı bir renk yaratılsın.

[VB]

        bitmap.Invalidate()

        bitmap.Unlock()

        imgFoto.Source = bitmap

Son olarak Invalidate metodu ile verdiğimiz değerlerden Bitmap'in çizilmesini ve Unlock ile de gösterilebilir olmasını sağladıktan sonra XAML içerisinde tanımladığımız Image nesnesine kaynak olarak atıyoruz.

Yarattığımız Bitmap karşımızda!
Yarattığımız Bitmap karşımızda!

Yukarıdaki görselde gördüğünüz Bitmap'i tamamen kendi kodumuz ile yaratmış olduk. Bu şekilde Bitmap yaratma proseslerini Multithread olarak çalıştırarak farklı animasyonlar yapmak da mümkün.

Başka başka?

WriteableBitmap'in bir diğer özelliği ise ekrandaki herhangi bir Silverlight elementinin görselliğini alabiliyor olması. Böylece belki de ekranda gösterdiğiniz bir Grid'in görselliğini resim olarak alabilir veya belki de oynattığınız bir videonun o anki karesini yakalayabilirsiniz. Tüm bunları WriteableBitmap ile yapmak gerçekten çok kolay.

[XAML]

<UserControl

   x:Class="SilverlightApplication26.MainPage"

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

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

   Width="400"

   Height="300">

    <Grid

       x:Name="LayoutRoot"

       Background="White">

        <Image

           Height="100"

           HorizontalAlignment="Left"

           VerticalAlignment="Top"

           Source="Flower.jpg"

           Width="100"

           x:Name="imgFoto" />

        <Image

           Height="100"

           HorizontalAlignment="Right"

           VerticalAlignment="Top"

           Width="100"

           x:Name="imgFoto2" />

    </Grid>

</UserControl>

Yukarıdaki gibi iki adet Image kontrolümüzün olduğu bir uygulama düşünelim. Image'lardan birinde Flower.jpg adındaki dosya gösterilirken diğeri ise boş. Biz kodumuz ile bir Image kontrolündeki görselliği alıp diğerine kaynak olarak vereceğiz.

[VB]

        Dim bitmap As New Imaging.WriteableBitmap(100, 100, PixelFormats.Pbgra32)

        bitmap.Render(imgFoto, imgFoto.RenderTransform)

        imgFoto2.Source = bitmap

[C#]

               System.Windows.Media.Imaging.WriteableBitmap bitmap =

                   new System.Windows.Media.Imaging.WriteableBitmap(100, 100, PixelFormats.Pbgra32);

                bitmap.Render(imgFoto, imgFoto.RenderTransform);

                imgFoto2.Source = bitmap;

Gördüğünüz gibi WriteableBitmap nesnemizi her zamanki gibi yarattıktan sonra tek yaptığımız Render metodunu çağırmak. Render metodu ilk olarak görselliği alacağı Silverlight elementinin adını istiyor. İkinci parametre ise söz konusu kontrole uygulanmış olan RenderTransform özellikleri. Böylece Render işlemi esnasında tam olarak doğru koordinatlar yakalanabiliyor. Sonrasında elimizdeki bitmap'i başka bir Image nesnesine kaynak olarak verebiliyoruz. Bu işlemi belirli aralıkla yaparsanız kabaca WPF'teki VisualBrush efektini elde etmeniz de mümkün.

Hepinize kolay gelsin.

Saturday, April 25, 2009 1:03:15 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 3.0  | 
 Friday, April 24, 2009

Pixel Shader efektleri genelde oyun programcılarının duyduğu fakat web veya windows programcılarının pek de haşır neşir olmadıkları bir alandır. Tabi bunun birçok nedeni var; Pixel Shader efektleri HLSL (High Level Shading Language) denilen  farklı bir dil ile yazılarak DirectX'in SDK'sı ile beraber gelen bir compiler ile kullanılabilir hale geliyor. Her ne kadar HLSL C tabanlı dillere benzese de özünde esas problem bu efektlerin kullanılacağı ortamların azlığıydı.

Bundan yaklaşık 9 ay önce WPF'e SP1 ile beraber Pixel Shader efektlerinin gelmesi sonrasında sizlerle bu konuda bir yazı paylaşmıştım. Bugün ise konumuz Silverlight içerisinde Pixel Shader efeklerinin kullanımı. Silverlight 3.0 ile beraber artık istediğiniz bir Pixel Shader efektini herhangi bir UIElement yani kontrole rahatlıkla uygulayabiliyorsunuz. Hatta bu konuda Runtime ile beraber gelen hazır iki efekt bulunuyor; DropShadow ve Blur.

[XAML]

        <Button

           Content="TIKLA"

           Height="100"

           Width="100">

            <Button.Effect>

                <BlurEffect

                   Radius="10" />

            </Button.Effect>

        </Button>

Yukarıdaki XAML kodu içerisinde gördüğünüz üzere basit bir Button nesnesine Blur efekti vermek aslında gerçekten çok kolay. Blur efektinin piksellere uygulanırken ne kadar uygulanacağı ile ilgili bir de yarıçap verebiliyoruz. Her efektin kendine göre farklı parametreleri olabiliyor. Verilen bu efektler tamamen gerçek zamanlı olarak uygulandığı için gerektiğinde kod ile yaratılabilir ve kontrol edilebilirler.

[XAML]

        <StackPanel>

            <Button

               Content="TIKLA"

               Height="100"

               Width="100">

                <Button.Effect>

                    <BlurEffect

                       x:Name="btnBlur"

                       Radius="10" />

                </Button.Effect>

            </Button>

            <Slider

               Minimum="0"

               Margin="10"

               Value="{Binding Radius, ElementName=btnBlur, Mode=TwoWay}" />

        </StackPanel>

Hali hazırda herhangi bir efektin farklı özelliklerine animasyonlar uygulayabileceğiniz gibi isterseniz bu özellikleri yine Silverlight 3.0 ile beraber yeni gelen ElementBinding sistemini kullanarak editlenebilir hale de getirebilirsiniz. Yukarıdaki örneğimizde özellikle gidip BlurEffect nesnemize btnBlur ismini veriyoruz. Böylece artık bu efektin özelliklerine hem programatik olarak hem de farklı Binding'lerde rahatlıkla ulaşabiliriz.

[XAML]

        <Storyboard

           x:Name="BlurOL">

            <DoubleAnimation

               Duration="00:00:01.000"

               From="0"

               To="10"

               Storyboard.TargetName="btnBlur"

               Storyboard.TargetProperty="(BlurEffect.Radius)" />

        </Storyboard>

Örneğimizdeki BlurEffect nesnesinin Radius özelliğini hedef alıp anime eden bir animasyonun XAML kodunu yukarıda inceleyebilirsiniz. Söz konusu animasyon çalıştırıldığında düğmemiz bir saniye içerisinde yavaşça netliğini kaybediyor.

Peki hepsi bu kadar mı?

DropShadow ve Blur efektleri sadece hazır gelenler. Oysa esas güzellik bizim de kendi Pixel Shader efektlerimizi yazabiliyor olmamız. Tabi bunun için öncesinde bilgisayarınıza DirectX SDK'sını yüklemeniz ve SDK içerisindeki fxc aracını kullanabiliyor olmanız şart. Kabaca aşağıdaki komutlar ile yazmış olduğunuz bir PixelShader FX dosyasını PS dosyasına compile edebilirsiniz.

fxc /T ps_2_0 /Fo DaronEfekt.ps DaronEfekt.fx

Eğer bilgisayarınıza DirectX SDK'sını yüklemek istemiyorsanız aşağıdaki adresteki Silverlight uygulamasını kullanarak PS dosyaları hazırlayabilirsiniz. Sayfa açıldığında karşınıza çıkan ilk kutucuğa almak istediğiniz PS dosyasının adını, ikinci kutucuğa ise HLSL kodunu koymanız yeterli olacaktır. Sistem otomatik olarak PS dosyasını compile edip download linki sunacaktır.

http://www.voxpeeps.com/slpixelshadercompiler/

Pixel Shader efekti nasıl yazılır?

Bu makalenin amacı Pixel Shader nasıl yazılır sorusuna cevap vermek olmadığı gibi ben de kişisel anlamda bir Pixel Shader uzmanı sayılmam. O nedenle olabildiğince basit bir şekillde kabaca konunun üzerinden geçeceğiz.

[HLSL]

sampler2D input : register(s0);

float4 main(float2 uv : TEXCOORD) : COLOR

{

    float4 Color;

    Color = tex2D( input , uv.xy);

    Color.r=1;

    return Color;

}

Yukarıda gördüğünüz Pixel Shader efektinin yaptığı tek şey kendisine verilen piksellerdeki kırmızı renk değerini maksimuma çekmek. input parametresi üzerinden piksel bilgisi, yani bir anlamda boyama fırçası gelirken uv parametresi ise offset koordinatları içeriyor. X ve Y koordinatı olarak gelen bu bilgiler 0 ile 1 arasında oluyor. Yani özünde tüm koordinatlar 0,0 ile 1,1 arasında diyebiliriz. Tüm bu bilgiler üzerinden fırçamızdaki uygun koordinatlardaki rengi almak için ise text2D metodunu kullanabiliyoruz. Elimize geçen renk değişkeni ARGB değerleri olan klasik bir Color nesnesi olarak geliyor. Böylece biz hem renk hem de koordinatlar üzerinden rahatlıkla oynama yapabiliyoruz.

Yukarıdaki efekt kendi içinde bir değer alarak kırmızı rengini 1 olarak eşitliyor. Oysa biz bu değerin yeri geldiğinde bu efekte parametrik olarak gönderilmesini de isteyebiliriz. Böyle durumlarda PixelShader kodumuzda söz konusu parametreyi de tanımlamamız şart.

[HLSL]

sampler2D input : register(s0);

int kirmizilik : register(c0);

 

float4 main(float2 uv : TEXCOORD) : COLOR

{

    float4 Color;

    Color = tex2D( input , uv.xy);

 

    Color.r=kirmizilik;

    return Color;

}

Değişkenimizi tanımlarken register ettiğimiz c0 noktasına dikkat. Bu nokta üzerinden söz konusu parametreye Silverlight tarafından da ulaşabileceğiz. Eğer farklı parametreler tanımlayaracak c1, c2 şeklinde devam edebilirsiniz. Gelin daha detalara girip makalemizi bir HLSL makalesine çevirmeden PixelShader efektimizin Silverlight tarafındaki kullanım şekline göz atalım.

PS dosyamızı Silverlight ile nasıl kullanırız?

PS dosyasını ilk olarak Silverlight projenize sağ tıklayarak gelen menüden "Add / Existing Item" diyerek eklemeniz gerekiyor. Sonrasında söz konusu PS dosyasını Solution Explorer içerisinde seçili tutup Visual Studio'nun Properties paneline geçerseniz Build Action adında bir özellik göreceksiniz. Söz konusu özelliğe "Content" değerini vererek PS dosyasının XAP içerisine alınmasını sağlayabilirsiniz. Eğer bu şekilde bir ayarlama yapmazsanız PS dosyası projede kalır fakat XAP dosyasına eklenmez ve uygulamanız da söz konusu Shader efektini kullanamaz.

[VB]

Public Class DaronEfekti

    Inherits Effects.ShaderEffect

 

    Public Sub New()

        Dim YeniEfekt As New Effects.PixelShader

        YeniEfekt.UriSource = New Uri("DaronEfekt.ps", UriKind.Relative)

        Me.PixelShader = YeniEfekt

    End Sub

 

End Class

[C#]

    public class DaronEfekti : System.Windows.Media.Effects.ShaderEffect

    {

        public DaronEfekti()

        {

            System.Windows.Media.Effects.PixelShader YeniEfekt = new System.Windows.Media.Effects.PixelShader();

            YeniEfekt.UriSource = new Uri("DaronEfekt.ps", UriKind.Relative);

            this.PixelShader = YeniEfekt;

        }

    }

Yukarıdaki kodlar içerisinde de görebileceğiniz üzere kendi Shader efektimizi yaratırken Silverlight ile beraber gelen ShaderEffect sınıfını inherit ediyoruz. Bu sınıfın kendi içerisinde zaten mevcut bir PixelShader Property'si var. Söz konusu Property'ye biz de kendi PixelShader efektimizi yaratarak veriyoruz. Kendi PixelShader efektimizi yaratırken de UriSource olarak Silverlight projemize eklediğimiz PS dosyasının relatif yolunu vermeyi unutmuyoruz. Aslında basit bir şekilde Silvelright için PixelShader efektimizi yaratma işlemini bitirdik fakat unutmayın ki bizim efektin bir de ekstra parametresi vardı. İşte bu parametre için Silverlight tarafında da bir Dependancy Property tanımlamamız gerekiyor. Özellikle Dependancy Property yaratmamızın nedeni aslında bu Property üzerinden gerektiğinde StoryBoard'ların da animasyon yapabilmesini sağlamak.

[VB]

    Public Property Kirmizilik() As Double

        Get

            Return Me.GetValue(KirmiziProperty)

        End Get

        Set(ByVal value As Double)

            Me.SetValue(KirmiziProperty, value)

        End Set

    End Property

 

    Public Shared ReadOnly KirmiziProperty As DependencyProperty = _

    DependencyProperty.Register("Kirmizilik", GetType(Double), _

                                GetType(DaronEfekti), _

                                New PropertyMetadata(0.0, PixelShaderConstantCallback(0)))

[C#]

        public double Kirmizilik

        {

            get { return (double)GetValue(KirmiziProperty); }

            set { SetValue(KirmiziProperty, value); }

        }

 

        public static readonly DependencyProperty KirmiziProperty =

            DependencyProperty.Register("Kirmizilik", typeof(double), typeof(DaronEfekti), new PropertyMetadata(0.0, PixelShaderConstantCallback(0)));

Yukarıdaki kodların normal bir Dependancy Property'den tek farkı Metadata kısmı! İşte tam da bu noktada bir PixelShaderConstantCallback görüyoruz. Söz konusu Callback nesnesine parametre olarak PixelShader HLSL kodumuzu yazarken parametremize verdiğimiz c0'ın sayısal kısmını veriyoruz :) Artık herşey hazır. Sıra geldi bu efektimizi XAML içerisinde kullanmaya.

Efektimizi tepe tepe kullanalım :)

Efektimizi kullanabilmek için ilk aşamada XAML tarafında uygulamamızın assemblysini bir XML namespace olarak tanımlıyoruz. Sonrasında söz konusu namespace üzerinden rahatlıkla efektimizi herhangi bir nesneye atayabiliyoruz. Tabi bu işlemleri C# veya VB kodu ile de yapabiliriz.

[XAML]

<UserControl

   x:Class="SilverlightApplication21.MainPage"

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

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

   xmlns:daron="clr-namespace:SilverlightApplication21"

   Width="400"

   Height="300">

    <UserControl.Resources>

        <Storyboard

           x:Name="BlurOL">

            <DoubleAnimation

               Duration="00:00:01.000"

               From="0"

               To="1"

               Storyboard.TargetName="Renk"

               Storyboard.TargetProperty="(DaronEfekti.Kirmizilik)" />

        </Storyboard>

    </UserControl.Resources>

    <Grid

       x:Name="LayoutRoot"

       Background="White">

        <StackPanel>

            <Button x:Name="btnTikla"

               Content="TIKLA"

               Height="100"

               Width="100">

                <Button.Effect>

                    <daron:DaronEfekti x:Name="Renk"></daron:DaronEfekti>

                </Button.Effect>

            </Button>

            <Slider

               Minimum="0"

               Maximum="1"

               Value="{Binding Kirmizilik, ElementName=Renk, Mode=TwoWay}" />

        </StackPanel>

    </Grid>

</UserControl>

Yukarıdaki XAML kodunda da inceleyebileceğiniz üzere hazırladığımız efektin özelliklerine bir Slider aracılığı ile erişebildiğimiz gibi gerekirse doğrudan söz konusu efektin bir özelliğine animasyon da verebiliyoruz. Örneğimizdeki animasyon Button kontrolünün görselliğindeki tüm kırmızılık renk değerlerini en düşük seviyesinden en yükseğe doğru anime edecektir.

Hazırı yok mu bunların?

Kendi Pixel Shader'larınızı yazmak her zaman doğru seçim olmayabilir :) Bazen başkaları yazsa da biz hemen kullansak hissiyatı kapılmamak elde değil. Esasen bu hissiyatın nedeni HLSL'in çoğumuza yabancı bir uzmanlık alanı olması. Bu çerçevede tabi ki konunun uzmanları "Özgür Yazılım" çerçevesinde :) codeplex'te açık kaynak kodları ile Silverlight için birçok Pixel Shader kütüphanesini paylaşmış durumdalar. Zaten bu kütüphanelerin neredeyse hepsi daha önce de WPF için downloada sunulmuştur.

http://wpffx.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25285

Yukarıdaki adresten Silverlight 3.0 ile uyumlu Pixel Shader kütüphanelerini indirebilirsiniz.

Hepinize kolay gelsin.

Friday, April 24, 2009 12:53:19 AM (GTB Standard Time, UTC+02:00)  #    Comments [1]   Silverlight 3.0  | 
 Monday, April 20, 2009

İşte bir seminer kaydı daha karşınızda :) Bu sefer "WPF ve Windows 7 ile Multitouch uygulama geliştirme" seminerimin kaydını sizlerle paylaşıyorum. Bu seminerde kullandığım örnekleri daha önceki bir blog yazımda sizlerle paylaşmıştım. Windows 7'ye az kaldı ;) hazır olun!

Yukarıdaki videoyu bilgisayarına indirmek isteyenler blogumun SeminerTV bölümünden bunu yapabilirler ;)

İyi seyirler...

Monday, April 20, 2009 9:45:49 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Windows 7 | WPF  | 
 Sunday, April 19, 2009

Sizinle yeni seminer kayıtları paylaşmayalı epey zaman geçmiş. Fırsat bulup uygun seminer ortamında kayıt almak emin olun pek kolay olmuyor :) Birçok ilginç problem ile karışlaşabiliyoruz. Sonunda Silvelright 3.0 Yenilikleri seminerimin sağlıklı bir kaydını almayı başardım. Umarım hepiniz için faydalı olur. Seminerde geçen konular ile ilgili zaman içerisinde daha detaylı blog yazıları yazacağım.

Yukarıdaki videoyu bilgisayarına indirmek isteyenler blogumun SeminerTV bölümünden bunu yapabilirler ;)

İyi seyirler...

Sunday, April 19, 2009 9:39:35 AM (GTB Standard Time, UTC+02:00)  #    Comments [4]   Seminer | Silverlight 3.0  | 
 Saturday, April 18, 2009

Uzun süredir aklımızda olan aktivitelerden birini sonunda gerçekleştirebiliyoruz. SQL 2008 ile ilgili tam gün bir etkinlikten bahsediyorum! Gelin çok konuşmadan sizinle etkinlik programını paylaşayım...

SQL 2008 İstanbul Kampı

Hepinizi bekliyoruz.

Kayıt için www.inetatr.org adresini ziyaret etmeyi unutmayın!

Saturday, April 18, 2009 3:09:33 PM (GTB Standard Time, UTC+02:00)  #    Comments [5]   SQL Server 2008  | 
 Friday, April 17, 2009

Bugün Imagine Cup 2009 Türkiye Final'inin günüydü. Microsoft Istanbul ofisindeki etkinlik dün twitter üzerinden de duyurduğum üzere tamamen canlı olarak internetten de yayınlandı hatta oylama sürecinde bir de online oylama sistemi kullanıldı. Buradan katılan tüm ekipleri kutluyorum!

Etkinlik içerisinde bir de teknik oturum yer aldı ve ben de o oturumda WPF ve MultiTouch ile ilgili bilgiler verip demo yapma şansına sahip oldum. En son INETA NEXT etkinliğinde yaşadığımız donanımsal sorunları aşmış olsak da bu sefer de zamanımız yetmedi :) Eminim ki en kısa zamanda Multitouch oturumlarım ile ilgili de sağlıklı bir işleyişi oturtacağım :)

Imagine Cup Türkiye Finali'nde WPF ve MultiTouch Oturumum
Imagine Cup Türkiye Finali'nde WPF ve MultiTouch Oturumum

Seminerde söz verdiğim üzere hem yaptığım örnekleri, hem sunumumu, hem de Managed Wrapper'ları sizlerle paylaşıyorum. Aşağıdaki adresten indirebilirsiniz. Kısa sürede bu konuda sağlıklı bir seminer kaydını blogumdan paylaşacağım.

MultiTouch Örnek Projeler - 17042009_1.rar (3,6 MB)
MultiTouch Sunum - 17042009_2.pptx (2,01 MB)

Friday, April 17, 2009 11:32:27 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   WPF | MultiTouch  | 
 Thursday, April 16, 2009

Bu makalemizde aslında uzun zamandır WPF tarafında bulunan fakat Silverlight 2.0'da olmayan bir özellikten bahsedeceğiz. Tabi bu özellikten bahsetmemizin nedeni ise artık Silverlight 3.0 ile söz konusu özelliği kullanabiliyor olmamız. Bahsettiğimiz özellik Element Binding özelliği. Element Binding'i kabaca bir kontrolün herhangi bir özelliğinin otomatik olarak başka bir kontrolün bir özelliğine bağlanması ve aradaki değer değişikliklerinin karşı tarafa otomatik olarak aktarılması şeklinde tanımlayabiliriz.

[XAML]

        <StackPanel>

            <TextBox x:Name="BirTextBox" ></TextBox>

            <Slider

               x:Name="BirSlider"></Slider>

        </StackPanel>

Ekranımızda yukarıdaki şekli ile bir TextBox ve bir de Slider kontrolü olduğunu düşünelim. İstediğimiz şey bu Slider kontrolündeki değerin sürekli olarak TextBox içerisinde gösterilmesi. Normal şartlarda böyle bir işlevsellik için basit bir şekilde Slider'ın ValueChanged durumunu yakalayıp sürekli olarak Slider'ın Value özelliğinden değer alıp, bunu da String'e çevirip TextBox'ın Text değerine eşitleyebilirdik. Eğer bu eşitlemenin çift taraflı olmasını istiyorsanız farklı taklalar ile TextBox'ın da TextChanged durumunu yakalayıp Slider'ın Value değerinin değiştirmeniz gerekecektir. Sonuç olarak her iki kontrolden birinde kullanıcı bir değişiklik yaptığında diğerine yansıyacak. Ama bu kadar kod yazmaktansa artık Binding tanımlayarak hızlıca ilerleyebiliyoruz.

[XAML]

        <StackPanel>

            <TextBox Text="{Binding Value, ElementName=BirSlider}" ></TextBox>

            <Slider

               x:Name="BirSlider"></Slider>

        </StackPanel>

Artık TextBox'ımızın Text özelliğine farklı bir değer veriyoruz. Bu değer özünde bir Binding nesnesi. Binding'imizi tanımlarken hedeflediğimiz Property olarak Value ve bu Property'nin alınacağı yer olarak da BirSlider adındaki Slider kontrolümüzü gösteriyoruz. Bu noktadan sonra projeyi çalıştırdığımızda Slider içerisinde kullanıcı tarafından bir değişiklik yapıldığında otomatik olarak TextBox'ın Text'inin de güncellendiğini görebiliriz. Oysa teknik açıdan baktığımızda birbirine Bind ettiğimiz Property'ler olan Text ve Value Property'lerinin tipleri farklı. Value bir Double olarak gelirken Text ise String olarak geliyor. Binding esnasında buna rağmen bir sorun yaşamıyoruz.

Diğer yandan eğer TextBox içerisindeki sayısal değeri el ile değiştirirsek bu değerin Slider'a yansımadığını görüyoruz. Bu sorunu halledebilmek için Binding tanımlarken özellikle Binding işleminin çift taraflı olarak yapılacağını da belirtmemiz gerekecek.

[XAML]

        <StackPanel>

            <TextBox

               Text="{Binding Value, ElementName=BirSlider, Mode=TwoWay}"></TextBox>

            <Slider

               x:Name="BirSlider"></Slider>

        </StackPanel>

Kod içerisinde de gördüğünüz üzere artık Binding'imizin modunu TwoWay olarak değiştirdik. Sonuç olarak kullanıcı TextBox içerisine sayısal bir değer girdiğinde bu değer otomatik olarak Slider'ın da Value özelliğine aktarılacaktır.

Peki ya bind edilecek tipler tutmazsa?

Eğer birbirine bind etmek istediğiniz Property'lerin tamamen birbiri ile alakasız ise bu sefer de Binding esnasında Converter yapılarını kullanabilirsiniz. IValueConverter arayüzünü implemente eden bir sınıf yaratıp rahatlıkla Binding esnasında gelen ve giden veriye müdahale edebilirsiniz.

Örneğin gelin bir Slider'ın Value'su ile bir Calendar kontrolünün SelectedDate özelliğini birbirine bağlamaya çalışalım. Normal şartlarda DateTime ile Double'ı birbirine bağlayamazsınız ayrıca Slider'ın başlangıç ve son değerleri yine birer Double iken belki biz farklı başlangıç ve son tarihleri arasında Slider'ın çalışmasını isteyeceğiz. İşte tam da bu noktada Sliderdan gelen değerleri birer tarih eşleştirirsek Calendar için de anlamlı bir veri kaynağı yaratmış oluruz.

[VB]

Public Class Cevirici

    Implements Data.IValueConverter

 

    Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert

        Return Now.Date.AddDays(value)

    End Function

 

    Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack

        Return CType(value, Date).Subtract(Now).TotalDays + 1

    End Function

End Class

[C#]

    public class Cevirici : System.Windows.Data.IValueConverter

    {

        public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)

        {

            return DateTime.Now.Date.AddDays((double)value);

        }

 

        public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)

        {

            return ((System.DateTime)value).Subtract(DateTime.Now).TotalDays + 1;

        }

    }

Yukarıda gördüğünüz Cevirici sınıfı IValueConverter arayüzünü implemente ettiği anda Convert ve ConvertBack metodlarına da sahip oluyor. Bu metodlar Binding esnasında gelen ve giden verinin farklı tiplere çevrimi için kullanılabilir. Bizim örneğimizde Convert metoduna gelen Double değerlerini o anki tarihe gün olarak ekliyoruz. Böylece Slider'dan 2 değeri geldiğinde aslında Calendar kontrolüne de bugünden 2 gün sonrasına ait tarihi vermiş oluyoruz. Eğer Calendar içerisinde bir seçim yapıldığında Slider'a da yansımasını istiyorsanız ConvertBack metodunu da yazmanız gerekiyor. Bu metoda da Calendar'dan SelectedDate geleceği için o anki tarih ile farkını bulup geri döndüyüroz.

[XAML]

<UserControl

   xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"

   x:Class="SilverlightApplication27.MainPage"

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

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

   xmlns:daron="clr-namespace:SilverlightApplication27"

   Width="400"

   Height="300">

    <UserControl.Resources>

        <daron:Cevirici

           x:Name="BirCevirici" />

    </UserControl.Resources>

    <Grid

       x:Name="LayoutRoot"

       Background="White">

        <StackPanel>

            <controls:Calendar

               SelectedDate="{Binding Value,

                               ElementName=BirSlider,

                               Converter={StaticResource BirCevirici},

                               Mode=TwoWay}"></controls:Calendar>

            <Slider

               x:Name="BirSlider"

               SmallChange="1"

               LargeChange="1"></Slider>

        </StackPanel>

    </Grid>

</UserControl>

Kod tarafında hazırladığımız Converter'ımızı XAML tarafında kullanabilmek için hemen daron adında bir XAML namespace'i tanımladım ve çalıştığım projenin Assembly'sine bağladım. Böylece söz konusu Assembly içerisindeki kontrolleri XAML tarafında kullanabileceğiz. Bir sonraki adımda kod tarafındaki Cevirici tanımından bir kopyayı UserControl'un Resource'larına alıyorum ve adını da BirCeviri koyuyorum. Artık BirCeviri nesnemizi Converter olarak istediğimiz Binding'lerde kullanabiliriz. Kendi Binding tanımımıza bu bilgiyi de ekledik mi işlem tamamdır. Unutmadan Binding'in modunu da TwoWay olarak ayarlayalım.

İşte bu kadar!

Gördüğünüz gibi kontrollerin farklı özelliklerini rahatlıkla birbirlerine gerektiğinde çift yönlü olarak da bağlayabiliyoruz. Bu bağlama işlemi esnasında çok farklı çeviri ve kontrol mekanizmaları oluşturabileceğimiz ValueConverter yapısına da göz attığımıza göre bir makalemizin daha sonuna geldik.

Hepinize kolay gelsin.

Thursday, April 16, 2009 8:40:27 AM (GTB Standard Time, UTC+02:00)  #    Comments [2]   Silverlight 3.0  | 
 Wednesday, April 15, 2009

DataForm kontrolüne hızlı bir şekilde göz atıldığında aslında ASP.NET'teki DetailsView kontrolüne benzetilebilir. Bu önyargı ile hızlıca konumuza giriş yaparken gelin ilk olarak bir Silverlight 3 projesine nasıl DataForm kontrolünü ekleyebiliriz inceleyelim.

DataForm kontrolü sahnede...

DataForm kontrolü Silverlight ile beraber gelen harici kontrollerden biri. Yani DataForm kontrolü Silverlight 3'ün RunTime'ında bulunmuyor. Öyle hemen istediğimiz yerde anında kullanamıyoruz. Eğer bizim uygulamamız bu kontrolü kullanmak istiyorsa ona ait DLL'i referans alarak kendi XAP dosyası içerisinde taşımak zorunda. Tabi bu harici DLL'ler ile ilgili cachleme vs işlemleri de mümkün fakat bu konuda makalemizin şimdilik dışında.

Durum böyle ise DataForm kontrolünü kullanabilmek için hemen  Visual Studio içerisinde yeni bir SL 3.0 projesi yaratıp projemize sağ tıklayarak "Add Reference" diyip System.Windows.Controls.Data.DataForm'ı referans olarak eklemeliyiz. Böylece artık bu DLL içerisindeki kontrolleri kullanabiliriz. Fakat daha işimiz bitmedi. Projemize eklemiş olduğumuz bu Assembly içerisindeki kontrolleri XAML tarafında veya Blend 3 içerisinde kullanabilmemiz için ayrıca XAML tarafına da DLL'imizi tanıtmamız gerekiyor.

[XAML]

<UserControl x:Class="SilverlightApplication10.MainPage"

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

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

   Width="400" Height="300"

   xmlns:dataControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm" >

    <Grid x:Name="LayoutRoot" Background="White">

        <dataControls:DataForm x:Name="birDataForm"></dataControls:DataForm>

    </Grid>

</UserControl>

Yukarıda gördüğünüz şekli ile DLL'imizi dataControls adı altında XAML tarafına da aldık. Sonrasında da içerisinde bulunduğumuz sayfadaki Grid'in içine yine dataControls XML namespace'i üzerinden giderek Assembly içerisinde DataForm sınıfından bir instance alıyoruz. Artık sahnede bir DataForm var. Tüm bu işlemleri otomatik olarak yapmak isterseniz Visual Studio içerisinde XAML dosyasını açarak araç çubuğundan da DataForm kontrolünü sürükleyip sahneye bırakabilirsiniz. Visual Studio sizin için otomatik olarak DLL'i referans alıp gerekli XAML tanımlamalarını da yapacaktır. Bu noktada ufak bir detaya dikkat çekmek istiyorum. Şu an Silverlight 3.0 Beta olduğu için Visual Studio içerisinde designer tarafında desteği biraz zayıf. O nedenle araç çubuğundan herhangi bir kontrolü XAML dosyanıza sürükleyip bırakmak isterseniz sadece kod tarafına bırakabileceğinizi söylemem gerek.

Hemen bir veri bağlayalım!

Kontrolümüz artık sahnede olduğuna göre hemen bir veri bağlayarak neler yapabiliyoruz göz atalım. İlk olarak bağlayacağımız veriyi temsil edecek olan sınıfımızı yaratalım.

[VB]

Public Class Entities

    Public Class Urun

 

        Private PAdi As String

        Public Property Adi() As String

            Get

                Return PAdi

            End Get

            Set(ByVal value As String)

                PAdi = value

            End Set

        End Property

 

        Private PSatis As Double

        Public Property Satis() As Double

            Get

                Return PSatis

            End Get

            Set(ByVal value As Double)

                PSatis = value

            End Set

        End Property

 

    End Class

End Class

[C#]

    public class Entities

    {

        public class Urun

        {

            private string PAdi;

            public string Adi

            {

                get { return PAdi; }

                set { PAdi = value; }

            }

 

            private double PSatis;

            public double Satis

            {

                get { return PSatis; }

                set { PSatis = value; }

            }

        }

    }

Gördüğünüz gibi sınıfımızın adı Urun ve içerisinde de iki adet farklı Property var. Bu sınıfımızdan yola çıkarak birden çok Urun yaratıp bunları da DataForm kontrolümüze veri kaynağı olarak vereceğiz. Ama gelin bunun öncesinde tek bir Urun sınıfı yaratarak DataForm'a verelim bakalım neler yapacak.

[VB]

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

        birDataForm.CurrentItem = New Entities.Urun() With {.Adi = "Ürün Adi", .Satis = 20}

    End Sub

[C#]

        void  MainPage_Loaded(object sender, RoutedEventArgs e)

        {

            birDataForm.CurrentItem = new Entities.Urun { Adi = "Ürün Adi", Satis = 20 };

        }

Daha önceden XAML tarafında yaratmış olduğumuz DataForm kontrolüne isim olarak birDataForm ismini verdiğimiz için kod tarafında da aynı isimle ulaşıp şimdilik DataForm'un CurrentItem özelliğine yeni bir nesne atıyoruz. Söz konusu nesne daha önce tanımlamış olduğumuz Urun sınıfının bir instance'ı.

DataForm içerisinde tek bir kaydın düzenlenmesi.
DataForm içerisinde tek bir kaydın düzenlenmesi

Gördüğünüz üzere DataForm otomatik olarak kendisine bağlanan veri içerisinde tüm Property'ler için hem Textblock ve Textbox'lar yerleştirebiliyor hem de söz konusu Property'lerin adlarını da yanına yazarak aslında kabaca bir veri giriş ve düzenleme ekranı oluşturuyor. DataForm içerisinde sol üstte bulunan Edit düğmesine tıklarsanız ortaya veriyi düzenleyebileceğiniz bir ekran gelirken "Save" düğmesi de hemen altta kendini gösteriyor. Tabi ki bu aşamadan sonra özelleştirilmesi gereken birçok nokta var. İşte biz de makalemizin devamında bu noktalara değineceğiz.

MetaData aşkı!

Eğer ASP.NET Dynamic Data projeleri üzerine biraz çalışma şansınız olduysa veri kaynağı olarak kullanılan sınıflara verilen MetaData'lar ile beraber birçok şeyin ayarlanabildiğini hatırlayacaksınız. DataForm ile beraber çalışırken de aslında çoğu kuralı MetaData'lar ile DataForm'a bağlayacağımız veri kaynağı seviyesinde ayarlamamız gerekiyor. Örneğin yukarıdaki projemizde Urun adındaki nesnemizi tanımlarken Adi ve Satis Property'lerinde tabi ki Türkçe karakterler kullanmadık. Oysa DataForm bu Property'leri istemci tarafına açarken belki de Türkçe karakterler de içeren düzgün isimleri açmalı değil mi?

[VB]

Public Class Entities

    Public Class Urun

 

        Private PAdi As String

        <System.ComponentModel.DataAnnotations.Display(Name:="Adı")> _

        Public Property Adi() As String

            Get

                Return PAdi

            End Get

            Set(ByVal value As String)

                PAdi = value

            End Set

        End Property

 

        Private PSatis As Double

        <System.ComponentModel.DataAnnotations.Display(Name:="Satış")> _

        Public Property Satis() As Double

            Get

                Return PSatis

            End Get

            Set(ByVal value As Double)

                PSatis = value

            End Set

        End Property

 

    End Class

End Class

[C#]

    public class Entities

    {

        public class Urun

        {

 

            private string PAdi;

            [System.ComponentModel.DataAnnotations.Display(Name = "Adı")]

            public string Adi

            {

                get { return PAdi; }

                set { PAdi = value; }

            }

 

            private double PSatis;

            [System.ComponentModel.DataAnnotations.Display(Name = "Satış")]

            public double Satis

            {

                get { return PSatis; }

                set { PSatis = value; }

            }

 

        }

    }

Yukarıdaki kod içerisinde Urun sınıfımızı tanımlarken neleri değiştirediğimize dikkat edelim. Her bir Property'i tanımlarken bir de MetaData veriyoruz. System.ComponentModel.DataAnnotations sınıfı altında kullanabileceğiniz bir çok farklı MetaData'yı bulabilirsiniz. Bunların bazılarına makalemiz içerisinde göz atacağız. Şu an için Display MetaData'sını vererek söz konusu Property'lerin DataForm tarafından hangi isimle gösterilmesi gerektiğini belirtiyoruz. Tabi ki bu noktada istediğimiz gibi Türkçe karakterler kullanabiliriz. Bundan sonraki örnek kodlarda Urun sınıfının tüm tanımını değil sadece MetaData koyduğumuz satırların etrafını yazacağım.

[VB]

        <System.ComponentModel.DataAnnotations.Display(Name:="Satış", Description:="Bu satış değeridir")> _

        Public Property Satis() As Double

Yukarıdaki şekli ile tanımlanan bir Display MetaData'sında ek olarak bir de Description verisi bulunuyor. Bu parametreye herhangi bir değer verilmesi halinde DataForm içerisinde bu Property'nin yanında bir ünlem işareti belirecektir. Kullanıcılar söz konusu ünlem işaretinin üzerine fareleri ile geldiklerinde ise açıklamanızı görebilirler.

MetaData içerisinde Description yer alırsa...
MetaData içerisinde Description yer alırsa...

Şu ana kadar yaptığımız işlemlerin hepsinde belki de en sinir bozucu noktalardan biri DataForm içerisinde tüm Property'lerin sınıf tanımındaki sıra ile gösteriliyor olmasıdır. Aslında bu sırayı da değiştirebiliyoruz.

[VB]

        Private PAdi As String

        <System.ComponentModel.DataAnnotations.Display(Order:=1)> _

        Public Property Adi() As String

            Get

                Return PAdi

            End Get

            Set(ByVal value As String)

                PAdi = value

            End Set

        End Property

 

        Private PSatis As Double

        <System.ComponentModel.DataAnnotations.Display(Name:="Satış", Description:="Bu satış değeridir", Order:=0)> _

        Public Property Satis() As Double

            Get

                Return PSatis

            End Get

            Set(ByVal value As Double)

                PSatis = value

            End Set

        End Property

Display MetaData'sını tanımlarken verebileceğiniz Order parametresi doğrudan bu Property'lerin hangi sıra ile DataForm içerisinde gösterileceğini belirliyor. Sıfırdan başlayarak vereceğiniz bu sayılarla küçükten büyüğe doğru gidecek sırada Property'ler ekrana getirilecektir. Bizim örneğimizde üstte Satis altta Adi parametreleri yer alıyor.

Binding yollarında...

İlk örneğimizde DataForm'a bağladığımız nesne kod tarafında içerisinde bulunduğu scope dışında yaşayamayacağı için pek anlamlı bir örnek olmamıştı. DataForm içerisinde edit işlemi yapılsa da söz konusu bağlı değişken arkada yaşamadığı için edit işleminin de anlamı kalmıyor. Fakat eğer DataForm'a bağladığınız değişkenleri kod tarafında sürekli canlı tutarsanız DataForm içerisindeki değişikliklerin doğrudan nesneye yansıtıldığını da görebilirsiniz. Duruma göre bu işlevselliği değiştirmek veya bazen arka taraftaki nesnede bulunan bazı Property'leri DataForm içerisinde göstermemek de isteyebilirsiniz. Örneğin bizim Urun nesnesinin bir PK property'si olsaydı kesin onu göstermek istemezdir.

[VB]

        <System.ComponentModel.Bindable(False)> _

        Public Property Adi() As String

Yukarıdaki gibi herhangi bir Property'yi doğrudan Bindable False olarak işaretleyebilirsiniz. Böylece söz konusu Property hiçbir şekilde bağlı olduğu kontroller tarafından gösterilmeyecektir. Diğer yandan bu Property'nin gösterilmesi fakat değerinin değiştirilemesini isterseniz bu sefer de aşağıdak şekilde Bindable'a ikinci bir parametre vererek tek yönlü veri bağlantısı oluşturabilirsiniz.

[VB]

        <System.ComponentModel.Bindable(True, ComponentModel.BindingDirection.OneWay)> _

        Public Property Adi() As String

Yukarıdaki şekli ile bu Property DataForm'un edit modunda gözükse de değeri değiştirilemeyecektir.

Ya Validation gerekirse?

Belki de DataForm kontrolünün en can alıcı noktalarından biri tüm validasyon işlemlerini de kısmen MetaData üzerinden yapabiliyor olmamız. Örneğin bazı Property'lerin kullanıcı tarafından boş geçilememesini isteyebilirsiniz. Bu ve bu gibi tüm Validation işlemleri için yine System.ComponentModel.DataAnnotations sınıfı altındaki tanımlardan faydalanabiliriz.

[VB]

        <System.ComponentModel.DataAnnotations.Required(ErrorMessage:="Boş geçilemez")> _

        Public Property Adi() As String

Yukarıdaki örnek kodda da görebileceğiniz üzere Required olarak işaretlediğimiz Adi Property'sine bir de ErrorMessage vermişiz. DataForm kontrolü bu Property ile ilgili gerekli validasyonları yapmakla kalmayacak, herhangi bir sorun olduğunda MetaData içerisinde tanımladığımız hatayı da güzel bir şekilde kullanıcıya gösterecek.

Basit bir validasyon örneği!
Basit bir validasyon örneği!

Validasyon yöntemlerinden bazıları bir önceki örneğimizdeki gibi hazır bir şekilde tanımlanmış bizim kullanımızı bekliyor. Bunlardan biri de doğrudan sayısal değerlerin alabilecekleri değer aralığını kontrol eden Range sınıfı.

[VB]

        <System.ComponentModel.DataAnnotations.Range(1, 10, ErrorMessage:="Aman!")> _

        Public Property Satis() As Double

Range MetaData'sını biz örneğimizde anlamlı olması açısından Satis Property'sine verelim. Artık yukarıdaki tanımlama ile beraber Satis Property'si kesinlikle 1 ile 10 arasında olmak zorunda. Aksi durumda MetaData içerisinde tanımladığımız ErrorMessage kullanıcıya gösterilecektir.

[VB]

        <System.ComponentModel.DataAnnotations.StringLength(10)> _

        Public Property Adi() As String

Hazır gelen kontrollerden biri de StringLenght kontrolü. Bu MetaData ile beraber söz konusu Property'e atanabilecek metin uzunluğunun en yüksek değerini tanımlamış oluyoruz. Böylece kullanıcılar daha yüksek değerler girdiğinde eğer tanımlanmış ise özel hata mesajları da gösterilebiliyor.

Eğer isterseniz tüm bu validasyonların yanı sıra daha karmaşık RegularExpression yapıları da kullanabilirsiniz. Bizim örneğimizde varsayalım ki kullanıcıların ürünlere isim verirken hep büyük harf ile başlamalarını istiyoruz. Bu durumda aşağıdaki gibi bir RegEx tanımlamasını işimizi görecektir.

[VB]

        <System.ComponentModel.DataAnnotations.RegularExpression("^[A-Z]+[a-zA-Z]*$", ErrorMessage:="Büyük harfle başlamalı")> _

        Public Property Adi() As String

Hardcore Validasyon?

Bazı durumlarda validasyon ile ilgili RegEx'ler de işinizi görmeyebilir. Bizim örneğimizde bu duruma uygun anlamlı bir senaryo yaratmak zor olsa da diyelim ki ürünlerimiz A harfi ile başlıyorsa fiyatlarının kesinlikle 10 ile 20 arasında olması gerekiyor. Bu senaryoyu gerçek hayata taşırken aslında farklı Property'lerin farklı iş kuralları ile kontrol edilmesi gerektiğini de düşünebilirsiniz. Böyle bir durumda tamamen farklı bir mekanizma kullanabilmek için CustomValidation yapısı bizi bekliyor.

[VB]

    Public Class Kontrol

        Public Shared Function UrunKontrol(ByVal BirUrun As Urun) As Boolean

            If BirUrun.Adi.StartsWith("A") Then

                If BirUrun.Satis > 10 And BirUrun.Satis < 20 Then

                    Return True

                Else

                    Return False

                End If

            Else

                Return True

            End If

        End Function

    End Class

[C#]

    public class Kontrol

    {

        public static bool UrunKontrol(Urun BirUrun)

        {

            if (BirUrun.Adi.StartsWith("A"))

            {

                if (BirUrun.Satis > 10 & BirUrun.Satis < 20)

                {

                    return true;

                }

                else

                {

                    return false;

                }

            }

            else

            {

                return true;

            }

        }

    }

Yukarıdaki gördüğünüz kod içerisinde Kontrol adında bir sınıfın içinde Shared / Static olarak tanımlanmış bir Validasyon metodu bulunuyor. Metod aslında alıştığımız .NET metodlarından farklı değil. UrunKontrol adını verdiğimiz bu metod kendisine parametre olarak verilen bir Urun nesnesini kontrol ederek geriye True veya False şeklinde Valid / Uygundur veya InValid / Uygun Değildir mesajı döndürmüş oluyor. Bu hazırladığımız validasyon metodunun herhangi bir Urun nesnesine uygulanması için ise Urun nesnesinin tanımına ufak bir MetaData eklemesi yeterli olacaktır.

[VB]

    <System.ComponentModel.DataAnnotations.CustomValidation(GetType(Kontrol), "UrunKontrol", ErrorMessage:="Olmadı!")> _

    Public Class Urun

[C#]

    [System.ComponentModel.DataAnnotations.CustomValidation(typeof(Kontrol), "UrunKontrol", ErrorMessage = "Olmadı!")]

    public class Urun

    {

    }

CustomValidation olarak tanımladığımız bu kontrol mekanizmasını sınıfımıza bağlarken ilk olarak validasyon yapacak olan sınıfın tipini veriyoruz. Sonrasında bu sınıf içerisinde hangi metodun kullanılacağını bir String parametre olarak verip bir de eğer istiyorsak validasyon işlemi False döndürdüğünde gösterilmek üzere ErrorMessage ayarlıyoruz. İsterseniz bu mekanizmayı sınıf bazında değil doğrudan Property bazında da kurabilirsiniz.

Herşey kontrol altında...

Tüm bahsettiğimiz validasyon sistemlerine ek olarak bazen bir ürün düzenlenmesi ile ilgili istemci tarafında DataForm ile yaratılan süreçlere müdahale etmek de isteyebilirsiniz. Örneğin bir ürün kaydedilirken adı boş ise belki ona varsayılan bir isim vermek isteyeceksiniz veya bir ürünün kayıt moduna geçildikten sonra herhangi bir değişiklik yapılmadan kayıt modundan çıkılmasını engellemek de isteyebilirsiniz. Bu gibi daha birçok senaryo olabilir.

[VB]

    Public Class Urun

        Implements ComponentModel.IEditableObject

 

        Private PAdi As String

        Public Property Adi() As String

            Get

                Return PAdi

            End Get

            Set(ByVal value As String)

                PAdi = value

            End Set

        End Property

 

        Private PSatis As Double

        Public Property Satis() As Double

            Get

                Return PSatis

            End Get

            Set(ByVal value As Double)

                PSatis = value

            End Set

        End Property

 

        Public Sub BeginEdit() Implements System.ComponentModel.IEditableObject.BeginEdit

 

        End Sub

 

        Public Sub CancelEdit() Implements System.ComponentModel.IEditableObject.CancelEdit

 

        End Sub

 

        Public Sub EndEdit() Implements System.ComponentModel.IEditableObject.EndEdit

 

        End Sub

    End Class

[C#]

        public class Urun : IEditableObject

        {

            private string PAdi;

            public string Adi

            {

                get { return PAdi; }

                set { PAdi = value; }

            }

 

            private double PSatis;

            public double Satis

            {

                get { return PSatis; }

                set { PSatis = value; }

            }

 

            public void BeginEdit()

            {

                throw new NotImplementedException();

            }

 

            public void CancelEdit()

            {

                throw new NotImplementedException();

            }

 

            public void EndEdit()

            {

                throw new NotImplementedException();

            }

        }

Kendi sınıfınıza IEditableObject interface'ini implemente ettiğiniz anda artık sınıfınızın BeginEdit, CancelEdit ve EndEdit gibi durumları olacak. Bu durumlara dair kod bloklarına yazacağınız kodlar edit işlemi başladığında, iptal edildiğinde veya bittiğinde çalıştırılacaktır. Böylece siz de bu süreçlerde nesne ile ilgili değişiklikleri rahatlıkla yapabilirsiniz.

Çoklu kayıt desteği de var.

DataForm kontrolünü epey karıştırmış olsak da aslında hiç bakmadığımız bir özelliği var. Örneklerimizin başından beridir sadece tek bir nesne yarattık ve DataForm'un CurrentItem'ına atadık. Oysa DataForm kontrolünün ItemsSource'una da birden çok nesne içeren listeler bağlanabilir.

 [VB]

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

        Dim liste As New System.Collections.ObjectModel.ObservableCollection(Of Entities.Urun)

        liste.Add(New Entities.Urun() With {.Adi = "Ürün Adi", .Satis = 20})

        liste.Add(New Entities.Urun() With {.Adi = "Ürün Adi2", .Satis = 30})

        liste.Add(New Entities.Urun() With {.Adi = "Ürün Adi3", .Satis = 40})

        birDataForm.ItemsSource = liste

    End Sub

[C#]

        void MainPage_Loaded(object sender, RoutedEventArgs e)

        {

            System.Collections.ObjectModel.ObservableCollection<Entities.Urun> liste = new System.Collections.ObjectModel.ObservableCollection<Entities.Urun>();

            liste.Add(new Entities.Urun { Adi = "Ürün Adi", Satis = 20 });

            liste.Add(new Entities.Urun { Adi = "Ürün Adi2", Satis = 30 });

            liste.Add(new Entities.Urun { Adi = "Ürün Adi3", Satis = 40 });

            birDataForm.ItemsSource = liste;

        }

Kodumuzda bu sefer tamamen deneme amaçlı olarak içerisinde birden çok Urun bulunan bir ObservableCollection kullanıyoruz. Uygulamamızı çalıştırdığımıda DataForm kontrlünün sağ üstünde navigasyon kontrolleri de yerini alıyor. Böylece artık DataForm kontrolü içerisinde birden çok nesnenin de gezilerek düzenlenebileceğini görmüş olduk.

Çoklu kayıt düzenleme ekranı.
Çoklu kayıt düzenleme ekranı.

Yukarıdaki ekran görüntüsünde sağ üst köşede gördüğünüz düğmeler sadece kayıtlar arasında gezintiyi sağlamıyor. Ayrıca bulunan kaydın düzenlenebilmesinin yanı sıra yeni bir kayıt eklenebilmesini hatta silinebilmesini de sağlayabiliyorlar. Hali hazırda nesnemize bir ObservableCollection bağladığımız için zaten tüm değişiklikler otomatik olarak nesneye de yansıyacaktır.

AutoGenerateFields ?

Sanırım ASP.NET ile biraz uğraşan herkes AutoGenerateFields deyince ne demek istediğimi anlayacaktır. Bir DataForm'un normal şartlarda kendisine verdiğimiz veriye uygun şekilde gerekli TextBox vs kayıt düzenleme kontrollerini otomatik olarak yaratmasını sağlayan özellik AutoGenerateFields'in varsayılan değeri olan "True" değerinde saklı. Eğer AutoGenerateFields özelliğini False olarak ayarlarsanız artık veri kaynağından gelen her verinin ne şekilde görsel ekrana yansıtılacağını tek tek sizin ayarlamanız gerekecektir. Tabi bu durum da bazı senaryolarda özelleştirme adına şart oluyor. Şimdi gelin bu konunun detaylarına bakalım.

[XAML]

        <dataControls:DataForm AutoGenerateFields="False" x:Name="birDataForm">

            <dataControls:DataForm.Fields>

                <dataControls:DataFormCheckBoxField />

                <dataControls:DataFormComboBoxField />

                <dataControls:DataFormDateField />

                <dataControls:DataFormTemplateField />

                <dataControls:DataFormTextField />

            </dataControls:DataForm.Fields>

        </dataControls:DataForm>

Yukarıdaki kod çalışır bir kod olmayacaktır. Fakat kabaca bir DataForm'un içerisinde gösterilecek verilerin ayarlanması ile ilgili kullanabileceğimiz Field tiplerini ve DataForm içerisine nasıl yerleştirebileceğimizi inceleyebilirsiniz. Bu Field tiplerinin her biri aslında farklı veri tiplerini hedefliyorlar. Örneğin CheckBoxField Boolean tipindeki verilerin gösterimi için rahatlıkla kullanılabilirken TextField ise metin tabanlı ve özünde TextBox olarak gösterilecek verileri temsil edecektir. Eğer bu Field tipleri size yeterli gelmiyorsa ve kendi özel Field tasarımınızı yaratmak istiyorsanız bu sefer de DataFormTemplateField'i kullanabilirsiniz.

[XAML]

        <dataControls:DataForm

           AutoGenerateFields="False"

           x:Name="birDataForm">

            <dataControls:DataForm.Fields>

                <dataControls:DataFormTextField

                   FieldLabelContent="Kayıt Adı"

                   Binding="{Binding Adi}" />

                <dataControls:DataFormTextField

                   FieldLabelContent="Satış Sayısı"

                   Binding="{Binding Satis}" />

            </dataControls:DataForm.Fields>

        </dataControls:DataForm>

Bir önceki adımda veri bağlantısını da yaptığımız DataForm üzerinden ilerlersek ilk olarak AutoGenerateFields özelliğini False olarak ayarlayıp sonrasında da iki tane TextField ekliyoruz. Her bir TextField'in veri kaynağından hangi veriyi alıp göstereceğini belirlemek için tabi ki veri kaynağımız olan nesnelerin property'lerine ait adları vermemiz gerekiyor. Bu aşamada her bir Field'in Binding özelliğine bir Binding atıyoruz ve Property adı ile veri bağlantısını da tamamlıyoruz. Son olarak yine her bir TextField'e de FieldLabelContent vererek bu Field'ler için yaratılacak TextBox'ların yanına konacak Label'ların da içeriğini belirlemiş oluyoruz. Ayrıca isterseniz FieldLabelPosition gibi Field'lere ayrı farklı özellikleri de değiştirerek ana görsel öğelerin dizilimine müdahale edebilirsiniz.

Eğer DataForm kontrolüne bağladığınız nesnelerin çok sayıda Property'si varsa bunları belirli gruplar ve altbaşlıklar ile de göstermek isteyebilirsiniz. Bunun için DataFormFieldGroup nesnesini kullanabilir hatta bu grupların arasına da DataFormSeparator'lar koyabilirsiniz.

[XAML]

        <dataControls:DataForm

           AutoGenerateFields="False"

           x:Name="birDataForm">

            <dataControls:DataForm.Fields>

                <dataControls:DataFormHeader

                   Content="Düzenlenecek şeyler" />

                <dataControls:DataFormSeparator />

                <dataControls:DataFormFieldGroup

                   Orientation="Horizontal">

                    <dataControls:DataFormTextField

                       FieldLabelPosition="Top"

                       FieldLabelContent="Kayıt Adı"

                       Binding="{Binding Adi}" />

                    <dataControls:DataFormTextField

                       FieldLabelPosition="Top"

                       FieldLabelContent="Satış Sayısı"

                       Binding="{Binding Satis}" />

                </dataControls:DataFormFieldGroup>

            </dataControls:DataForm.Fields>

        </dataControls:DataForm>

Yukarıdaki kod içerisinde ilk olarak bir FormHeader bulunuyor. Sonrasında bir Separator da kullandıktan sonra elimizdeki TextField'leri bir Fieldgroup içerisine aldık. FieldGroup'un Orientation özelliğini de Horizontal yaptığımızda artık bu grup içerisindeki kayıt düzenleme nesneleri yan yana gösterilecektir.

Özelleştirilmiş bir DataForm kontrolü.
Özelleştirilmiş bir DataForm kontrolü.

Daha da özelleştirelim, daha da!

Eğer yukarıdaki Field yapılarını özelleştirmek sizin ihtiyaçlarınızı gidermediyse aslında bir adım daha ileri giderek tüm görsel yapıyı değiştirme şansınız da var. Bunun için artık DataForm'un DisplayTemplate ve EditTemplate özelliklerine eğilmemiz şart.

[XAML]

        <dataControls:DataForm

           AutoGenerateFields="False"

           x:Name="birDataForm">

            <dataControls:DataForm.HeaderTemplate>

                <DataTemplate></DataTemplate>

            </dataControls:DataForm.HeaderTemplate>

            <dataControls:DataForm.DisplayTemplate>

                <DataTemplate></DataTemplate>

            </dataControls:DataForm.DisplayTemplate>

            <dataControls:DataForm.EditTemplate>

                <DataTemplate></DataTemplate>

            </dataControls:DataForm.EditTemplate>

            <dataControls:DataForm.InsertTemplate>

                <DataTemplate></DataTemplate>

            </dataControls:DataForm.InsertTemplate>

        </dataControls:DataForm>

Yukarıda gördüğünüz şekilde düzenlenen Template / Şablon yapıları birer DataTemplate olarak tanımlanır ve bu şablonlar içerisinde tanımlı görsel tasarımlar doğrudan DataForm kontrolü tarafından kullanılır.

[XAML]

        <dataControls:DataForm

           AutoGenerateFields="False"

           x:Name="birDataForm">

            <dataControls:DataForm.DisplayTemplate>

                <DataTemplate>

                    <StackPanel>

                        <TextBlock

                           Text="{Binding Adi}"></TextBlock>

                        <TextBlock

                           Text="{Binding Satis}"></TextBlock>

                    </StackPanel>

                </DataTemplate>

            </dataControls:DataForm.DisplayTemplate>

            <dataControls:DataForm.EditTemplate>

                <DataTemplate>

                    <StackPanel>

                        <TextBox

                           Text="{Binding Adi}"></TextBox>

                        <TextBox

                           Text="{Binding Satis}"></TextBox>

                    </StackPanel>

                </DataTemplate>

            </dataControls:DataForm.EditTemplate>

        </dataControls:DataForm>

Yukarıdaki XAMl içerisinde DataForm kontrolümüzün DisplayTemplate ve EditTemplate şablonlarına basit birer StackPanel yerleştiriyoruz. Bu StackPanel'ler içerisinde DisplayTemplate'te TextBlock'lar var, EditTemplate'te ise TextBox'lar var. Tüm bu kontrollerin Text özellikleri veri kaynağından uygun Property'lere bağlı durumda. Veri bağlama işlemini yine klasik Binding sistemi ile yapıyoruz. Kontrol normalde TextBlock'ları gösterirken düzenleme moduna geçince ise EditTemplate içerisindeki TextBox'ları gösterecektir. Tabi siz örneklerinizde basit birer StackPanel yerine çok daha özelleştirilmiş görsel tasarımlar kullanabilirsiniz.

Sonuç

Görüldüğü üzere DataForm kontrolü kendisinden beklenenden çok daha fazlasını sunabilecek bir kontrol olarak karşımızda. İş uygulamalarında sürekli hazırladığınız çoğu formun Silverlight içerisinde rahatlıkla ve en önemlisi de hızlı bir şekilde oluşturulabilmesini sağlıyor. İster basit ister karışık validasyon kurallarınız olsun, ister basit ister karışık ve özelleştirilmiş bir tasarımınız olsun DataForm kontrolü her durumda size uyum sağlayabilecek şekilde tasarlanmış. Eh hadi ;) Sıra sizde...

Hepinize kolay gelsin....

Wednesday, April 15, 2009 9:40:37 AM (GTB Standard Time, UTC+02:00)  #    Comments [4]   Silverlight 3.0  | 
 Tuesday, April 14, 2009

Bugün Elazığ, Fırat Üniversitesi'ndeydim. İlk önce bir WPF oturumu yaptık ve ufak bir mola sonrasında da Silverlight 3.0 dünyasına giriş yaptık. Özellikle öğrencilerin çoğunun .NET dillerinden en azından biri ile haşır neşir olduğunu görmek beni çok mutlu etti. Her zamanki gibi anlatacak şeyler bitmedi de bitmedi. Bir ara sanırım epey hızlı konuşmaya başladım ki görevli arkadaşlar beni gözleri ile uyardı :)

Elazığ, Fırat Üniversitesi, Silverlight 3.0 ve WPF Seminerlerim
Elazığ, Fırat Üniversitesi, Silverlight 3.0 ve WPF Seminerlerim

Buradan özellikle sevgili IEEE ekibine ve İbrahim Rıza Hallaç'a çok teşekkür ediyorum. Hocalarının da desteği ile gerçekten güzel bir şekilde ev sahipliği yaptılar diyebilirim. Umarım bir dahakine daha uzun süre kalma şansım olur ve LAB'lar da yaparak mutfakta ellerimizi kirletiriz biraz :)

Hepinize öpücükler...

Tuesday, April 14, 2009 10:13:12 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 3.0 | WPF  | 
 Monday, April 13, 2009

Bugün Antalya'nın güzel havasında Akdeniz Üniversitesi'nin düzenlediği Internet Haftası etkinliğindeydim. Etkinliğin son oturumunda genç kardeşlerimle "Kullanıcı Deneyimi"nin yazılım dünyasındaki öneminden bahsettik. Bu çerçevede hızlı örnekler ile hem WPF hem de Silverlight 3.0'a göz gezdirerek hali hazırda bilgi birikimimiz ile daha zengin kullanıcı deneyimlerini nasıl sağlayabiliriz sorusuna cevap aradık.

Antalya, Akdeniz Üniversitesi, Silverlight 3.0 Seminerim
Antalya, Akdeniz Üniversitesi, Silverlight 3.0 Seminerim

Etkinlikte ben yılmadan dinleyen :) herkese buradan defalarca teşekkürler. En kısa zamanda daha geniş çaplı teknik ağırlıklı bir etkinlik ile tekrar görüşmek ümidi ile...

Monday, April 13, 2009 10:10:48 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 3.0  | 
 Sunday, April 12, 2009

Bu hafta sonu bildiğiniz üzere INETA NEXT HİT'deydik! İlk gün sevgili Mehmet Nuri Çankaya'nın Windows 7 oturumundan sonra ben de ilk Silverlight 3.0 seminerimi sunmuş oldum. Sonrasında Doruk.NET'ten Vahriç Muhtaryan ve MVP'lerimizden Muammer Benzeş Hyper-V oturumda bizimle oldular. İkinci günün programındaki sürprizi ilk günün sonunda açıklamıştım :) ve ikinci güne "WPF ve MultiTouch" semineri ile başladık. Biraz donanım tabanlı sorunlar yaşamamıza rağmen hem MultiTouch hem de MultiPoint programlamaya bakma şansımız oldu. Bir sonraki oturumda yine Muammer bizimle oldu ve PHP On Windows oturumunu sundu. Öğle yemeğinden sonra yine MVP'lerimizden Uğur Umutluoğlu ASP.NET 4.0 ile gelen yeniliklerden Visual Studio 2010 üzerinde bahsederken Burak Selim Şenyurt da WCF ve WF 4.0'a hızlı bir giriş sağladı.

INETA NEXT'in sonundan bir kare...
INETA NEXT'in sonundan bir kare...

Tüm bu maraton içerisinde eminim ki hatalarımız da olmuştur. Umarım özünde yararlı bir hafta sonu ile herkes mutlu mesut ayrılmıştır.  Kendi adıma gerçekten güzel ve zevkliydi. Tüm oturumlarımda yaptığım örnekleri ve ek dosyaları topladım, hepsini aşağıdan indirebilirsiniz.

Silverlight 3.0 Sunumu ve Örnekleri (12042009_2.rar - 33,4 MB)
WPF ve Multitouch Sunumu ve Örnekleri (12042009_2.rar - 31,7 MB)

Sunday, April 12, 2009 8:52:10 AM (GTB Standard Time, UTC+02:00)  #    Comments [2]   Silverlight 3.0  | 
 Saturday, April 11, 2009

Bugün INETA NEXT'in ilk gününde Silverlight 3.0 oturumunu gerçekleştirdim. Benim de ilk Silverlight 3.0 oturumumda. Zamanlama açısından içeriği tam oturtsam da akıcılık açısından istediğimi yakaladım diyemem. Neyse zamanla hallolur o konu da :) SL 3.0 daha çok yeni.

Artık önümüzdeki günlerde Silverlight 3.0 ile ilgili makalelerimi yazmaya başlayacağıma dair müjdeyi sizlerle paylaşırken bu yazımda hafif bir giriş yaparak sonraki günlerde üzerinde çalışacağımız konularla ilgili gerekli altyapıyı bilgisayarınızda nasıl oluşturabileceğinize değineceğim.

Şu an yayında bulunan Silverlight 3.0 sürümünün Beta'sıdır, yani bir anlamda test sürümüdür diyebiliriz. Hali hazırda bu sürüm ile hazırlanmış Silverlight uygulamalarını çalıştırabilmeniz için de tabi ki Silverlight 3.0 RunTime'ın bilgisayarınızda kurulu olması gerekiyor. İşte tam da bu noktada aslında Microsoft bize ufak ip uçları veriyor. Şu anda Silverlight 3.0'ın RunTime'ını haricen indirebileceğiniz herhangi bir adres yok. Runtime sadece Silverlight 3.0'ın SDK'sını da içeren yazılımcılar için hazırlanmış yükleme paketi içerisinde bulunuyor. Silverlight 2.0 zamanlarında da bildiğimiz üzere bu şekilde yazılımcılar için hazırlanmış paketlerin içindeki RunTime'lar da aynı şekilde "Developer Runtime" olarak karşımıza çıkıyordu ve yazılımcılar için debugging vs gibi konularda yardımcı olacak altyapılar sunuyordu. Sözün özü şudur ki; Silverlight 3.0'ın şu anda sadece Developer Runtime'ı var! Yani bu uygulamalarını dağıtmak mümkün değil. Zaten lisans olarak da şu anda Go-Live lisansı yok, hazırladığınız uygulamaları müşterilerinize açmanız, satmanız vs resmi olarak mümkün değil.

Tüm bu ticari detayları atladıktan sonra gelelim bir de teknik detaylara. Silverlight 3.0 Beta olarak geldiğine göre tüm beta yazılımlarda olduğu üzere Silverlight 3.0'ı da normal kullandığınız makineye yüklememenize fayda var. Beta yazılımların yüklenmesinden sisteminize gelebilecek olası zararlarda Microsoft dahil kimse sorumluluk kabul etmez. Diğer yandan eğer ki hali hazırda Silverlight 2.0 uygulamaları geliştiriyorsanız zaten Silverlight 3.0 yüklemelerini de kesinlikle yapmamaız gerekiyor. Beta aşamasında Silverlight 3.0 ile 2.0 arasında bir "targeting" sistemi yok. Bilgisayarınız SL 3.0 yüklerseniz artık Visual Studio içerisinde 2.0 projeleri yaratamazsınız. Bu konuda farklı taktikler kullanmak mümkün olsa da benim kişisel tavsiyem SL 3.0'a harici bir işletim sisteminde denemenizdir.

Neler yüklemek lazım?

Silverlight 2.0 zamanlarından da alışık olduğunuz üzere yine Visual Studio 2008 SP1 üzerine kurulması gereken bir Tools paketimiz var. Bu paket içerisinde Silverlight 3.0 için gerekli proje şablonları, Visual Studio intellisense desteği, SDK ve Developer Runtime bulunuyor. Söz konusu tüm yüklemeleri aşağıdaki adresten bulabilirsiniz.

http://silverlight.net/getstarted/silverlight3/default.aspx

Silverlight 3 Beta Tools for Visual Studio yüklemesini tamamladıktan sonra sıra geliyor Expression Blend 3 ile ilgili yüklemelere. Hemen Blend 3'ün şu an yayında olan MIX Preview sürümünü de indirerek bilgisayarınıza yükleyin. Aksi halde SL 3.0 projelerini eski Blend 2.0 ile açarsanız maalesef SL 3.0'ın özelliklerine dair destek bulamazsınız.

Tüm bunların haricinde yapabileceğiniz birkaç minik ayrı yükleme daha var fakat onlar farklı senaryolara özel olduğu için bu yazıda bahsetmeyeceğiz. İleriki yazılarda gerektikçe o yüklemeleri de ele alır ve kullanımlar ile beraber inceleriz.

Hadi bakalı, hazır mısınız? :)

Saturday, April 11, 2009 10:01:08 PM (GTB Standard Time, UTC+02:00)  #    Comments [7]   Silverlight 3.0  | 
 Friday, April 03, 2009

İki gündür Adana, Çukurova Üniversitesi'ndeydim. İlk gün Microsoft'un Gençsen Geleceksin etkinliğinde konuşmacı olduktan sonra ikinci gün de teknik oturumlar ile Silverlight 3.0 ve WPF üzerine eğildik. Sanırım Türkiye'de ilk defa Silverlight 3.0 seminerini de kısmen Adana'da yapmış olduk fakat itiraf etmem gerek :) daha anlatmadığım çok şey var.

Adana, Çukurova Üniversitesi
Adana, Çukurova Üniversitesi

Benim için gerçekten çok eğlenceli ve tabi ki bol bol "Adana" yenilen bir etkinlik oldu. Ayrıca şehrin ve üniversitenin etrafındaki doğaya hayran kaldığımı da söylemem gerek. Muhteşem fotoğraflar çekme şansım oldu :)

Adana'dan bir manzara!
Adana'dan bir manzara!

Buradan özellikle etkinlik boyunca beni yalnız bırakmayan hatta muhteşem bir şekilde ağırlayan IEEE ekibine binlerce teşekkürler. Sevgili Erdil Tengiz kardeşime de özellikle öpücükler :) Aklınızda bulunsun Adana'da kebapçıya giderseniz Erdil veya IEEE kelimelerini kullanırsanız hesap ödemiyorsunuz :) İşin güzel tarafı Erdil de ödemiyor :D

Neyse :) etkinliğe katılan tüm dostlara ve kardeşlerime çok teşekkür ediyorum, umarım olabildiğince faydalı bir etkinlik olmuştur. En kısa zamanda tekrar görüşmek üzere...

Friday, April 03, 2009 12:41:05 AM (GTB Standard Time, UTC+02:00)  #    Comments [5]   Silverlight 3.0 | WPF  | 
 Thursday, April 02, 2009

Microsoft'un Imagine Cup yarışmasını çoğunuz duymuşsunuzdur. Duymayanlar en alt paragraftaki copy-past bilgiye başvurabilirler :) Gelelim esas konumuza. Imagine Cup 2009 başvuruları çoktan bitti hatta Türkiye finalleri yaklaşıyor. Ben de bu süreçte çoğu Imagine Cup ekibi ile tanışma hatta bazı sorunlarına da çözüm bulmaları için yardımcı olma şansına sahip oldum. Yarışmanın içerisinde bir de ayrıca Blogger yarışması düzenleniyor.

Yarışma çerçevesinde en ilginç Blog postu atana ödül ise Kahire, Mısır seyahati! Şimdi sizi duyuru metni ile başbaşa bırakıyorum.

Microsoft, klavyesine güvenen genç blog yazarlarını Imagine Cup Blogger Yarışması’na davet ediyor. Microsoft’un bu yıl yedincisini düzenlediği Imagine Cup yarışması, dünyada farklı alanlarda yeni yeteneklerin ve başarılı genç girişimcilerin keşfini sağlayan uluslararası bir etkinlik olarak haklı bir üne sahip. Her yıl tüm dünyadan yüz binlerce gencin başvurduğu bu yarışmada, Türkiye’den öğrenciler de projelerini uluslararası platformda sergileme şansı yakalıyor.
Dünyada büyük yankı yaratan Imagine Cup yurt dışında ve Türkiye’de blog’lara güçlü bir şekilde yansıyor. Özellikle genç blog yazarları her yıl etkinlik hakkındaki duygu, düşünce ve gözlemlerini kendi sayfalarına aktarıyorlar.
Siz de genç bir blogger olarak Imagine Cup hakkında yazmış, yazıyor veya yazmayı düşünüyor ve hatta yarışıyor olabilirsiniz... Imagine Cup hakkındaki düşüncelerinizi ve izlenimlerinizi İnternet’te paylaşaral klavyenizin gücünü herkese gösterin...
Eğer blogger olarak “Imagine Cup’ı en güzel ben anlatırım” diyorsanız yarışmanın ödülü olarak sizi Temmuz ayında gizemli bir Mısır seyahati bekliyor...
Dünyanın her yerinden genç bilişimcilerle, çarpıcı projelerle ve Microsoft merkeziden temsilcilerle tanışmak ve Kahire’yi, Piramitler’i görmek isteyenler klavyenize kuvvet...
Konumuz Imagine Cup....

Web adresi: www.msakademik.net/icblog09
Başvuru tarihi: 1 Nisan – 17 Nisan 2009
Yarışma tarihi: 17 Nisan – 24 Nisan 2009
Sonuç açıklama: 12 Mayıs 2009

Katılımcılar, 17 Nisan’da Microsoft İstanbul ofiste yapılacak Yazılım Tasarımı Türkiye finaline katılarak veya canlı olarak yayınlanacak final etkinliğini bulundukları yerden izleme rahatlığıyla kendi bloglarında değerlendirme imkanı bulabilecek.

Imagine Cup hakkında...

Dünyada gençlerin en çok ilgilendiği yarışmalardan biri olan Imagine Cup genç blog yazarlarının da hakkında en çok görüş bildirdiği yarışmalar arasında yer alıyor. Her yıl yeni bir tema etrafında gerçekleştirilen Imagine Cup’ta gençler, bu yıl, Birleşmiş Milletler tarafından 2000 yılında duyurulan Binyıl Kalkınma Hedefleri doğrultusunda, yoksulluk, salgın hastalıklar, kadın erkek eşitsizliği, iklim değişikliği gibi sorunlar etrafında yaratıcı ve yenilikçi projelerini sunacaklar. Microsoft tarafından ilk olarak 2002 yılında düzenlenen Imagine Cup her yıl farklı bir temayı konu alıyor. Farklı ülkelerde yapılan yarışma finalinin ev sahipliğini sırasıyla 2003’de İspanya, 2004’de Brezilya, 2005’de Japonya, 2006’da Hindistan, 2007’de Güney Kore ve 2008’de Fransa üstlendi. Yarışmanın Mayıs ayında gerçekleşecek 2009 finalleri Mısır’da yapılacak.

Ben geçen sene Kahire'yi ziyaret etmiştim :) İlginç bir şehir olduğunu itiraf etmem gerek. Hepinizin şansı bol olsun!

Thursday, April 02, 2009 9:35:00 PM (GTB Standard Time, UTC+02:00)  #    Comments [2]    | 
 Wednesday, April 01, 2009

2009 Silverlight MVP'liği!Geçen yıl bugünlerde sizlerle ASP.NET alanında MVP olmamın müjdesini paylaşmıştım. Bu süreçte şöyle kabaca baktığımda son bir yılda 300'ü aşkın blogpost, 100'ü aşkın teknik makale ile bildiklerimi paylaşmaya çalışırken seminerler ile de hesabıma göre 15.000 kişiye ulaşmışım. İtiraf etmek gerekirse "önümüzde yılda daha fazlasını yapacağım" gibi bir iddiada bulunamam :) ama aynı tempo devam edecek diyebilirim.

Silverlight MVP'si oldum!

Bu yazıyı yazmamın esas nedeni sanırım belli oldu :) 2009 yılında da MVP ödülüne layık görüldüm. Bu sefer ödülü aldığım alan Silverlight oldu. Biraz şanslı bir olarak dünyadaki ilk Silverlight MVP'lerindenim çünkü bu uzmanlık alanı daha yeni açıldı :) Ortadoğu-Afrika bölgesinde ise en azından bu dönemde aldığım duyumlara göre tek Silverlight MVP'si olmuşum. Bu durum özellikle bölgede Türkiye'nin önderliği adına, kendi kendime mutlu olduğum bir detay oldu diyebilirim.

Hepinize bu süreçte gösterdiğiniz destek için çok teşekkür ediyorum.

Wednesday, April 01, 2009 10:53:32 PM (GTB Standard Time, UTC+02:00)  #    Comments [32]   Silverlight | Silverlight 2.0 | Silverlight 3.0  | 
Copyright © 2010 Daron Yöndem. Tüm hakları saklıdır.