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

INETA NEXT etkinliklerimizle ilgili duyuruyu bundan yaklaşık bir hafta önce sizinle paylaşmıştım. Maalesef o zamanlarda içeriği paylaşma şansımız yoktu çünkü içeriğimizde daha Microsoft tarafından lansmanı yapılmamış ürünlere dair oturumlar olacaktı :) Eh artık zamanı geldi ve içeriğimizi paylaşmaktan gurur duyuyorum.

Diyarbakır - Dicle Üniversitesi, Tıp Fakültesi Konferans Salonu
5 Aralık
11.00-12.30 Visual Basic  10 Yenilikleri - Daron Yöndem (yazgelistir.com)
14.00-15.30 Windows 7'de neler var? - Muammer Benzeş (birliktegelistir.com)
16.00-17.00 Silverlight 4 - Daron Yöndem (yazgelistir.com)
6 Aralık
11.00-12.30 C# 4.0 Yenilikleri - Erkan Balaban (ceviz.net)
14.00-15.30 WPF 4 ile 3D Animasyon Programlama - Daron Yöndem  (yazgelistir.com)
16.00-17.30 ASP.NET 4.0 - Erkan Balaban (ceviz.net)

İstanbul - Microsoft Ofisi (Kroki)
12 Aralık
;
10.00-11.00 Silverlight 4 - Daron Yöndem (yazgelistir.com)
11.00-12.00 ASP.NET MVC 2 - Oğuz Yağmur (csharpnedir.com)
14.00-15.00 IIS Media Services - Muammer Benzeş (birliktegelistir.com)
15.15-16.15 Visual Basic 10 Yenilikleri - Daron Yöndem (yazgelistir.com)
13 Aralık
11.00-12.30 ASP.NET 4.0 Yenilikleri - Uğur Umutluoğlu (nedirtv.com)
14.30-15.45 Workflow Foundation 4.0 - Burak Selim Şenyurt (csharpnedir.com)
16.00-17.00 C# 4.0 Yenilikleri - Erkan Balaban (ceviz.net)
17.15-18.00 IE 8 Toolbar Geliştirme  - Barış Kanlıca (yazgelistir.com)

Kayseri - Erciyes Üniversitesi Mühendislik Fakültesi Konferans Salonu
19 Aralık
11.00-12.30 C# 4.0 Yenilikleri -Burak Selim Şenyurt  (csharpnedir.com)
14.00-15.30 Silverlight 4 - Daron Yöndem (yazgelistir.com)
15.45-16.45 ASP.NET 4.0 - Selçuk Yavuz (ceviz.net)

20 Aralık
11.00-12.30 ASP.NET MVC 2 - Selçuk Yavuz (ceviz.net)
14.00-15.30 Visual Basic 10 Yenilikleri - Daron Yöndem (yazgelistir.com)
15.45-16.45 Workflow Foundation 4.0 - Burak Selim Şenyurt (csharpnedir.com) 

Denizli - Pamukkale Üniversitesi Kongre Kültür Merkezi Ana Salon
26 Aralık
11.00-12.30 Silverlight 4.0 - Daron Yöndem (yazgelistir.com)
14.00-15.30 C# 4.0 Yenilikleri - Oğuz Yağmur (csharpnedir.com)
15.45-16.45 Asp.NET 4.0 Yenilikleri - Uğur Umutluoğlu (nedirtv.com)
27 Aralık
11.00-.12.30 Visual Basic 10 Yenilikleri - Daron Yöndem (yazgelistir.com)
14.00-15.30 Asp.NET MVC 2 - Oğuz Yağmur (csharpnedir.com)
15.45-16.45 ASP.NET AJAX 4.0 - Uğur Umutluoğlu (nedirtv.com)

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

Bu arada ilk etkinlik duyurumuzda da yer alan "Bir katılımcıya yeni bir beyin verilecektir" :) cümlesi biraz merak uyandırmış. Zaten amacı da buydu söz konusu cümlenin. Merak etmeye devam etmeniz gerekecek fakat emin olun bir katılımcıya çekilişle yeni bir beyin vereceğiz :) Bizde yalan yok :) Ayrıca birçok da sürpriz hediye olacak, benden söylemesi.

Sunday, November 29, 2009 2:43:22 PM (GTB Standard Time, UTC+02:00)  #    Comments [11]   .NET Framework 4.0 | ASP.NET | ASP.NET 4.0 | C# | IIS 7.0 | Seminer | Silverlight 4 | Visual Basic 2010 | Visual Studio 2010 | WCF | WF | Windows 7 | WPF  | 
 Saturday, November 28, 2009

Notification deyince aklınıza büyük ihtimal ile Outlook'un veya Live Messenger'ın alttan çıkan minik pencereleri gelecektir. Çok sıklaşmaması halinde gerçekten güzel bir kullanıcı deneyimi sağlayan Notification pencerelerini Silverlight 4 ile beraber de isterseniz OOB (Out Of Browser) modunda kullanabiliyorsunuz. Hem de tamamen özelleştirilebilir bir tasarımla.

Notification sınıfı....

Silverlight içerisinde gelen hazır notification sınıfı elinizdeki herhangi bir content'i Notification olarak gösterebilmemizi sağlıyor fakat bu sınıfın içerisinde hazır herhangi bir tasarım gelmiyor. O nedenle yarattığımız her Notification için vereceğimiz Content aslında tüm kontrolün kendi tasarımını barındıracak.

[VB]

    Private Sub btnTikla_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnTikla.Click

        Dim Uyari As New NotificationWindow

        Uyari.Content = New TextBlock With {.Text = "Deneme"}

        Uyari.Show(2000)

    End Sub

Yukarıdaki gibi basit bir şekilde yaratılabilen NotificationWindow'lar Content'leri verildikten sonra Show metodları ile gösterilebiliyorlar. Show metodu parametre olarak notification'ın gösterileceği süreyi milisaniye olarak alıyor. Yani bizim örneğimizde Notification tam 2 saniye boyunca gösterilecek. Aynı anda maalesef tek bir notification gösterebiliyoruz. Eğer aynı anda birden çok NotificationWindow yaratılır ve Show metodları çağrılırsa her zaman en son çalışan gösterilecektir. Bu nedenle belki bu konuda bir kuyruk/helper sistemini elle yazıp implemente etmeniz mantıklı olabilir.

Varsayılan ayarları ile basit bir NotificationWindow.
Varsayılan ayarları ile basit bir NotificationWindow.

Tabi hiçbir zaman yukarıdaki gibi basit bir NotificationWindow işinizi görmeyecektir. İşin güzel tarafı NotificationWindow sınıfının Content Property'sine herhangi bir UIElement'i verebiliyoruz. Haricen yaratılmş bir UserControl bunun için en uygun aday olabilir. Söz konusu UserControl kendi içerisine apayrı bir tasarım saklayabilir, hatta kendi içerisinde farklı Button'lar vs interaksyon kontrolleri de barındırabilir böylece kullanıcılar NotificationWindow'larda belirli yerlere tıklayarak uygulamanıza mesaj da gönderebilir.

Bu amaçla gelin beraber sıfırdan bir UserControl tasarlayalım. Söz konusu UserControl'ü Blend içerisinde istediğiniz gibi tasarlayabilirsiniz. Bizim örneğimizde önemli olan bu UserControl'ün içerisinde olası bir mesajı gösterecek bir TextBlock'un ve bir de tıklanabilir Button'un bulunması.

[XAML]

<UserControl x:Class="SilverlightApplication31.SilverlightControl1"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400" Width="400" Height="100">

 

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

        <Grid.RowDefinitions>

            <RowDefinition Height="0.13*"/>

            <RowDefinition Height="0.6*"/>

            <RowDefinition Height="0.27*"/>

        </Grid.RowDefinitions>

        <Rectangle Grid.RowSpan="1">

            <Rectangle.Fill>

                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">

                    <GradientStop Color="Black" Offset="1"/>

                    <GradientStop Color="#FFC6C6C6"/>

                </LinearGradientBrush>

            </Rectangle.Fill>

        </Rectangle>

        <Rectangle Grid.RowSpan="2" Grid.Row="1">

            <Rectangle.Fill>

                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">

                    <GradientStop Color="#FF8B8B8B"/>

                    <GradientStop Color="#FFC6C6C6" Offset="1"/>

                </LinearGradientBrush>

            </Rectangle.Fill>

        </Rectangle>

        <Button x:Name="btnOK" Content="OK" HorizontalAlignment="Right" Width="75" d:LayoutOverrides="Height" Grid.Row="2" Margin="5,0,5,5"/>

        <TextBlock x:Name="txtMesaj" Margin="10" TextWrapping="Wrap" Text="TextBlock" d:LayoutOverrides="Height" Grid.Row="1"/>

    </Grid>

</UserControl>

Yukarıdaki XAML kodu giriş seviyesi bir tasarım için yeterli olacaktır. UserControl içerisinde önemli olan bir OK düğmesinin ve bir de txtMesaj adında TextBlock'un bulunması. Bu kontrollerin işlevselliği ayrıca programlayacağız.

[VB]

Partial Public Class SilverlightControl1

    Inherits UserControl

 

    Public Sub New

        InitializeComponent()

    End Sub

 

    Private PMesaj As String

    Public Property Mesaj() As String

        Get

            Return PMesaj

        End Get

        Set(ByVal value As String)

            PMesaj = value

            txtMesaj.Text = PMesaj

        End Set

    End Property

 

    Public Event OK()

 

    Private Sub btnOK_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnOK.Click

        RaiseEvent OK()

    End Sub

End Class

UserControl'ümüzün arkasındaki kodu baktığımızda Mesaj adında bir Property ve OK adında bir de event görüyoruz. Mesaj Property'si dışarıdan alınan bir mesaj metninin içerideki TextBlock'a aktarılması için kullanılıyor. OK event'ı ise içerideki Button kontrolünün Click eventını dışarıya haber veriyor. Bu özellikler duruma göre zenginleştirilebilir. Örneğin konsept seviyesinde kalması için çok üzerinde durmaya şimdilik gerek yok.

Sıra geldi artık bu UserControl'ü NotificationWindow ile beraber kullanmaya. Tek yapmamız gereken bu UserControl'den bir kopya alıp NotificationWindow sınıfına content olarak vermek.

[VB]

    Private Sub btnTikla_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnTikla.Click

        Dim Uyari As New NotificationWindow

        Dim X As New SilverlightControl1

        X.Mesaj = "Bu bir uyarı mesajıdır"

        AddHandler X.OK, Sub()

                             MessageBox.Show("OK")

                         End Sub

        Uyari.Content = X

        Uyari.Show(2000)

    End Sub

Kod içerisinde de gördüğünüz üzere Mesaj değerini aktardıktan sonra bir de OK eventına event-listener ataçlıyoruz. NotificationWindow içerisinde OK düğmesine basıldığında şimdilik basit bir MessageBox göstereceğiz.

NotificationWindow özel tasarımı ile karşınızda.<
NotificationWindow özel tasarımı ile karşınızda./p>

Gördüğünüz gibi ufak bir tasarım değişikliği bile NotificationWindow'u çok daha profesyonel hale dönüştürebiliyor. UserControl içerisinde kullanabileceğiniz animasyonlardan tutun diğer işlevselliklere kadar bu deneyimi çok daha zenginleştirmeniz mümkün.

Hepinize kolay gelsin.

Saturday, November 28, 2009 9:39:07 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4  | 
 Friday, November 27, 2009

Web uygulamaları ile masaüstü deneyimini birbiri ile konuşturmak aslında çok önemli özelliklerden biri. Bu çerçevede iletişim olarak adlandırdığımız şey basit bir şekilde dosyalara erişim bile olabilir. Bir web uygulamasının kullanıcının onayı ile kullanıcıya ait bir dosyaya erişmesi için bugün kullanabileceğimiz metodlardan en uygunu bir OpenFileDialog kullanmak gibi gözükse de aslında OpenFileDialog'un yaptığı işi doğrudan bir "Sürükle/Bırak" işlemi ile de yapabiliriz. Maalesef bu gibi bir altyapıyı özellikle masaüstünden web uygulamasına doğru oluşturmak ciddi emek gerektiriyor.

Silverlight 4 Beta ile beraber artık herhangi bir Silverlight uygulamasını Sürükle/Bırak işlemlerinde kullanabiliyoruz ve kullanıcılar masaüstünden veya işletim sisteminin herhangi bir konumundan aldıkları dosyayı sürükle&bırak tekniği ile web uygulamasına, silverlight'a bırakabiliyorlar. Aynı sistem tabi ki Silverlight'ın masaüstüne alındığı OOB (Out Of Browser) modunda da çalışıyor. Böylece kullanıcılar için çok daha rahat ve kullanışlı bir ortam, web ile masaüstü arasında kolay bir köprü kurulabiliyor.

Masaüstünden al webe bırak!

Örneğimizde geliştireceğimiz uygulama sürükle&bırak tekniği ile kullanıcıların bilgisayarlarından resimleri atabilecekleri bir web uygulaması olacak. Silverlight projemiz aldığı resimleri bir ListBox içerisinde listeyecek ve ListBox'tan seçilen resim de sağ tarafta uygulama içerisinde gösterilebilecek.

İsterseniz ilk olarak uygulamamızın görsel arayüzünü hazırlayalım ve bir Grid içerisinde iki kolon yaratarak kolonlardan birine uygun bir ListBox diğerine de bir Image nesnesi yerleştirelim. Bu kontrolleri sırası ile listResimler ve imgResim isimlerini vererek devam edebiliriz.

[XAML]

<UserControl x:Class="SilverlightApplication26.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400">

 

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

        <Grid.ColumnDefinitions>

            <ColumnDefinition Width="0.325*"/>

            <ColumnDefinition Width="0.675*"/>

        </Grid.ColumnDefinitions>

        <ListBox x:Name="listResimler" Margin="5" AllowDrop="True"/>

        <Image x:Name="imgResim" Grid.Column="1" Margin="5"/>

 

    </Grid>

</UserControl>

Yukarıdaki XAML kodu uygulamamızın tasarımını yansıtırken aslında içerisinde önemli bir nokta var. Dikkat ettiyseniz ListBox'un AllowDrop adında bir özelliği var ve True olarak ayarlanmış durumda. İşte bu özellikle ile beraber artık ListBox'ımıza kullanıcılar işletim sisteminden dosyalar alarak atabilecekler. Siz örneklerinizde isterseniz farklı nesnelere de bu gibi işlevsellikler ekleyebilirsiniz.

İlk adımda uygulamamıza sürükle&bırak ile bırakılan tüm resimleri saklayacak olan bir FileInfo listesi yaratacağız. Malum Sürükle&Bırak işlemi web ortamında çalışırken aynı OpenFileDialog'da olduğu gibi Silverlight bize dosyaların full path'ini güvenlik nedeni ile vermeyecek. Bize sadece dosya içeriğine ve dosya özelliklerine ulaşabileceğimiz FileInfo nesneleri gelecek. Biz de bu nesneleri global bir değişkende tutarak bu değişkeni de sürekli uygulama içerisinde ListBox'ımıza bind edilmiş olarak muhafaza edeceğiz.

[VB]

    Dim Dosyalar As New System.Collections.ObjectModel.ObservableCollection(Of FileInfo)

 

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

        listResimler.DisplayMemberPath = "Name"

        listResimler.ItemsSource = Dosyalar

    End Sub

Her FileInfo sınıfında dosyanın adı Name Property'si altında saklanır. O nedenle uygulama ilk açıldığında ListBox ile yaptığımız bindingde de ListBox'ın dosya isimlerini göstermesi için "Name" pathini DisplayMemberPath olarak veriyoruz. Elimizde bir ObservableCollection olduğuna göre biz ne zaman bu kolleksiyona bir nesne eklesek otomatik olarak ListBox'da da gözükeceğinden eminiz. Şimdi sıra geldi kullanıcılar resimleri ListBox'un üzerine bırakınca o resimleri yakalayıp bu listeye eklemeye.

[VB]

    Private Sub listResimler_Drop(ByVal sender As Object, ByVal e As System.Windows.DragEventArgs) Handles listResimler.Drop

        If e.Data IsNot Nothing AndAlso e.Data.GetDataPresent(DataFormats.FileDrop) Then

            For Each Dosya As FileInfo In e.Data.GetData(DataFormats.FileDrop)

                Dosyalar.Add(Dosya)

            Next

        End If

    End Sub

Gördüğünüz üzere ListBox'un Drop eventını yakalayarak işe başlayabiliyoruz. Bu event kullanıcılar ListBox'a birşey bıraktıkları anda çalışacaktır. Argüman üzerinden yola çıkara ilk olarak ortada bir Data var mı yoksa yok mu kontrolünü yapıp sonra da gelen data bir FileDrop mudurun kontrolünü yapıyoruz. Zaten şu anda Silverlight tarafında tek desteklenen de bu format.

Tüm kontrolerden geçtikten sonra Data üzerinden GetData diyerek uygulamaya bırakılan tüm veriyi alabiliriz. GetData geriye bir FileInfo array'i döndürecektir. Bu array içerisinde gezerek tek tek her FileInfo'yu hemen kendi yarattığımız listeye ekliyoruz. Tabi ki listemiz ObservableCollection olduğu için eklenen her resim de anında ListBox içerisinde gözüküyor! Süper!

Şimdi sıra geldi bu resimlerden yani aslında FileInfo'ların içlerinden ListBox'da biri seçildiğinde resim bilgisini alıp sağdaki Image nesnesinde göstermeye.

[VB]

    Private Sub listResimler_SelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles listResimler.SelectionChanged

        Dim SeciliFile As FileInfo = listResimler.SelectedItem

 

        Dim Foto As New BitmapImage

        Foto.SetSource(SeciliFile.OpenRead)

        imgResim.Source = Foto

 

    End Sub

ListBox'ın SelectionChanged eventını yakaladıktan sonra SelectedItem'ı da bir FileInfo'ya cast ediyoruz. Zaten ListBox'a FileInfo kolleksiyonu bind ettiğimize göre geriye bir FileInfo dönmesi çok normal. Gelen FileInfo'nun OpenRead metodu ile aldığımız FileStream'i hemen bir BitmapImage'a kaynak vererek onu da uygulamamızdaki Image nesnesine Source olarak veriyoruz. İşlem tamam.

Masaüstünden webe Sürükle&Bırak!
Masaüstünden webe Sürükle&Bırak!

Artık uygulamamız tarayıcı içerisinde çalışırken işletim sisteminden resim dosyalarını alıp ListBox'a sürükleyip bırakabiliriz. Sonrasında da ListBox içerisinden istediğimiz resmi seçiip ön izlemesini de yapabiliriz. Bundan sonrasında yaratılabilecek her türlü işlevsellik artık size kalıyor. Unutmayın ki bu sistem aynen OOB (Out Of Browser) modunda da kullanılabiliyor.

Kullanıcılarınıza Sürükle&Bırak işlemini daha çarpıcı bir şekilde hissetirebilmek için isterseniz kontrollerin DragEnter, DragLeave, DragMove gibi eventlarını da yakalayarak ekranda görsel değişiklikler yapabilirsiniz. Böylece kullanıcıların ellerindeki dosyaları tam olarak bırakabilecekleri yerde olup olmadıklarını daha rahat anlayabilirler.

Hepinize kolay gelsin.

Friday, November 27, 2009 9:38:19 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4  | 
 Thursday, November 26, 2009

Silverlight 2 sonrasında CLR'a geçiş ve 3 ile gelen yeni özellikler çerçevesinde en sık aldığım sorulardan biri Mikrofon ve Ses kartı erişiminin olup olmadığıydı. Silverlight 4 ile beraber her iki donanıma da doğrudan erişim geliyor. Bu erişim ile çok farklı uygulamalar geliştirmek mümkün, ister görüntülü chat sistemleri, ister Silverlight içerisinde doğrudan harici bir görüntü kaynağından gelen görüntüyü proses eden barkod okuma uygulamaları olsun çok ilginç çözümler geliştirilebilir. Biz bu yazımızda Silverlight 4 Beta içerisinden kamera erişimine göz atacağız ve kamera görüntüsünden de bir kare almaya çalışacağız. Aldığınız fotoğrafı sonrasında ister sunucuya gönderebilir ister doğrudan kullanıcıya verebilirsiniz.

Kamera'ya nasıl ulaşırız?

Silverlight içerisinden sistemde bulunan tüm kameraların bir listesini alabilir ve özelliklerine göre kamera seçebilirsiniz. Hatta söz konusu kameraların tek tek hangi çözünürlüklerde ve kalitede kayıt sağlayabileceğini de bulabilirsiniz.

[VB]

Partial Public Class MainPage

    Inherits UserControl

 

    Public Sub New()

        InitializeComponent()

    End Sub

 

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

        Dim Kameralar = CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices

        Dim Liste = From inc In Kameralar

                    From formats In inc.SupportedFormats

                    Select New Kamera With {.Adi = inc.FriendlyName,

                                             .Format = formats.FramesPerSecond & "fps," &

                                                formats.Width & "x" & formats.Height,

                                             .Varsayilan = inc.IsDefaultDevice}

 

        myGrid.ItemsSource = Liste

    End Sub

 

    Public Class Kamera

        Property Adi As String

        Property Format As String

        Property Varsayilan As Boolean

    End Class

End Class

Yukarıdaki örnek uygulamada ekran bir DataGrid bulunuyor. Bu gride CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices ile aldığımız tüm kameraları SupportedFormats dizilerindeki sağladıkları çözünürlüklerle beraber joinleyerek aktarıyoruz. Benim test makinemde tek kamera olduğu için aşağıdaki ekran görüntüsü ile karşılaştım.

Webcam'in desteklediğini ayarlar.
Webcam'in desteklediğini ayarlar.

Peki istediğimiz webcamden görüntüyü alıp nasıl gösterebiliriz?

İlk olarak kullanıcıdan izin almamız gerek. Eğer kullanıcı webcam erişimine izin vermez ise hiçbirşey yapamayız. Session bazında saklanan bu izni kullanıcıdan istemek için kullanacağımız metodun adı RequestDeviceAccess şeklinde.

[VB]

        Dim IzinVarMi = CaptureDeviceConfiguration.AllowedDeviceAccess

        If Not IzinVarMi Then IzinVarMi = CaptureDeviceConfiguration.RequestDeviceAccess

Yukarıdaki ilk satırda AllowedDeviceAccess ile ilk olarak o anda iznimiz var mı yoksa yok mu konusunu kontrol ediyoruz. Eğer iznimiz varsa tekrar kullanıcıdan izin istemek saçma olur. Eğer yoksa hemen bir alt satırda RequestDeviceAccess ile iznimizi istiyoruz.

Kullanıcıdan kameraya bağlanma izni istiyoruz.
Kullanıcıdan kameraya bağlanma izni istiyoruz.

İznimizi aldıktan sonra rahatlık istediğimiz bir Device'ı seçerek cihazdan veri kaynağını alabiliriz. Sistemde farklı mikrofon ve kameralar olabileceği için bunların kompinasyonundan bir CaptureSource yaratabiliyorsunuz. Bizim örneğimizde sadece kameraya ulaşacağımız için yaratacağımız CaptureSource'un sadece VideoCaptureDevice özelliğini set edeceğiz.

[VB]

            Dim Cihaz = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice

            Dim Kaynak As New CaptureSource

            Kaynak.VideoCaptureDevice = Cihaz

Tüm bu ayarları yaptıktan sonra sıra geliyor görüntü alma işlemini başlatmaya ve alacağımız görüntüyü de bir yerlerde göstermeye. Bunun için herhangi bir kontrolü kullanabilirsiniz çünkü görüntüyü bir VideoBrush aracılığı ile alacağız ve bildiğiniz üzere VideoBrush'ları da istediğimiz herhangi bir SL kontrolünde normal renk fırçaları gibi kullanabiliyoruz.

[VB]

            Dim Firca As New VideoBrush

            Firca.SetSource(Kaynak)

 

            Kaynak.Start()

            Dikdortgen.Fill = Firca

Yukarıdaki kodumuzda VideoBrush'ımızı yaratarak Source olarak eldeki CaptureSource'u veriyoruz. Sonrasında CaptureSource üzerinden görüntü veya ses yakalama işlemini başlatmak için Start metodunu çağırmayı unutmamak gerek. En son olarak da eldeki VideoBrush'a adı Dikdortgen olarak bir Rectangle'a basit bir şekilde aktarabiliriz.

Kamera görüntüsü karşınızda.
Kamera görüntüsü karşınızda.

Yukarıda gördüğünüz üzere kamera görüntüsünü almakla kalmayıp Silverlight'taki Transformasyon ve PixelShader özelliklerini de rahatlıkla bu görüntüler üzerine uygulayabiliyoruz. Uygulamanın tam kodlarını aşağıda bulabilirsiniz.

[VB]

    Private Sub btnTikla_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnTikla.Click

        Dim IzinVarMi = CaptureDeviceConfiguration.AllowedDeviceAccess

        If Not IzinVarMi Then IzinVarMi = CaptureDeviceConfiguration.RequestDeviceAccess

 

        If IzinVarMi Then

            Dim Cihaz = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice

            Dim Kaynak As New CaptureSource

            Kaynak.VideoCaptureDevice = Cihaz

 

            Dim Firca As New VideoBrush

            Firca.SetSource(Kaynak)

 

            Kaynak.Start()

            Dikdortgen.Fill = Firca

            Golge.Fill = Firca

        End If

    End Sub

[XAML]

<UserControl xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="SilverlightApplication25.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400">

 

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

        <Rectangle x:Name="Dikdortgen" Height="168" Width="249" Canvas.Left="20" Canvas.Top="19">

            <Rectangle.Effect>

                <BlurEffect Radius="15"/>

            </Rectangle.Effect>

        </Rectangle>

        <Button x:Name="btnTikla" Content="BAŞLAT" Height="25" Width="100" Canvas.Left="300" Canvas.Top="275" />

        <Rectangle x:Name="Golge" Height="67" Canvas.Left="27.207" Canvas.Top="191" Width="249" RenderTransformOrigin="0.5,0.5" UseLayoutRounding="False" d:LayoutRounding="Auto">

            <Rectangle.OpacityMask>

                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">

                    <GradientStop Color="Transparent" Offset="0"/>

                    <GradientStop Color="White" Offset="1"/>

                </LinearGradientBrush>

            </Rectangle.OpacityMask>

            <Rectangle.RenderTransform>

                <TransformGroup>

                    <ScaleTransform ScaleY="-1" ScaleX="1"/>

                    <SkewTransform AngleY="0" AngleX="52.651"/>

                    <RotateTransform Angle="0"/>

                    <TranslateTransform X="36.69"/>

                </TransformGroup>

            </Rectangle.RenderTransform>

        </Rectangle>

    </Canvas>

</UserControl>

Kameradan fotoğrafı nasıl yakalarız?

Kameranın görüntüsünden fotoğraf yakalayabilmeniz için hazır bir API doğrudan CaptureSource nesnesi üzerinden sunuluyor. Ama sunulan API'ın birkaç ufak sorunu var. Birincisi eğer yukarıdaki gibi görüntüye bir PixelShader eklediyseniz veya üzerine birşeyler bindirdiyseniz maalesef bunların hiçbiri aldığınız fotoğrafta yer almayacaktır. İkincisi ile eğer CaptureSource durdurulmuş ise son gelen kareyi alma şansınız olmuyor. Gelin yine de ilk önce bu API'ye bir göz atalım sonra da istersek daha farklı bir yöntem olarak ne uygulayabiliriz ona bakarız.

[VB]

    Private Sub btnTikla2_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnTikla2.Click

        If Kaynak IsNot Nothing Then

            Kaynak.AsyncCaptureImage(Sub(Foto)

                                                               Dispatcher.BeginInvoke(Sub()

                                                                                                          imgFoto.Source = Foto

                                                                                                     End Sub)

                                                         End Sub)

        End If

    End Sub

Yukarıdaki kod içerisinde Kaynak olarak geçen nesne bizim bir önceki örneğimizde başlattığımız CaptureSource nesnesi. Bu nesneyi UserControl içerisinde tanımlayarak farklı eventlarda kullanılabilir hale getirdikten sonra fotoğraf çekme işlemini yapacak düğmede nesnenin varlığını kontrol ederek işleme devam ediyoruz. CaptureSource üzerinden AsyncCaptureImage metodunu çağırdığınızda fotoğraf alma işlemini yaparak bir Callback'e düşüyor. Bu Callback'den geri veri döndürebilmek ve sahneye yeni koyduğumuz imgFoto adındaki Image nesnesine source aktarabilmek adına Dispatcher üzerinden UI Thread'e ulaşıyoruz. Tüm bunları lamdalarla yapınca iş epey kolayca halloluyor.

Fotoğrafımızı yakalayap sağa koyduk.
Fotoğrafımızı yakalayap sağa koyduk.

Gördüğünüz gibi aldığımız görüntü ana kaynaktan olduğu için Blur efekti vs uygulanmış değil. Oysa orta kısımda gördüğümüzün tam aynısını almak isterdi gönül. İşte böyle bir durumda doğrudan Silverlight 3 ile gelen WriteableBitmap sınıfını kullanabiliriz.

[VB]

    Private Sub btnTikla2_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnTikla2.Click

        Dim Goruntu As New Imaging.WriteableBitmap(Dikdortgen, Nothing)

        imgFoto.Source = Goruntu

    End Sub

Kodumuzda WriteableBitmap yaratırken ekranda hedef nesne olarak da Rectangle tipindeki Dikdortgen'imizi veriyoruz. Böylece Blur vs efektleri uygulanmış hali ile görüntüyü alabiliyoruz.

PixelShader efekti ile görüntüyü aldık.
PixelShader efekti ile görüntüyü aldık.

Artık aldığınız bu fotoğrafları işlemek veya doğrudan sunucuya bir web servisi aracılığı ile göndermek vs tamamen size kalmış. Hepinize kolay gelsin.

Thursday, November 26, 2009 9:36:45 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4  | 
 Wednesday, November 25, 2009

Silverlight projelerin Assembly paylaşımı en çok istediğimiz özelliklerden biriydi. Yanlış anlaşılmasın tabi ki .NET Framework Assembly'lerinin Silverlight ile kullanımından bahsetmiyoruz. Tam tersine Silverlight Assembly'lerinin .NET uygulamaları tarafından kullanımından bahsedeceğiz. Neden mi? Aslında şimdilik en ana nedeni Entity, Validasyon paylaşımı diyebiliriz. Genellikle Silverlight projelerimize referans aldığımız web servisleri ile beraber entitylerimiz de bir şekilde Silverlight tarafına gelse de pek çok farklı senaryoda bu yeterli olmayabiliyor. O nedenle hazırladığımız Assembly'leri hem ASP.NET, hem WPF, hem Winforms hem de SL tarafında kullanabiliyor olmak çok önemli.

Silverlight 4 Beta ile beraber "Assembly Paylaşımı" özelliği geliyor. Silverlight 4 için yazdığınız sınıf kütüphanalerini rahatlıkla .NET 4.0 projeleri ile paylaşabiliyorsunuz. Tabi dikkat edilmesi gereken nokta tamamen Silverlight'a özel sınıfları ve namespace'leri kullanmamış olmanız. Bu kurala uyduğunuz sürece bir sorun yaşamanız pek mümkün değil.

Hayi başlayalım...

İlk olarak yeni bir Silverlight projesi yaratalım ve sonrasında da Entity'lerimizi saklamak için ayrı bir "Silverlight Class Library" projesini solution'a ekleyelim. Bu Class Library içerisinde basit bir şekilde Insan adında bir Entity barındıracağız bu entity kendi içerisinde IDataErrorInfo sınıfını da implemente ederek validasyon mantığını da içerecek.

[VB]

Public Class Insan

    Implements ComponentModel.IDataErrorInfo

 

    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

 

    Public ReadOnly Property [Error] As String Implements System.ComponentModel.IDataErrorInfo.Error

        Get

            Return Nothing

        End Get

    End Property

 

    Default Public ReadOnly Property Item(ByVal columnName As String) As String Implements System.ComponentModel.IDataErrorInfo.Item

        Get

            Dim Hata As String = Nothing

            Select Case columnName

                Case "Adi"

                    If String.IsNullOrEmpty(Me.PAdi) Then

                        Hata = "Adı eksik"

                    End If

            End Select

            Return Hata

        End Get

    End Property

End Class

Bu noktadan sonra artık Silverlight Class Library'ye farklı proje tiplerinde referans alarak kullanabiliriz. Örneğin ASP.NET projemize referans alarak web servisi tarafından kullanabilir veya solution içerisine bir de WPF projesi ekleyip orada da aynı Entity'leri kullanabiliriz.

Silverlight 4 Assembly'lerini referans alırken...

Herhangi bir .NET projesinden SL Assembly'lerini referans alırken dikkat etmeniz gereken nokta söz konusu referansı proje referansı olarak almamanız. Aksi halde Visual Studio iki projesi sync etmeye çalışacak ve hata verecektir. İleride bu mekanizma düzelir mi bilinmez fakat şu an için tek çare söz konusu DLL'e ait referansı dosya üzerinden almak. Yani referans eklerken "Browse" tabına geçerek compile edilmiş DLL'i bulup referans olarak almanız gerekiyor.

Dosya referansı almak çok önemli!
Dosya referansı almak çok önemli!

Dosya referansı olarak projelerinize referans aldığınızda Visual Studio söz konusu proje için harici DLL'i solution dışı bir DLL'miş gibi kabul edecektir. Bunun tabi ki bazı dezavantajları olacak, örneğin SL DLL'inde değişiklik yaparsan compile etmeden değişiklikleri diğer projelerde göremeyeceksiniz.

Web servislerini referans alırken harici entity kullanmalı.
Web servislerini referans alırken harici entity kullanmalı.

Son yapmamız gereken ayar ise ister WPF tarafından olsun ister Winforms tarafından herhangi bir servisi referans alırken servis ile beraber gelen değil de harici DLL'de bulunan Entity'leri kullanmak. Bunun için Service Reference yaratırken veya yaratılmış bir servis referansına sağ tuş ile solution explorer içerisinde tıklayarak "Configure..." komutunu verip "Reuse types" seçeneğini işaretleyebilirsiniz. Böylece listeden de projenize referans olarak gelmiş uygun Assembly'yi seçip entitylerin söz konusu assembly'den kullanılmasını sağlayabilirsiniz.

İşte assembly paylaşımı bu kadar kolay. Hepinize kolay gelsin!

Wednesday, November 25, 2009 12:57:49 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4  | 
 Tuesday, November 24, 2009

Silverlight içerisinde validasyon yapma ve uygun mesajları gösterme konusunda kullandığımız sistem Property'ler içerisinde uygun Exception'ları vermekten farklı birşey değildi. Bu konuda Silverlight 3 için yazmış olduğum "Görsel Validasyon" makalesini inceleyebilirsiniz. Silverlight 4 ile beraber gelen yeni IDataErrorInfo ile beraber artık Silverlight içi kodlar da hem WPF hem de Winforms uygulamaları ile aynı altyapı üzerine oturmuş oluyor. Böylece kod paylaşımının yanı sıra yine SL 4'ün yeni özelliklerinden biri olan Assembly Paylaşımı ile birleştirildiğinde ortaya güzel manzaralar çıkabiliyor. Özetle hedeflenen şey aslında farklı platformlarda olsak da bire bir aynı kodu yazıyor olmak ve kod paylaşımını maksimum seviyeye çekmek. Bu çerçevede IDataErrorInfo tek başına yeni birşey olmasa da Silverlight bakış açısı ile yeni bir mekanizma. Bu yazımızda Interface'in implementasyonuna göz atacağız.

[VB]

Public Class Insan

 

    Private AdiField As String

    Public Property Adi() As String

        Get

            Return AdiField

        End Get

        Set(ByVal value As String)

            AdiField = value

        End Set

    End Property

 

End Class

Örnek projenizde yukarıdaki şekilde tanımlanmış bir Entity olduğunu varsayalım veya aynı şekilde bu Entity bir web service proxy aracılığı ile de geliyor olabilir. Yani web servisiniz bu nesne tipinden döndürüyor ve bu nesne tipini extend ederek validasyon mesajlarını eklemek isteyebilirsiniz. Genelde web servisi senaryosunun daha gerçekçi olduğunu düşünürsek hemen o senaryo üzerinden devam edebiliriz.

Silverlight uygulamanıza bir kod dosyası ekledikten sonra hemen Partial Class'ınızı yaratarak web servisi ile gelen sınıfı extend etmeye başlayabiliriz.

[VB]

Imports System.ComponentModel

Namespace ServiceReference1

    Partial Public Class Insanlar

        Implements IDataErrorInfo

 

        Public ReadOnly Property [Error] As String Implements System.ComponentModel.IDataErrorInfo.Error

            Get

 

            End Get

        End Property

 

        Default Public ReadOnly Property Item(ByVal columnName As String) As String Implements System.ComponentModel.IDataErrorInfo.Item

            Get

 

            End Get

        End Property

    End Class

End Namespace

IDataErrorInfo sınıfını implemente ettiğimiz anda bir obje bazında bir de Field bazında hata mesajları verebileceğimiz Property'ler ile karşılaşıyoruz. Field bazında verilen hata mesajları Silverlight 4 içerisindeki bütün kontroller tarafından otomatik algılanarak söz konusu kontrollerin görsel olarak da InValidState'e geçmesine neden oluyor. O nedenle bizim de burada esas ilgileneceğimiz kızım Property bazında validasyon yapmak.

[VB]

Imports System.ComponentModel

Namespace ServiceReference1

    Partial Public Class Insanlar

        Implements IDataErrorInfo

 

        Public ReadOnly Property [Error] As String Implements System.ComponentModel.IDataErrorInfo.Error

            Get

                Return Nothing

            End Get

        End Property

 

        Default Public ReadOnly Property Item(ByVal columnName As String) As String Implements System.ComponentModel.IDataErrorInfo.Item

            Get

                Dim Hata As String = Nothing

                Select Case columnName

                    Case "Adi"

                        If String.IsNullOrEmpty(Me.AdiField) Then

                            Hata = "Adı eksik"

                        End If

                    Case "Soyadi"

                        'BAŞKA VALİDASYONLAR

                End Select

                Return Hata

            End Get

        End Property

    End Class

End Namespace

Kod içerisinde renkli kısma göz atarsanız Property'mize gelen columnName değişkeni üzerinden hangi kolonla ilgili validasyon yapılmak istendiğine dair mesajı yakalayabildiğimizi görebilirsiniz. Bu mesajı yakaladıktan sonra uygun validasyonu yaparak istediğimiz bir mesaj metnini geri döndürebiliyoruz. Söz konusu mesaj metni otomatik olarak SL kontrolleri tarafından gösterilebiliyor.

IDataErrorInfo'dan gelen validasyon sonucu...
IDataErrorInfo'dan gelen validasyon sonucu...

Yukarıdaki ekran görüntüsünde Insanlar nesnemizden bir listenin DataGrid'e bağlanmış halini görebilirsiniz. Özellikle ilk iki kolona baktığınızda Error ve Item olarak Interface tarafından eklenmiş Property'lerin de DataGrid'de gösterildiğini görüyoruz. Bunu engellemek için bu Property'leri uygun metaattribute'ler ile süsleyebiliriz ;)

[VB]

        <DataAnnotations.Display(AutoGenerateField:=False)>

        Public ReadOnly Property [Error] As String Implements System.ComponentModel.IDataErrorInfo.Error

            Get

                Return Nothing

            End Get

        End Property

 

        <DataAnnotations.Display(AutoGenerateField:=False)>

        Default Public ReadOnly Property Item(ByVal columnName As String) As String Implements System.ComponentModel.IDataErrorInfo.Item

            Get
             ........

Unutmayın IDataErroInfo kullanarak yazılmış Entity'ler rahatlıkla Silverlight dışı WPF ve Winforms ortamlarında da kullanılabilir. Bunun için "Assembly Paylaşımı" konulu makaleye göz atmayı unutmayın.

Hepinize kolay gelsin.

Tuesday, November 24, 2009 12:55:16 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4  | 
 Monday, November 23, 2009

Silverlight uygulamalarının rahatlıkle en ufak bir kod bile yazılmadan masaüstüne taşınması muhteşem bir de yazılım geliştirici deneyimi! Sanırım bu cümlem epey sansasyonel olabilir :) Kod yazılmayan bir şey nasıl yazılım geliştirici deneyimi olabilir değil mi? Her neyse biz konumuza dönelim. Sonuç olarak hazırladığımız bir web uygulaması olan Silverlight projesini en ufak bir değişiklik yapmadan masaüstü ortamına alabiliyor olmak hatta bu senaryonun Mac ortamında da aynen çalışması Silvelright 3 zamanında büyük heyecan yaratmıştı. Silverlight 4 ile beraber OOB (Out Of Browser) moduna tabi ki bir çok eklenti geldi. Bu yazımızda bu eklentilerden ve yeni özelliklerden bir kısmına değineceğiz.

Silverlight 4 Beta ile beraber gelen OOB Ayarları

Yukarıdaki ekran görüntüsü klasik bir Silverlight projesine ait OOB moduna alınırken Visua Studio içerisinde kullandığımız ayarların bulunduğu yere ait. Özellikle kırmızı ile çizilmiş alanlardaki yenilikleri farkına varmışsınızdır. Minik yeniliklerden biri artık OOB modunda açılacak pencerenin boyutundan tutun ekranın neresinde açılacağına kadar gerekli kararları biz verebiliyoruz. Kod içerisinde de herhangi bir yer Application.Current.MainWindow üzerinden tüm bu özelliklere runtime esnasında da ulaşabilirsiniz.

Trusted Mode = ON!

İşte en güzel özelliklerden biri Trusted Mode'un artık gelmiş olması. Yani artık Silverlight uygulamanız desktop moduna alınırken kullanıcı izin verirse doğrudan diske erişebilir hatta sistemdeki donanımlara bile erişebilirsiniz! Tüm izinler sizin! Bunun için yukarıdaki ekran görüntüsünde yer alan en alttaki seçeneği işaretleyerek uygulamanızı dağıtabilirsiniz.

Trusted Mode için ek güvenlik uyarısı.
Trusted Mode için ek güvenlik uyarısı.

Doğal olarak bu uygulamaların sisteme tam erişimi olacağı için Silverlight Runtime normal bir OOB yükleme uyarısı yerine bir güvenlik uyarısı çıkarıyor. Bu güvenlik uyarısını eğer kullanıcı onaylarsa artık uygulamanızın tüm bilgisayar full trust erişimi var demektir. Eğer uygulama içerisinde kod ile bu güvenlik seviyesine sahip olup olmadığınızı kontrol etmeniz gerekirse Application.Current.HasElevatedPermissions property'sini kullanabilirsiniz. Duruma göre geriye gerekli Boolean değer döndürülecektir.

Full trust modunda çalışan uygulamaların normal SL uygulamalarına göre birçok artı özelliği oluyor. Örneğin Cross-Domain Request diye birşey artık kalmıyor. Full Screen veya Open File Dialog gibi ekranların kullanıcı tepkisi ile çalıştırılması gerektiği gibi şartlar ve kurallar ortadan kalkıyor.

Trusted Mode'da dosya erişimi nasıl?

Tüm makineye erişiminiz olduğunu söylesem de aslında tam olarak öyle değil. Örneğin bilgisayarın diskinde istediğiniz bir yere gidemiyorsunuz. Zaten unutmayın ki uygulamanız bir Mac üzerinde de çalışıyor olabilir. O nedenle ancak önceden tanımlı alanlara erişme şansınız var. Örneğin "My Documents" / "Belgelerim" bunlardan sadece biri. Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) gibi bir komutla MyDocument klasörünün konumunu öğrenebilir ve orada istediğinizi yapabilirsiniz.

COM Erişim Desteği!

Eski bir VB'ci olarak :) Bu başlık beni taaa VB 6.0 günlerime döndürdü. Malum COM erişimi asılında çok önemli ve Full Trust modu ile beraber doğrudan COM erişimi de Silverlight 4 uygulamalarına gelebiliyor. Böylece sistemde yüklü COM kodu ile konuşabiliyorsunuz. Bu konuda sanırım en sık kullanılması olası örneklerde biri Office uygulamaları ile konuşmak. Malum zaten söz konusu COM objelerinin diyelilm.. hedef bilgisayarda yüklü olması şart. O nedenle bilgisayarında Office yüklü bir kullanıcının Word'üne ulaşarak bir dosya açtırabiliyor olmak veya veri aktarabiliyor olmak ilginç senaryolara yol açabilir. Aynı bunun gibi COM üzerinden belki farklı özel donanımlara da ulaşabilirsiniz.

[VB]

    Private Sub btnTikla_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnTikla.Click

        Dim Excel As Object = Interop.ComAutomationFactory.CreateObject("Excel.Application")

        Excel.visible = True

    End Sub

[C#]

        void btnTikla_Click(object sender, RoutedEventArgs e)

        {

               dynamic Excel = System.Windows.Interop.ComAutomationFactory.CreateObject("Excel.Application");

               Excel.visible = true;

        }

Yukarıda gördüğünüz kod C#'daki yeni Dynamic keyword'ünü kullanmak zorunda. Late-binding olacağı için mecburen C# 4.0 ile gelen Dynamic keywordü ile ilerlemeliyiz. VB'de yeni birşey kullanmaya pek gerek kalmıyor çünkü Late-binding zaten VB'nin özünde var. İşin kötü tarafı bu şekilde kod yazarken herhangi Intellisense'e sahip olamaycaksınız :( Makalemizin konusu tam olarak bu olmadığı için Excel development kısmına girmeyeceğiz fakat yukarıdaki koddan itibaren Excel'i istemci tarafından açtıktan sonra istediğiniz gibi doküman yaratabileceğinizi vs unutmamakta fayda var.

WebBrowser kontrolü!

OOB modunda gelen bir diğer yenilik de WebBrowser kontrolü! Sadece OOB modunda çalışabilen bu kontrol bildiğiniz WPF'tekinden pek farklı değil. İçerisinde herhangi bir siteyi açabiliyor, hatta söz konusu sitede başka bir SL veya Flash uygulaması da yer alabiliyor.

OOB Modunda WebBrowser kontrolü çalışıyor.
OOB Modunda WebBrowser kontrolü çalışıyor.

Eğer Trsuted Mode'da olmazsanız ancak lokal makinedeki HTML dosyalarını gösterebilirsiniz, Trusted Mode'a geçerseniz rahatlıkla Cross-Domain'den de kurtularak tüm webi kullanıcıya gösterme şansınız olabilir.

WebBrowser kontrolü sadece OOB modunda çalışır.
WebBrowser kontrolü sadece OOB modunda çalışır.

Eğer uygulamanız farklı veri kaynaklarından HTML içeriği çekip gösterecekse bu işlevselliği de WebBrowser kontrolünün NavigateToString metodu ile yaratabilirsiniz.

[VB]

    Private Sub btnTikla_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnTikla.Click

        Tarayici.NavigateToString("<b>BURADA</b>")

    End Sub

Yukarıdaki örnekte de görebileceğiniz üzere rahatlıkla elinizdeki HTML kodu render edip göstermek için de WebBrowser kontrolünü kullanabilirsiniz. Hatta WebBrowser kontrolünün InvokeScript metodu ile yüklediğiniz HTML sayfadaki bir JavaScript metodunu çağırabilir JavaScript tarafından da SL uygulamasına ping mesajları gönderebilirsiniz.

[JavaScript]

window.external.Notify("Hoop! Sakin!");

WebBrowser kontrolünün içine yüklediğiniz bir HTML'in içerisindeki JavaScript kodlarının herhangi bir yerinden yukarıdaki gibi Notification mesajları Silverlight Runtime'a gönderilebilir. Unutmayın ki tüm bunlar OOB modunda WebBrowser kontrolü için geçerli. Yukarıdaki şekilde gönderilen bir mesaj WebBrowser tarafından OnScriptNotify eventı ile yakalanabilir. NotifyEventArgs getiren söz konusu eventın argümanı üzerinden de Value Property'si ile gelen notification mesajını alabilirsiniz.

[VB]

    Private Sub Tarayici_ScriptNotify(ByVal sender As Object, ByVal e As System.Windows.Controls.NotifyEventArgs) Handles Tarayici.ScriptNotify

        MessageBox.Show(e.Value)

    End Sub

Bu haliyle tüm manzara bakıldığında harici siteleri gösterebilmenin yanı sıra lokal uygulama tarafından verilen HTML'leri de render edip içlerindeki JavaScript'i de çalıştırabilen. Hatta CLR ile JavaScript'i de yine uygulama içerisinde çift taraflı olarak konuşturabilen esnek bir yapıdan bahsediyoruz.

Silverlight 4 masaüstü modunda da giderek kuvvetlenerek geliştirilebilecek uygulamalarda uygulanabilecek çözümleri genişletmemizde büyük fayda sağlıyor.

Hepinize kolay gelsin.

Monday, November 23, 2009 8:48:50 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4  | 
 Sunday, November 22, 2009

Silverlight 4 Beta ile beraber gelen özelliklerden biri de Command yapıları. Command yapıları özellikle WPF developer'larının alışık oldukları yapılar arasında fakat maalesef Silverlight tarafında bugüne kadar herhangi bir runtime seviyesinde implementasyon yoktu. Özellikle geniş çaplı iş uygulamalarının da artması ile uygulama içi kod yazım yapılarında ve disiplinlerinde farklı arayışlar kendini gösterebiliyor. Bu arayışlar sonucudur ki WPF tarafında MVP, MVVM gibi kod yazım tasarımları ortaya çıkar.

Silverlight tarafında da aslında uzun bir süredir bu gibi konularda harici kütüphaneler bulunuyordu. Benim bugüne kadar bu konularda yazı yazmamamın nedeni ise daha herhangi bir standardın pek de oturumamış olmasıydı. Bu yazımızda çok hızlı bir şekilde MVVM'in ufak bir kısmından rüzgar gibi geçerek Silverlight 4'teki Command yapılarına göz atacağız. Olabildiğince örnek üzerinden giderek yaptıklarımızın amacını da anlatmaya çalışacağım.

Tüm yapacaklarımızın amacı nedir?

Aslında kod yazım şekilleri ile ilgili genel geçer bir bakış attığınızda göreceksiniz ki en önemli hedeflerden biri farklı amaçlara hizmet eden kodları olabildiğince birbirinden ayırmaktır. Bu süreç tabi ki ek bir emek gerektirir ve bazen gereklidir, bazen ise değildir. Özünde bir projeye başlarken sorulması gereken soru bu farklı amaçlara hizmet eden kodları birbirinden ayırmanın söz konusu projede getireceği bir kazancın olup olmadığının yanı sıra kazancın bu ek süreç için harcanacak emeğe kıyasla toplamda hala bir kazanç olarak durup durmadığıdır. Tüm bu soruları sormadan herhangi bir projede kod yazım şekli ile ilgili genel geçer bir doğru kesinlikle bulunamaz.

Sadede gelirsek, bu makale boyunca anlatacaklarım sizin belki de bugüne kadar yazdığınız Silverlight projelerinde uyguladığınız stilin çok dışında olacaktır. Bu makalede anlatacağım uygulama geliştirme tarzı kesinlikle genel geçer bir doğru değildir ve her projede "profesyonel olalım" endişesi ile uygulanması gereken bir "guru tarzı" vs değildir :) Birer yazılımcı olarak göreviniz uygun şartlarda uygun araçlarla uygun çözümleri en düşük maliyet ve en yüksek verimlilik ile üretmek olduğunu unutmamanızda fayda var.

Uyarı bölümünü geçtiğimize göre gelelim konumuza. Bahsettiğim gibi genelde amacımız farklı amaçlara hizmet eden kodları birbirinden ayırmak. Buna bir örnek olarak XAML ile VB/CS kodlarının ayrı dosyalarda tutulmasını da verebiliriz. Oysa aynı dosyada da tutma şansımız var fakat yapmıyoruz. Neden? Çünkü XAML ile VB/CS'in amacı farklı ve ayrı yerlerde durmaları bize projelerimizin kod yazım süreçlerini yönetmemizde büyük katkı sağlıyor. İşte bu endişenin devamında UI (Kullanıcı arayüzü) ile ilgili kodların da veri katmanı ile salt görsel katman (XAML) arasında kaldığını düşünürsek tam da o noktada bir karışıklık kendini gösterebiliyor. İşte bu karışıklığı toparlayabilmek ve bilyonlarca event-handler vs ile uğraşmamak adına Commanding yapısını kullanabiliriz. Aman dikkat Commanding'in tek faydası tabi ki bu değil, kodun test edilebilmesi, görsel ekranlar ile görsel ekranlara veri bağlantısının yapıldığı kodun birbirinden tamamen ayrıştırılabilmesi, DataBinding mekanizmasını kolaylaştırması gibi birçok yan etkisi de var.

Silverlight 4 ile ne gelmiş?

İlk olarak gelin Silvelright 4'de gelen yeniliğe bir göz atalım. Olabildiğince basit bir örnekten yola çıkarak örneğimizi makale boyunca geliştirerek evrim geçirmesini sağlayacağız. Varsayalım ki örneğimizde bir düğme ve bir de TextBox olacak. TextBox içerisine yazı girildiğinde düğme tıklanabilir olmalı ve yazıyı almalı. Oysa TextBox boş ise düğmeye tıklanamamalı. Şimdi böyle bir durumda normal şartlarda ne yapardık bir bakalım.

[XAML]

<UserControl x:Class="SilverlightApplication16.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400">

 

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

        <StackPanel>

            <TextBox x:Name="txtMetin" />

            <Button x:Name="btnTikla" Content="TIKLA"></Button>

        </StackPanel>

    </Grid>

</UserControl>

Yukarıda basit bir şekilde örneğimizin XAML kodunu görüyorsunuz. btnTikla adında bir Button ve txtMetin adında da bir TextBox'ımız var.

[VB]

Partial Public Class MainPage

    Inherits UserControl

 

    Public Sub New()

        InitializeComponent()

    End Sub

 

    Private Sub txtMetin_TextChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.TextChangedEventArgs) Handles txtMetin.TextChanged

        If String.IsNullOrEmpty(txtMetin.Text) Then

            btnTikla.IsEnabled = False

        Else

            btnTikla.IsEnabled = True

        End If

    End Sub

 

    Private Sub btnTikla_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnTikla.Click

        MessageBox.Show(txtMetin.Text)

    End Sub

End Class

Gördüğünüz gibi tek tek hem düğmenin hem TextBox'ın uygun eventlarını yakalamamız ve her seferinde de ayrı ayrı kontroller ulaşmamız gerekti. İşte bu senaryoda kontrollerden herhangi birinin adı değişse hemen arkaya dönüp kodumuzu da değiştirmemiz gerekecek. Aynı şekilde TextBox yerine belki de ileride bir Combox konacak? Ve orada seçili nesneye göre sistem çalışacak? İşte böyle bir durumda da herşeyi baştan toparlamamız gerekir kod tarafında. Gördüğünüz gibi UI ile ilgili kod ve UI birbiri ile çok fazla iç içe!

[VB]

Public Class TiklaCommand

    Implements ICommand

 

    Public Function CanExecute(ByVal parameter As Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute

        If String.IsNullOrEmpty(parameter) Then

            Return False

        Else

            Return True

        End If

    End Function

 

    Public Event CanExecuteChanged(ByVal sender As Object, ByVal e As System.EventArgs) Implements System.Windows.Input.ICommand.CanExecuteChanged

 

    Public Sub Execute(ByVal parameter As Object) Implements System.Windows.Input.ICommand.Execute

        MessageBox.Show(parameter)

    End Sub

End Class

Silverlight 4 ile beraber artık Commanding yapısı geldiğine göre yukarıdaki şekilde bir sınıf tanımlayabiliriz. Gördüğünüz bu sınıf doğrudan ICommand interface'ini implemente ediyor. Bu Interface içerisinde otomatik olarak CanExecuteChanged eventı, CanExecute ve Execute metodları bulunuyor. Toplamda iki metoddan CanExecute metodu kendisine gelen bir parametreye göre olası bir komutun çalışıp çalışamayacağına kadar veriyor. Bizim örneğimizde gelen parametreyi TextBox içerisinde metin olarak düşünebilirsiniz. Eğer metin yoksa geriye False varsa True döndürüyoruz. İkinci metodumuz olan Execute ise aslında çalıştırılacak komutun ta kendisini tanımlıyor. Basit bir şekilde şimdilik gelen parametreyi bir MessageBox ile gösteriyoruz. Hepsi bu kadar. Sıra geldi tüm bu mekanizmayı XAML yani görsel tarafla bağlamaya. Dikkat edin şu ana kadar ne bir TextBox ne de bir Button'dan bahsettik! Kodumuzda hiçbir kontrolün adı veya tipi yok! Bizim için tek önemli olan gelen parametrenin tipi, değeri ve yapacağımız iş!

Yukarıdaki kodu ayrı bir VB dosyası olarak projeye ekledikten sonra artık sınıfımızı XAML tarafında kullanabilmek adına gerekli tanımlamaları XAML tarafında yapmalıyız.

[XAML]

<UserControl x:Class="SilverlightApplication15.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400"

            xmlns:daron="clr-namespace:SilverlightApplication15">

    <UserControl.Resources>

        <daron:TiklaCommand x:Name="TiklaCommand" />

    </UserControl.Resources>

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

        <StackPanel>

            <TextBox x:Name="txtMetin" />

            <Button Command="{StaticResource TiklaCommand}"

                   CommandParameter="{Binding Text, ElementName=txtMetin, Mode=TwoWay}"

                   x:Name="btnTikla" Content="TIKLA"></Button>

        </StackPanel>

    </Grid>

</UserControl>

İlk olarak her zamanki gibi XMLNS yani XML NameSpace tanımımız ile arka plandaki sınıfımızı bu tarafa import ediyoruz. Sonrasında da UserControl'un Resource'ları arasında TiklaCommand'in bir kopyasını alıyoruz. Artık sıra geldi gerekli Binding'leri ayarlayarak Textbox ve Button ile Command arasındaki ilişkiyi belirlemeye.

[XAML]

<UserControl x:Class="SilverlightApplication15.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400"

            xmlns:daron="clr-namespace:SilverlightApplication15">

    <UserControl.Resources>

        <daron:TiklaCommand x:Name="TiklaCommand" />

    </UserControl.Resources>

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

        <StackPanel>

            <TextBox x:Name="txtMetin" />

            <Button Command="{StaticResource TiklaCommand}"

                   CommandParameter="{Binding Text, ElementName=txtMetin, Mode=TwoWay}"

                   x:Name="btnTikla" Content="TIKLA"></Button>

        </StackPanel>

    </Grid>

</UserControl>

Özünde yaptığımız tek şey Button'un Command ve CommandParameter özelliklerini set etmek. Command olarak hemen StaticResource'lar arasından daha bir önceki adımda yarattığımız Command'imizi veriyoruz. Sonrasında parametreyi aktarırkende Element Binding kullanarak TextBox'ın Text özelliğindeki değeri alıp gönderiyoruz. İşte bu kadar! Peki şimdi size soruyorum, XAML ile arka plandaki UI işlevselliğini barındıran kod birbirinden gerçekten de uzaklaşmadı mı? Evet, uzaklaştı. Daha mı çok uğraştık? Şimdilik hayır ama farklı senaryolarda daha çok uğraşmamız da gerekebilirdi.

İşi biraz daha karıştıralım!

Gördüğünüz üzere yukarıdaki teknik ile bir uygulama geliştirdiğinizde onlarca Command ve Bindingler yazacaksınız. Bu gibi bir durumda kodu biraz daha kısaltmak ve basitleştirmek adına Generic Command tipleri yaratabilirsiniz.

[VB]

Public Class BirCommand(Of T)

    Implements ICommand

 

    Private executeAction As Action(Of T)

    Private canExecuteAction As Func(Of T, Boolean)

 

    Sub New(ByVal executeAction As Action(Of T), ByVal canExecuteAction As Func(Of T, Boolean))

        Me.executeAction = executeAction

        Me.canExecuteAction = canExecuteAction

    End Sub

 

    Public Function CanExecute(ByVal parameter As Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute

        Return (canExecuteAction(parameter))

    End Function

 

    Public Event CanExecuteChanged(ByVal sender As Object, ByVal e As System.EventArgs) Implements System.Windows.Input.ICommand.CanExecuteChanged

 

    Public Sub Execute(ByVal parameter As Object) Implements System.Windows.Input.ICommand.Execute

        executeAction(parameter)

    End Sub

End Class

Yukarıda gördüğünüz sınıf aslında bizim bir önceki örneğimizde kullandığımız ICommand interface'ini implemente eden nesnemizin generic olan hali. Tabi ben biraz VB tembelliği yapıp parametreleri Generic yapmadım :) Onu da size bırakmış oliyim. Burada önemli olan noktalardan biri ise sınıfımızın artık bir Constructor'a sahip olarak çalıştıracağı her iki CanExecute ve Execute fonksyonlarını da dışarıdan alıyor olması. Böylece artık proje içerisinde istediğimiz zaman hızlıca ICommand tipinden sınıflar yaratabiliriz.

[VB]

Public Class ViewModel

 

    Public ReadOnly Property Tikla() As ICommand

        Get

            Return New BirCommand(Of String)(Sub(param)

                                                                         MessageBox.Show(param)

                                                                     End Sub,

                                                                     Function(param) As Boolean

                                                                           If String.IsNullOrEmpty(param) Then

                                                                                 Return False

                                                                           Else

                                                                                 Return True

                                                                            End If

                                                                     End Function)

        End Get

    End Property

 

End Class

Yukarıdaki ViewModel sınıfımız içerisinde sadece bir ReadOnly property var. Söz konusu property'nin de tipi ICommand olmak durumunda. Bu şekilde bu sınıf içerisine sayfanızda kullandığınız tüm Command'leri yerleştirebilirsiniz. Örneğimizde Property geriye bizim BirCommand sınıfımızdan yaratıp döndürüyor. BirCommand sınıfımızın Constructor'ı da iki ayrı fonksyonu parametre olarak alıyor. Böylece herşey bir yerde oldu bitti.

[XAML]

<UserControl x:Class="SilverlightApplication15.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400"

            xmlns:daron="clr-namespace:SilverlightApplication15">

    <UserControl.Resources>

        <daron:ViewModel x:Name="ViewModel" />

    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource ViewModel}">

        <StackPanel>

            <TextBox x:Name="txtMetin" />

            <Button Command="{Binding Tikla}"

                   CommandParameter="{Binding Text, ElementName=txtMetin, Mode=TwoWay}"

                   x:Name="btnTikla" Content="TIKLA"></Button>

        </StackPanel>

    </Grid>

</UserControl>

XAML tarafında ise artık ViewModel sınıfımızı Root elementimiz olan Grid'e DataContext olarak verip sonrasında içerideki herhangi bir kontrole de doğrudan Command Binding verebiliyoruz.

İşte bu kadar!

Yazıyı sonlandırmadan önce özellikle yazının başında uyarılarımızı tekrar hatırlamanızı rica ediyorum. Command sistemi güzeldir hoştur fakat mecburi değildir. Bu sadece bir yazılım geliştirme stilidir ve bazı durumlarda mantıklı/faydalı olur bazılarında ise sadece size ek iş çıkartır. O nedenle benim tavsiyem her iki yolu da bilerek uygun yerlerde uygun çözümleri uygulamanız ve genel geçer bir doğru aramamanız olacak.

Hepinize kolay gelsin.

Sunday, November 22, 2009 8:37:59 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4  | 
 Saturday, November 21, 2009

Silverlight 3 zamanlarında gelen en önemli isteklerden biri farenin sağ tuşu ile ilgili eventları yakalayabilmekti. Biliyorsunuz normal şartlarda herhangi bir Silverlight uygulamasına sağ tuş ile tıklarsanız karşınıza "Silverlight" diye bir menü seçeneği geliyor ve burada da Silverlight Runtime ile ilgili ayarlara ulaşılabiliyor. Uzun bir süre sağ tuş implementasyonunun pek de mümkün olmadığı ve güvenlik nedeni ile Microsoft'un bu gibi bir şeye izin vermeyeceği konusunda yorumlar internette gezindi. İtiraf etmek gerekirse ben de konsept olarak pek olası bir çözüm öngöremiyordum.

Silverlight 4'te fareye sağ tuş desteği!

Oysa bir de baktık ki Silverlight 4 ile (Beta) farenin sağ tuşuna dair eventleri de ayrıca yakalayabiliyoruz. Bu destek özellikle iş uygulamalarında çok anlamlı bir boşluğu dolduruyor. Kullanıcılara hali hazırda web ortamında bir "thinclient" deneyimi sunan ve sanki windows ortamındaki programları kullanıyormuşcasına zengin deneyimler sağlayabilen Silverlight'ın aynı hissiyatı devam ettirebilmesi adına farenin sağ tıklamalarına da uygun tepkileri verebilmesi çok önemliydi. Bu açığın kapatılıyor olduğunu görmek çok sevindirici.

Peki nasıl?

Aslında konu epey basit. Artık Silverlight içerisindeki tüm kontrollerin MouseLeftButtonDown ve MouseLeftButtonUp gibi birer de MouseRightButtonDown ve MouseRightButtonUp eventları bulunuyor. Söz konusu eventları tarayıcı ve platform bağımsız olarak yakalayıp istediğiniz işlevselliği sunabilirsiniz.

Silverlight 4'te sağ tuş desteği gelmesine rağmen varsayılan ayarlarla hala sağ tuş ile tıkladığınızda eksi klasik Silverlight menüsü gelecektir. Bu menünün gelmesini engellemek için tabi ki kendi implementasyonunuzu yapmanız gerekiyor. Eğer bu menünün gelmesini istemiyorsanız hemen herhangi bir kontrolün MouseLeftButtonDown eventını yakalayarak event listener'a gelen argüman üzerindeki Handled Property'sini kullanabilirsiniz.

[XAML]

<UserControl x:Class="SilverlightApplication13.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400">

 

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

        <TextBox x:Name="txtMetin" Height="100" />

        <Grid x:Name="ContextMenu" Visibility="Collapsed" HorizontalAlignment="Left"

             VerticalAlignment="Top" Height="50" Width="150" Background="Red">

            <TextBlock Text="Başardın!" />

        </Grid>

    </Grid>

</UserControl>

Yukarıdaki XAML kodunda basit bir TextBox ve bir de Visibility özelliği Collapsed olarak ayarlanmaış Grid görüyorsunuz. Amacımız TextBox'a sağ tuş ile tıklandığında bir ContextMenu kıvamında Grid'imizi kullanıcıya göstermek. Grid içerisinde ben deneme amacı ile bir TextBlock koydum fakat siz hem bu Grid'in içerisinde duruma göre programatik olarak doldurabilir hem de içerisine düğmeler koyup düğmelerin click eventlarını yakalayabilirsiniz. Sistemi geliştirmek size kalmış.

[VB]

    Private Sub txtMetin_MouseRightButtonDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles txtMetin.MouseRightButtonDown

        e.Handled = True

    End Sub

İlk olarak TextBox kontrolümüzün MouseRightButtonDown eventını yakalayarak burada Handled özelliğine True değerini veriyoruz. Böylece TextBox'ın üzerine sağ tuş ile tıklandığı anda söz konusu senaryoyla bizim ilgilendiğimizi sisteme belirtmiş oluyoruz ve artık Silverlight Runtime kendi menüsünü göstermiyor. Normal şartlarda Context menülerin gösterimi farenin sağ tuşu kaldırıldığında yapılır. Yani tuşa bastığınızda değil tuştan parmağınızı çektiğinizde context menü gösteriliyor. Biz bu event ile tuşa basıldığı anda "Hop! Ben halledeceğim bu işi" :) şeklinde bir mesaj ile Silverlight Runtime'ı pinglemiş oluyoruz ve tabi ki MouseRightButtonUp durumunu yakalayıp kendi menümüzü göstermek de bize kalıyor.

[VB]

    Private Sub txtMetin_MouseRightButtonUp(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles txtMetin.MouseRightButtonUp

        ContextMenu.Margin = New Thickness(e.GetPosition(Me).X, e.GetPosition(Me).Y, 0, 0)

        ContextMenu.Visibility = Windows.Visibility.Visible

    End Sub

Sıra geldi olası bir ContextMenu yapısını kullanıcıya göstermeye. XAML kısmından hatırlarsanız bizim elimizde adı ContextMenu olan bir Grid vardı. Amacımız bu Grid'i farenin sağ tuşu ile tıklandığında tıklanan noktada göstermek. Bu nedenle yine TextBox'ın MouseRightButtonUp eventını yakalayarak bu elimizdeki ContextMenu'nün Margin'ini ayarlıyoruz. ContextMenu işlevselliği görecek Grid'imiz bir başka Grid içerisinde yer aldığı için pozisyonunu değiştirebilmek adına Margin vermemiz şart. Dikkat etmeniz gereken nokta Grid'in XAML içerisinde pozisyonlandırma olarak sol üste yaslanmış olması. O nedenle sol üst köşeden mesafalelerini vermemiz pozisyonlandırma için yeterli olacaktır. Yine event listener'a gelen argüman üzerinden GetPosition metodunu kullanarak farenin tıklandığı yerin X ve Y koordinatlarını alarak Margin olarak Grid'imize veriyoruz. Böylece ContextMenu'müz artık istediğimiz yere geldi ve gösterime hazır. Bu durumda Visibility'sini de Visible yaparak kullanıcıya gösterebiliriz.

[VB]

    Private Sub MainPage_MouseLeftButtonDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles Me.MouseLeftButtonDown

        ContextMenu.Visibility = Windows.Visibility.Collapsed

    End Sub

Unutmadan! Uygulama içerisinde bir yerlere farenin sol tuşu ile tıklandığında ContextMenu'üyü tekrar görünmez yapmayı atlamayın yoksa context menü sürekli gözükecektir. Bunun için basit bir şekilde root elementin MouseLeftButtonDown özelliğini yakalayıp orada Grid'imizin Visibility'sini Collapsed yapabilirsiniz.

Daha kolay yolu yok mu ContextMenü meselesinin?

Farkındayım :) Kendi kendinize "Ya tamam da bir ContextMenü için bu kadar uğraşmak doğru mu? Yok ContextMenü kontrolü?" şeklinde sordunuz :) Maalesef yok! Yani en azından Silverlight 4 Beta ile şu anda gelmiyor. Ama güzel bir haberim var. Silverlight Program Manager'lardan Jesse Bishop'un yazmış olduğu bir kontrol var. Söz konusu kontrolü kullanarak rahatlıkla uygulamalarınıza ContextMenu'ler ekleyebilirsiniz. Gelin basit bir şekilde bu implementasyonun nasıl yapıldığına bir göz atalım.

İlk olarak Jesse Bishop'un yazmış olduğu kontrolün kaynak kodlarını sitesinden indirerek compile etmeniz gerek veya üşeniyorsanız ben sizin için compile ettim :) Aşağıdaki linkten doğrudan Assembly'leri indirebilirsiniz.

Silverlight 4 Beta için ContextMenu Kontrolleri - 21112009_1.zip (19,11 KB)

Referans alma işlemini tamamladıktan sonra Assembly içerisindeki kontrolleri kullanabilmek adına Assembly'yi XML NameSpace ile XAML tarafına import etmemiz gerek.

[XAML]

<UserControl x:Class="SilverlightApplication13.MainPage"

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

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

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

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

            xmlns:context="clr-namespace:ContextMenuControls;assembly=ContextMenuControls"

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400">

Import işlemi de tamamlandığına göre artık bu Assembly içerisindeki tüm kontrolleri projemizde kullanabiliriz. Bir önceki örneğimizdeki TextBox ile devam edelim. Amacımız bu TextBox'a yine bir ContextMenü atamak.

[XAML]

        <TextBox x:Name="txtMetin" Height="100" >

            <context:ContextMenu.ContextMenu>

                <context:ContextMenu>

                    <context:MenuItem Text="Hede" Tag="1" Click="MenuItem_Click" />

                    <context:MenuItem Text="Hödö" Tag="2" Click="MenuItem_Click" />

                    <context:MenuItem Text="Bödö" Tag="3" Click="MenuItem_Click" />

                </context:ContextMenu>

            </context:ContextMenu.ContextMenu>

        </TextBox>

Gördüğünüz gibi olay epeyce basit aslında. TextBox için bir ContextMenu atadıktan sonra içerisine de istediğimiz kadar MenuItem koyabiliyoruz. Ben örnek olarak tüm MenuItem'ları aynı event-listener'a bağladım. Söz konusu event listener içerisinde de gelen MenuItem'ın Tag'ına göre senaryolarınızı ayrıştırabilirsiniz. Aslında söz konusu kontroller Silverlight 4 ile beraber gelen Commanding yapısına da destek veriyor fakat şimdilik daha commanding kısmı ile ilgili makale yazmadığım için konuyu oralara genişletmiyorum.

[VB]

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

        MessageBox.Show(CType(sender, ContextMenuControls.MenuItem).Tag)

    End Sub

Eğer ContextMenu'leri kod ile yaratıp kontrollere atamak isterseniz tabi ki bu da mümkün. Bunun için örneğimizdeki TextBox'a ait ContextMenu Assembly'sinden gelen bir attached property'yi set ederek ilerleyebiliriz.

[VB]

        Dim CMenu As New ContextMenuControls.ContextMenu

        Dim Item As New ContextMenuControls.MenuItem

        Item.Text = "Gel Tıkla"

        AddHandler Item.Click, Sub()

                                   MessageBox.Show("ok")

                               End Sub

        CMenu.Items.Add(Item)

        ContextMenuControls.ContextMenu.SetContextMenu(txtMetin, CMenu)

Yukarıdaki kod içerisinde bir ContextMenu yaratıp içerisine de bir MenuItem yerleştiriyoruz. Basit bir şekilde şimdilik MenuItem'a tıklandığında bir MessageBox gösteriyoruz. Önemli olan en sonda ContextMenu sınıfı üzerinden SetContextMenu ile TextBox'a elimizdeki menüyü ataçlamamız. Böylece herşey tıkırında çalışacaktır.

Buradan bu güzel kontrol için Jesse'ye teşekkür ediyorum :) Umarım yakında Silverlight Toolkit'te görürüz bu kontrolü.

Hepinize kolay gelsin.

Saturday, November 21, 2009 2:19:15 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4  | 
 Friday, November 20, 2009

Silverlight içerisinde bir uygulamanın arayüzünü temalaştırmak için bugüne kadar uyguladığımız yöntem hazır bir temayı harici bir Resource dosyasında tutmaktı. Böylece istediğimiz zaman Resource dosyasını değiştirerek uygulama temasını da değiştirmiş oluyorduk. Bu işlemi programatik olarak yapmak ise apayrı bir dertti. Farkındaysanız hep geçmiş zaman kullandım :) Bunun nedeni Silverlight 4 ile beraber hikayenin biraz değişiyor olması. Silverlight 4 ile beraber rahatlıkla Implicit Style yapıları kullanabiliyorsunuz. Yani artık UIElement ağacının en üst noktasında bir yerde tanımladığınız bir stil otomatik olarak tüm alttaki nesneleri etkileyebiliyor ve bu mekanizma kontrol tipine özel olarak uygulanabiliyor.

Sözün özü; artık isterseniz bir Silverlight uygulamasında tüm Button'lara otomatik olarak uygulanabilecek bir stili hiç uğraşmadan uygulama geliştirildikten sonra bile App.XAML içerisinde tanımlayabiliyorsunuz.

[XAML]

<UserControl x:Class="SilverlightApplication10.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400">

 

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

        <StackPanel Orientation="Horizontal">

            <StackPanel>

                <TextBox />

                <TextBox />

            </StackPanel>

            <StackPanel>

                <TextBox />

                <TextBox />

            </StackPanel>

        </StackPanel>

    </Grid>

</UserControl>

Yukarıdaki örnek uygulamamızda iki ayrı StackPanel içerisinde ikişer TextBox var. İstediğimiz şey çok ta uğraşmadan tüm bu Textbox'ların fon rengini global olarak değiştirmek. Bunun için hızlı bir şekilde App.XAML'a giderek yeni bir stil tanımlayabiliriz.

[App.XAML]

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

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

            x:Class="SilverlightApplication10.App"

            >

    <Application.Resources>

        <Style TargetType="TextBox">

            <Setter Property="Background" Value="Red"/>

        </Style>

    </Application.Resources>

</Application>

Tanımladığımız bu Stil için bir Key (Ad) vermediğimizi özellikle belirtmek istiyorum. Herhangi bir ad vermediğimiz anda artık Stillerimiz kendi TargetType'larına göre her kontrolü bulup etkileyebiliyorlar. Böylece artık bu Silverlight uygulaması içerisindeki tüm TextBox'ların fon rengi kırmızı olmuş oldu.

Diğer yandan tüm uygulama bazında genel stiller ayarlayabileceğimiz gibi uygulama içerisinde bölgesel olarak da Implicit Style kullanabiliriz.

[XAML]

<UserControl x:Class="SilverlightApplication10.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400">

 

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

        <StackPanel Orientation="Horizontal">

            <StackPanel>

                <StackPanel.Resources>

                    <Style TargetType="TextBox">

                        <Setter Property="Background" Value="Blue"/>

                    </Style>

                </StackPanel.Resources>

                <TextBox />

                <TextBox />

            </StackPanel>

            <StackPanel>

                <StackPanel.Resources>

                    <Style TargetType="TextBox">

                        <Setter Property="Background" Value="Yellow"/>

                    </Style>

                </StackPanel.Resources>

                <TextBox />

                <TextBox />

            </StackPanel>

        </StackPanel>

    </Grid>

</UserControl>

Yukarıdaki örnekte ayrı StackPanel'ler içerisinde ayrı birer Stil bulunuyor. Bu stiller de kendi içlerinde bulundukları StackPanel içerisindeki tüm TextBox'ları etkileyeceklerdir. Uygulama bazında ayarladığımız global stil maalesef artık bu StackPanel'ler içerisinde geçerli olmayacaktır. Hem global hem local stillerimiz hedef kontrollerin aynı Property'lerini değiştirmeye çalıştıkları için çakışıyorlar ve en alt seviyedeki geçerli oluyor. Fakat bu noktada özel bir noktaya dikkat çekmek gerek. Bu stiller aynı Property'leri etkilemeseydi de çakışacaklardır. Yani en üstte Background değiştiren alt seviyede de ForeGround değiştiren bir stiliniz olursa alt seviyedeki stil üsttekini ezeceği için üsttekinin Background ayarı artık alt seviyedeki stilin altındakilere etkilemeyecektir. Yani anlayacağınız çakışma Property bazlı değil stil bazı ve maalesef stiller üst üste bindirilemiyorlar. BasedOn Style yapısı Key verilmiş bir stil üzerinden kullanılabilse de şu anda Key verilmemiş stiller arasında kullanılamıyorlar.

Expression Blend desteği tam gaz devam!

Malum söz konusu stiller ve tasarım olunca Expression Blend'den vaz geçilemez. Bu noktada Implicit Style desteği Expression Blend'in .NET 4.0 Preview sürümünde de geliyor. Böylece tasarımcılar da rahatlıkla Implicit Style yapıları oluşturabiliyorlar.

Expression Blend içerisinde Implicit Style yapıları.
Expression Blend içerisinde Implicit Style yapıları.

Blend içerisinde mantık da tamamen aynı. Herhangi bir kontrol üzerinden Template veya Stil editlediğinizde karşınıza gelen diyalogta artık bir de "Apply to all" seçeneği bulunuyor. Bu seçeneği kullandığınızda tabi ki stile bir isim veremiyorsunuz ve stili yarattığınız kontrolden itibaren her noktayı etkiliyor. Stili yaratırken hangi kontrol üzerinden etkilemeye başlayacağına karar vermek için stili nereye kaydedeceğinizi karar vermeniz yeterli. Yani "Define in" kısmında hali hazırda üzerinde çalıştığınız dokümandan bir kontrol seçebilir veya Application diyerek uygulama genelini de belirtebilirsiniz.

Implicit Style'lar ile beraber artık hazır SL projelerinin tasarımını değiştirmek çok daha kolay bir hal aldı. Aynı şekilde temalar uygulamak da bir o kadar basitleşti.

Hepinize kolay gelsin.

Friday, November 20, 2009 6:31:56 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4  | 
 Thursday, November 19, 2009

Taaa Silverlight 1.0 zamanında Clipboard erişimi ile ilgili bir makale yazmıştım. Aradan bir buçuk yıl geçmiş :) Silverlight 4 Beta ile beraber Clipboard erişimi artık default olarak geliyor. Böylece rahatlıkla JavaScript mile uğraşmadan C# veya VB kodunuz ile Clipboard'a ulaşabilir, veri alabilir veya verebilirsiniz.

Bakalım Clipboard'da birşey var mı?

Clipboard'dan birşey almadan önce birşey olup olmadığını kontrol etmek gerek. Şu an için Silverlight 4 Beta'da Clipboard erişlimi olarak sadece Unicode metin desteği var. O nedenle kullanacağımız tüm API'lerde de bu izi rahatlıkla görebilirsiniz.

[XAML]

<UserControl x:Class="SilverlightApplication8.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400">

 

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

        <StackPanel>

            <Button x:Name="btnKes" Content="Kes" />

            <Button x:Name="btnYapistir" Content="Yapıştır" />

            <TextBox x:Name="txtMetin" />

        </StackPanel>

    </Grid>

</UserControl>

Yukarıdaki XAML kodu örnek uygulamamızın arayüzüne ait. Arayüzde basit birer Kes ve Yapıştır düğmelerinin yanı sıra bir de TextBox yer alıyor. Amacımız sistem clipboardundaki veriyi bu textbox içerisine yapıştırmak veya textbox içerisinden bir metni kesip aynı şekilde clipboarda yerleştirmek.

[VB]

    Private Sub btnYapistir_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnYapistir.Click

        If Clipboard.ContainsText Then

            txtMetin.Text = Clipboard.GetText

        End If

    End Sub

Yapıştır düğmemizin arkasında hemen Clipboard sınıfındaki shared metodlardan ContainsText'i kullanarak Clipboard içerisinde bir metin olup olmadığını kontrol edebiliyoruz. Sonrasında eğer metin varsa rahatlıkla bu metni de GetText ile alabiliyoruz.

[VB]

    Private Sub btnKes_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnKes.Click

        Clipboard.SetText(txtMetin.SelectedText)

        txtMetin.Text = txtMetin.Text.Remove(txtMetin.SelectionStart, txtMetin.SelectionLength)

    End Sub

Sıra kesme işlemine yani Clipboard'a data aktarmaya gelince de yine Clipboard sınıfı altındaki SetText metodunu kullanabiliriz. Söz konusu metod parametre olarak Clipboard'a aktarmak istediğimiz yazıyı alıyor. Tabi söz konusu yazıyı Clipboard'a yerleştirdikten sonra TextBox'tan da kaldırmanın uygun olacağını düşündüm :) O nedenle bir sonraki satırı da keyfi olarak ekledim diyebilirim.

Clipboard erişimi hakkı!
Clipboard erişimi hakkı!

Uygulamanız ilk Clipboard erişimine el attığı anda :) kullanıcıya yukarıdaki gibi bir uyarı penceresi gösterilecektir. Bu pencere ile kullanıcı uygulamanıza Clipboard erişimi izni verebilir. Eğer izin verilir ise uygulama söz konusu session boyunca bu izne sahip olacaktır. Eğer izin verilmez ise kodunuz bir Exception verecektir. O nedenle erişim kodlarınızı Try/Catch blokları içerisinde tutup hataya göre yol almak uygun olabilir.

Hepinize kolay gelsin.

Thursday, November 19, 2009 6:30:11 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4  | 
 Wednesday, November 18, 2009

Silverlight 4 ile beraber gelen yenilikleri incelemeye başlayacağımız bu makalede değinmek istediğimiz nokta biraz veri uygulamalarına yönelik olacak. Aslına bakıldığında söz konusu yenilik çok basit gibi gözükse de günü birlik silverlight veri uygulamaları geliştirme sürecinde sürekli karşılaştığımız ve canımızı sıkan önemli bir sorunu çözmek için çok değerli. Gelin hep beraber neden bahsettiğime bir göz atalım.

Bir DataGrid içerisinde Combobox sorunsalı!

Bunun neresi sorun yaratıyor diyebilirsiniz. Fakat veritabanında tuttuğumuz değerleri entity tasarımımıza doğrudan yansıttığımızda (ki Visual Studio içerisinde çoğu RAD (Rapid Application Development) aracı bunu öngörür) Silverlight tarafındaki DataBing mekanizmalarında kıl bir durum ile karşılaşıyorduk. Senaryoyu cümlelerle tanımlamak yerine örnek üzerinden gitmeyi daha uygun görüyorum ;)

Örnek veritabanı tasarımı.
Örnek veritabanı tasarımı.

Yukarıda gördüğünüz şekilde veritabanımızda iki tablo var. Bu tablolar birbirine TipID üzerinden bağlı. Yani her Insan'ın bir tipi var ve bu tipler de ayrı bir tabloda FK (Foreign Key) ile bağlı. Malum bu tasarım bizim veritabanı tasarımlarımızın en ufak yapıtaşını temsil edebilir. Böyle minik bir tasarımdan yola çıkarak doğrudan Entity'leri yaratarak ilerlediğimizde bakalım Silverlight içerisinde bir DataGrid ile insanları nasıl gösterebileceğiz?

[VB]

<ServiceContract(Namespace:="")>

<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>

Public Class Service1

 

    Dim Veri As New DataClasses1DataContext

 

    <OperationContract()>

    Public Function InsanlarGetir() As List(Of Insanlar)

        Return (From inc In Veri.Insanlars).ToList

    End Function

 

    <OperationContract()>

    Public Function TiplerGetir() As List(Of Tipler)

        Return (From inc In Veri.Tiplers).ToList

    End Function

 

End Class

Yukarıda gördüğünüz servis içerisindeki iki metod bize tüm insanları ve tipleri basit bir şekilde döndürecek. Bu metodları kullanarak Silverlight tarafından gerekli veriyi sunucudan çekeren Gridimize bağlamaya çalışacağız.

[VB]

Partial Public Class MainPage

    Inherits UserControl

 

    Public Sub New()

        InitializeComponent()

    End Sub

 

    WithEvents Servis As New ServiceReference1.Service1Client

 

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

        Servis.InsanlarGetirAsync()

    End Sub

 

    Private Sub Servis_InsanlarGetirCompleted(ByVal sender As Object, ByVal e As ServiceReference1.InsanlarGetirCompletedEventArgs) Handles Servis.InsanlarGetirCompleted

        myGrid.ItemsSource = e.Result

    End Sub

End Class

Gördüğünüz en basit hali ile web servisimizden Insanlar listesini alarak Grid'e bağladık. Grid içerisinde kolonları da tabi özelleştirmiş olmamız şart ki böylece uygun bir Combobox'ı da Grid'in bir kolonuna yerleştirebilelim.

[XAML]

        <my:DataGrid x:Name="myGrid" AutoGenerateColumns="False">

            <my:DataGrid.Columns>

                <my:DataGridTextColumn Binding="{Binding Adi}"/>

                <my:DataGridTextColumn Binding="{Binding Adi}"/>

                <my:DataGridTemplateColumn>

                    <my:DataGridTemplateColumn.CellTemplate>

                        <DataTemplate>

                            <ComboBox  />

                        </DataTemplate>

                    </my:DataGridTemplateColumn.CellTemplate>

                </my:DataGridTemplateColumn>

            </my:DataGrid.Columns>

        </my:DataGrid>

Artık Grid'imiz de hazır durumda. Geriye birkaç eksik kaldı. Combobox'ı nasıl dolduracağız? Combobox'ı dolduracak olan veriye Grid'e gelmiyor. Grid'e sadece Insanlar listesi geliyor ve bu liste içerisinde de sadece seçili Tipler'in ID bilgileri bulunuyor. Bu durumda ortak bir yerlerden tüm Tip listesini çekip Combobox'lara vermek zorundayız. Bunun için harici bir veri kaynağı yaratalım.

[VB]

Public Class TipListesi

    Property Tipler As New System.Collections.ObjectModel.ObservableCollection(Of ServiceReference1.Tipler)

 

    Dim Servis As New ServiceReference1.Service1Client

 

    Sub New()

        AddHandler Servis.TiplerGetirCompleted, Sub(sender As Object, e As ServiceReference1.TiplerGetirCompletedEventArgs)

                                                    Tipler = e.Result

                                                End Sub

        Servis.TiplerGetirAsync()

    End Sub

 

End Class

 

Yukarıdaki sınıfımızı XAML içerisinden veri kaynağı olarak kullanacağız. Sınıf içerisinde listemizi sınıfın bir kopyası alındığı anda dolduruyoruz. Doldurma işlemi için de tabi ki yine web servisimizdeki Tiplere ait metodu çağırmak durumundayız.

[XAML]

<UserControl xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="SilverlightApplication4.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400"

            xmlns:daron="clr-namespace:SilverlightApplication4">

    <UserControl.Resources>

        <daron:TipListesi x:Name="TumTipler" />

    </UserControl.Resources>

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

        <my:DataGrid x:Name="myGrid" AutoGenerateColumns="False">

            <my:DataGrid.Columns>

                <my:DataGridTextColumn Binding="{Binding Adi}"/>

                <my:DataGridTextColumn Binding="{Binding Adi}"/>

                <my:DataGridTemplateColumn>

                    <my:DataGridTemplateColumn.CellTemplate>

                        <DataTemplate>

                            <ComboBox DisplayMemberPath="Tip" ItemsSource="{Binding Source={StaticResource TumTipler}, Path=Tipler}" />

                        </DataTemplate>

                    </my:DataGridTemplateColumn.CellTemplate>

                </my:DataGridTemplateColumn>

            </my:DataGrid.Columns>

        </my:DataGrid>

    </Grid>

</UserControl>

Yukarıdaki XAML dosyasında özellikle değişen renkli kısımlara dikkat etmekte fayda var. İlk olarak arka planda yarattığımız sınıfımızı XAML'a alabilmek için namespace tanımını yapıyoruz sonrasında da sınıfın bir kopyasını Local Resource olarak yaratıyoruz. Son olarak bu StaticResource'u Combobox'ın ItemsSource'una bağlıyoruz. DisplayMemberPath'i de Tip olarak set ettikten sonra herşey bitti! Artık uygulamamızı çalıştırabiliriz. Her satır Grid içerisinde gösterilirken Combobox'lar da Tipler ile doldurulmuş olacaktır.

Peki de her kayıt için seçili tip seçili gelecek mi?

İşte esas sorun burada başlıyor. Maalesef gelmeyecek! Bizim bir şekilde her kayıt Grid içerisinde yaratılırken elimizde olan TipID ile Combobox içerisindeki nesnelerden birini bağlamamız gerek. Böylece Combobox içerisinden uygun kayıt otomatik olarak seçili gelmeli! Hatta TwoWay Binding kullanarak Combobox içerisinde bir seçim değişikliği olduğunda bunu ana kayıt listemize de yansıtabilmemiz şart.

Bu durumda bakıyoruz Combobox'ın bind edilebilecek ne özellikleri var! Elde sadece SelectedItem bulunuyor! Şimdi ben bu SelectedItem'ı nasıl TipID'ye bağlayacağım? TipID integer oysa SelectedItem Tipler tipinde. İşte bu ikisini birbirine bağlamanın yolu bir ValueConverter kullanmak!

[VB]

Imports System.Windows.Data

 

Public Class TipMatchConverter

    Implements IValueConverter

 

    Dim TumTipler As New TipListesi

    Dim Tipler As System.Collections.ObjectModel.ObservableCollection(Of ServiceReference1.Tipler)

 

    Sub New()

        Tipler = TumTipler.Tipler

    End Sub

 

    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 (From inc In Tipler Where inc.ID = CInt(value)).SingleOrDefault

    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, ServiceReference1.Tipler).ID

    End Function

End Class

Hazırladığımız bu Converter yapısını da SelectedItem'ın bindinginde artık rahatlıkla kullanabiliriz.

[XAML]

<UserControl xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="SilverlightApplication4.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400"

            xmlns:daron="clr-namespace:SilverlightApplication4">

    <UserControl.Resources>

        <daron:TipListesi x:Name="TumTipler" />

        <daron:TipMatchConverter x:Name="TipMatchConverter" />

    </UserControl.Resources>

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

        <my:DataGrid x:Name="myGrid" AutoGenerateColumns="False">

            <my:DataGrid.Columns>

                <my:DataGridTextColumn Binding="{Binding Adi}"/>

                <my:DataGridTextColumn Binding="{Binding Adi}"/>

                <my:DataGridTemplateColumn>

                    <my:DataGridTemplateColumn.CellTemplate>

                        <DataTemplate>

                            <ComboBox DisplayMemberPath="Tip" ItemsSource="{Binding Source={StaticResource TumTipler}, Path=Tipler}"

                                     SelectedItem="{Binding TipID, Converter={StaticResource TipMatchConverter}, Mode=TwoWay}"/>

                        </DataTemplate>

                    </my:DataGridTemplateColumn.CellTemplate>

                </my:DataGridTemplateColumn>

            </my:DataGrid.Columns>

        </my:DataGrid>

    </Grid>

</UserControl>

Kendimizi hamallık yapmış gibi hissetmemiz normal :) Çünkü biraz öyle oldu. Fakat yapacak birşey yok. Silverlight 3.0'da uygulayabileceğiniz en temiz çözümlerden biri bu. Bu arada unutmadan belirtiyim aslında Converter içerisinde servisten verinin kesinlikle gelip gelmediğini de kontrol etmenizde fayda var. Kullanıcının bağlantı hızına göre sorunlar yaşanabilir. Tavsiyem Tipler'i global bir yerlerde tutup oradan kullanmanız olabilir.

Peki Silverlight 4.0 ile ne oldu?

Silverlight 4.0 ile gelen özellikle çok basit :) Aslında bu basit özelliğin değerini bilelim diye yukarıdaki senaryoyu özellikle anlatmak istedim. Silverlight 4.0 ile Combobox'lara SelectedValue geliyor! :D Oley!

Böylece rahatlıkla Combobox'ın SelectedValuePath'ini ID olarak ayarlayıp Tipler nesnesindeki ID kolonunun DataGrid'e gelen Insanlar nesnesindeki TipID ile SelectedValue üzerinden bind edilmesini sağlayabiliyoruz.

[XAML]

<UserControl xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="SilverlightApplication4.MainPage"

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

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

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

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

   mc:Ignorable="d"

   d:DesignHeight="300" d:DesignWidth="400"

            xmlns:daron="clr-namespace:SilverlightApplication4">

    <UserControl.Resources>

        <daron:TipListesi x:Name="TumTipler" />

    </UserControl.Resources>

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

        <my:DataGrid x:Name="myGrid" AutoGenerateColumns="False">

            <my:DataGrid.Columns>

                <my:DataGridTextColumn Binding="{Binding Adi}"/>

                <my:DataGridTextColumn Binding="{Binding Soyadi}"/>

                <my:DataGridTemplateColumn>

                    <my:DataGridTemplateColumn.CellTemplate>

                        <DataTemplate>

                            <ComboBox DisplayMemberPath="Tip" ItemsSource="{Binding Source={StaticResource TumTipler}, Path=Tipler}"

                                    SelectedValue="{Binding TipID, Mode=TwoWay}" SelectedValuePath="ID" />

                        </DataTemplate>

                    </my:DataGridTemplateColumn.CellTemplate>

                </my:DataGridTemplateColumn>

            </my:DataGrid.Columns>

        </my:DataGrid>

    </Grid>

</UserControl>

İşte gördüğünüz üzere :) bu kadar basit görülebilecek bir değişiklik aslında ne kadar da hayat kurtarıcı olabililyor. Silverlight 4.0 release olsa da hemen şu dertlerden kurtulsak :)

Hepinize kolay gelsin.

Wednesday, November 18, 2009 6:27:24 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4  | 

Bugün PDC'nin ikinci günüydü. Birinci günde sunucu taraflı yeniliklere baktıktan sonra ikinci günde istemci tarafına göz atılacağı için herkes nefesini tutmuş ikinci gün Keynote'u bekliyordu ki gerçekten de efsanevi bir Keynote oldu diyebilirim! Salonda yaratılan heyecanı tahmin edemezsiniz! Gelin neler olduğuna beraber bakalım!

Keynote Windows 7 ile beraber başladı. Windows 7'nin gelişme sürecindeki etkilerden bahsedilirken hepimizin de bildiği üzere Beta ve RC sürecindeki müşteri dönüşlerinin önemi ve ortaya çıkan üründeki etkisi anlatıldı. Bu esnada verilen bazı istatistikler gerçekten ilgi çekiciydi. 8 milyon kişinin Beta'yı yüklemesi bunlardan sadece bir tanesi! Tüm bu süreçte sadece "Send Report" düğmeleri ile yolladığımız raporlar sonucu bile Windows 7'de 5000 satıra yakın kod değişikliği yapılmış.

Windows 7 geliştirilme sürecinden istatistikler.
Windows 7 geliştirilme sürecinden istatistikler.

Windows 7 ile beraber gelen bazı özelliklerin donanıma bağlı olduğunu biliyorsunuz. Örneğin Multitouch sadece bunlardan biri. Aynı şekilde Sensor development yapabilmek için de donanıma entegre sensörlerin bulunması gerekiyor. Tüm bunlarla ilgili piyasadaki farklı donanımlarla demoların yapıldığı Keynote'un bu kısmının sonunda özel olarak Acer'ın bir laptopu tanıtıldı. Laptop'un Microsoft - Acer işbirliği ile tasarlandığından vs bahsedilirken herkesin aklında "Acaba neden laptop tanıtıyorlar ki?" sorusu geçti. İşte tam da bu noktada söz konusu laptoptan her katılımcıya bir adet hediye edileceği duyuruldu!

PCD'de her katılımcıya bir laptop hediye!
PCD'de her katılımcıya bir laptop hediye!

Duyuru yapıldıktan sonra yaklaşık bir 10 saniye kadar salonda sessizlik vardı. Herkes "Herhalde bu bir şaka" hissiyatında donup kalmıştı. Sonra tabi ki büyük bir alkış koptu! Laptop'un verilmesindeki amaç tabi ki PDC'ye katılan tüm developerların Windows 7'nin yeni özellikleri ile ilgili API'ları rahatlıkla uygulamalarında kullanabilmeleri için bir geliştirme ve test ortamı yaratmaktı. Gerçekten çok başarılı bir iş çıkarıldığını söyleyebilirim.

Malumunuz bu haber dünya çapında sektörde twitter ve friendfeed üzerinden yayıldıkça belki de o anda en sevilmeyen insanlar PDC'ye katılanlar oldu :) Herkes "Keşke biz de gitseydik" gibi içinden geçirdi ve bunu twitter mesajları ile de belli ettiler. Fakat bir gerçek var ki PDC katılımı zaten kişi başı 2000$ civarında :) Tabi bu durum Microsoft'u laptop vermek zorunda bırakmıyor :) ama ortada pek de "tamamen beleş laptop" durumu yok :) Diğer yandan laptop derken de neden bahsettiğimizi detaylandırmak gerek...

1.2 Ghz Celeron ve 2GB Ram'e sahip laptop formunda bir netbooktan bahsedebiliriz aslında. Cihazda CD-Rom yok ve pil ömrü 8 saat. Atom işlemci olmamasına rağmen Celeron ile ucuz ve düşük pil tüketimli bir seçenek kullanılmış. Laptop'un güzel tarafı Duo-Touch bir ekrana sahip olması. Maalesef tam olarak Multitouch değil çünkü sadece 2 touch point destekliyor ama yine de giriş seviyesi development için yeterli. Ayrıca laptopa entegre 3G, GPS ve ışık sensörü bulunuyor. Böylece rahatlıkla Sensor and Location API ile de development yapılabilir bir cihaz oluşturulmuş. Biliyorsunuz tüm bu konularda ben sizlerle zaten teknik makaleleri de blogumda paylaşmıştık hatta 4 ay önce bu konularda etkinlikler de yaptık. Ben de seminerlerde harici bir sensör kit kullanmıştım :) artık dahililer de piyasada yerini bulacak demek ki.

Entegre Ctrl+Alt+Del tuşu :)
Entegre Ctrl +Alt+Del tuşu :)

Cihazda en ilgimi çeken özellikle entegre bir tek tuş ile Ctrl+Alt+Del olayının kolaylaştırılmış olması. :) Herhalde laptop düşün donanımdan çok takılacak diye düşünmüşler :D Şaka bir yana bana epeyce gereksiz geldi bu tuş :) Ne de olsa söz konusu kombinasyonu epey elimiz alışık. Özetle anlayacağınız ortada öyle sürekli kullanılacak bir laptop yok aslında :) amaç netbook tadında ve özellikle de Windows 7'nin yeni özelliklerinin denenebileceği bir donanım sağlamak olmuş. Güzel de olmuş ;)

Internet Explorer 9

Windows 7'den sonra sıra geldi Internet Explorer 9'a. Herhangi bir beta vs duyurulmadı fakat IE9 ile beraber hedeflenen şeyler ve demolar gösterildi. Özellikle IE9 ile beraber IE'nin rendering engine'inin GDI'dan kurtarılarak tamamen Direct2D üzerine taşınmış olması bence efsanevi bir hareket! Böylece artık en basit web sitesi bile render edilirken hardware acceleration kullanış olacak. Bu durum özellikle demolarda DHTML animasyonlarında kendini bariz bir şekilde belli ediyordu.

Internet Explorer 9 yolda...
Internet Explorer 9 yolda...

HTML 5 konusunda desteğine devam edecek olan Microsoft ekibi bu konudaki dertlerini de yazılımcılarla paylaştı. Daha W3C tarafından standartlaştırılmamış draft konseptleri tarayıcılarını entegre eden rakiplerin "HTML 5 uyumluyuz" nidalarını eleştiren ekip bence de çok haklı! Sonuçta standartlaşmamış bir şeyin herhangi bir tarayıcıya implemente edilmesinin yazılım geliştiriciler için hiçbir anlamı yok! Standartlara uymak çok önemli ve zaten bu konu yıllardır MS'i eleştirdiğimiz bir konu olmuştu. Hazır MS bunu toparlarken rakiplerin diğer yola sapması epey garip. Her neyse IE9 gerçekten ümit veriyorum. Eğer IE7'den 8'e alınan yol kadar daha yol alınabilirse kesinlikle IE çok daha başarılı olacaktır.

Silverlight 4 Beta

Günün en önemli duyurularından biri de Silverlight 4'ün Beta'sının public dağıtımıydı! Silverlight gerçekten çok hızlı ilerleyen bir ürün ve daha üçüncü sürümü çıkalı altı ay olmadı ki 4'ün Beta'sı ile karşı karşıyayız. Tabi Silverlight bu süreçte süper bir gelişim gösteriyor ve eksik özellikler olarak nitelendirdiğimiz çoğu şeyin adım adım toparlandığını görebiliyoruz. Community'yi dinleme konusunda Microsoft yine muhteşem bir iş çıkarıyor diyebilirim.

Silverlight 4 Beta karşınızda!
Silverlight 4 Beta karşınızda!

Gelin hızlıce Silverlight 4 Beta ile gelen yeniliklere göz atalım.

  • Printing API, Artık yazıcıya doğrudan özel olarak çıktı gönderebiliyor! Yay!
  • .NET 4 ile SL 4 arasında Assembly paylaşımı!
  • UDP Multicast desteği!
  • Sağ tuş Context menüler
  • Webcam ve Mikrofon kullanımı!!!!
  • Fare Roller desteği! Native!
  • RichTextArea kontrolü!
  • Command desteği (WPF'ten hatırlanabilir)
  • Clipboard desteği!
  • Out Of Browser modunda HTML hosting desteği (Webbrowser)
  • OOB modunda istendiğinde tam sistem erişimi! Böylece full trust modunda tüm donanımlara erişebilirsiniz!!!!
  • Full trust modunda COM Interop!
  • OOB'de Notification API, MSN tadında uyarılar gösterebilirsiniz!
  • OOB'de hosted pencerenin tasarımını değiştirbilmek!
  • Full trust'da Full Screen'de Full Keyboard desteği.
  • ViewBox kontrolü artık Toolkit haricinde SDK'ye dahil.
  • Sağdan sola yazım desteği (Arapça vs için)
  • Offline DRM kullanımı
  • İşletim sisteminde Silverlight uygulamalarına Drag&Drop desteği!
  • Databinding yenilikleri!
  • MEF!
  • ItemsControls'de Fluid desteği!
  • Implecit Temalar.

Tüm bu özelliklerle ilgili teknik makaleleri çok yakında sizlerle paylaşıyor olacağım ;) 

Silverlight 4 Beta sadece Visual Studio 2010 Beta 2 ile beraber çalışabilecek. O nedenle gerekli yüklemeleri yapmadan önce makinanızda Visual studio 2010 Beta 2 bulunması şart. O nedenle aman dikkat diyorum deneme amaçlı kullanacağınız bu makine kesinlikle normal projelerinizi geliştirdiğiniz bilgisayarınız olmamalı. Expression Blend tarafında ise tabi ki Silverlight 4 destekleyecek yeni bir Blend gerekecek. Şimdilik bu konuda da Blend 4'ün Preview'u işimizi görecektir. İndirmeniz gerekenlere aşağıdaki adreslerden ulaşabilirsiniz;

Visual Studio 2010 Beta 2
Silverlight Tools for Visual Studio 2010
Expression Blend 4 Preview

Gece oldu! Şimdi Underground PDC zamanı!

Akşam üstü başlayan bir diğer aktivite ise Underground PDC aktivitesiydi! Bu aktiviteye PDC katılımcıları haricinde özel katılım kodu alanlar katılabildi :) Katılım kodlarını genelde Microsoft çalışanları dağıttı. Ben taaa TechEd Europe zamanı sağ olsun Silverlight Program Manager Tim Heuer'den almıştım. Underground PDC adından da anlaşılacağı üzere biraz daha gayri resmi bir etkinlik olarak PDC'nin relax haliydi diyebiliriz. İçerik olarak çok radikal birşey olmasa da ortam gerçekten hoştu.

Underground PDC böyle olur!
Underground PDC böyle olur!

Etkinlik LA Lakers kızlarının sahnede yerlerini alması ile başladı :) Çok yorum yapılabilecek bir sahne değil desem de bana inanmayın :) Her neyse ben yorum yapmiyim fotoğrafı yukarıda siz inceleyin, yorumları siz yapın :) Etkileyici bir başlangıçtı diyebilirim. Etkinliğe katılanlar LA Lakers kızlarının yanına giderek MSDEV logolu dövme yaptırabiliyorlardı tabi beraber fotoğraf çekilmek isteyenler de az değildi :)

Scott sahnede!
Scott sahnede!

Sonrasında Scott sahneyi aldı ve tekrar Silverlight 4 ile ilgili oturum başladı. Daha önce de bahsettiğim gibi Underground PDC ile normal PDC'nin katılımcıları aynı değildi çünkü Underground için ayrıca davetiye almanız gerekiyordu. Biraz da bu nedenle PDC içeriği ile Underground PDC içeriği çakıştı diyebilirim. Fakat zevkli bir ortamda zevkli bir etkinlikti diyebilirim.

Böylece yavaştan PDC'nin de sonuna doğru gelmeye başladık. Yarın üçüncü ve son gün! Herhangi bir keynote yok. Regional Director'lar olarak Scott Gu ile ayrı bir toplantımız var. Toplantı tamamen gizlilik sözleşmeleri çerçevesinde olacağı için pek paylaşabileceğim birşey olmayacaktır diye tahmin ediyorum ama tabi belli de olmaz :)

Görüşmek üzere!

Wednesday, November 18, 2009 6:02:33 PM (GTB Standard Time, UTC+02:00)  #    Comments [11]   Silverlight 4 | Windows 7 | IE 9  | 
 Tuesday, November 17, 2009

Bugün PDC'nin ilk günüydü. Birinci güne her zamanki gibi Keynote ile başladık. Bugün yazılımcıları ilgilendiren sunucu taraflı ve daha ağırlıklı altyapı kısımları ile ilgili yenilikler duyuruldu. Duyuruları gün içerisinde olabildiğince sizlerle twitter üzerinden de paylaşmaya çalıştım. Yarınki Keynote'da ise istemci taraflı yeniliklerden bahsedilecek! Gelin bugün neler olduğuna bir göz atalım!

PDC, 1. Gün!
PDC, Los Angeles, 1. Gün!

Sabah Keynote için salonun dolması pek de uzun sürmedi. 8.30'da başlayacak Keynote öncesinde neredeyse 8.00'da salon dolu gibiydi. Bu arada "dolu" derken 7000 kişi üstü katılımdan bahsediyorum! Delice bir kalabalık yeni gelecek duyuruları heyecanla bekliyordu! ve tabi duyurular da sırası ile geldi!

Windows Azure geliyor!

Evet! Uzun süredir beklenen haber geldi ve artık Windows Azure 1 Ocak itibari ile satışta olan bir ürün olacak. Aslında ürün demek çok yanlış, bir hizmet / servis desek daha doğru. İlk faturaların kesildiği tarih olarak ise 1 Şubat öngörülüyor. Maalesef bu döneme Türkiye dahil değil! Yani Türkiye'de söz konusu hizmet satılmayacak. Türkiye'de satışın başlaması benim tahminimce 2010 sonunu bulacaktır. Peki bu tahmine nereden vardım? Şu anda Azure Data Center'ları Kuzey ve Güney Amerika'da bulunuyor. 2010 içerisinde Avrupa ve Asya'da da DataCenter'lar kurulacak. Bunu takiben ikinci aşamada da Türkiye'de satışların başlaması pek de garip olmaz sanırım :)

Windows Azure 1 Ocak'ta karşınızda!
Windows Azure 1 Ocak'ta karşınızda!

Aslında kısmen yazılım geliştiriciler olarak bu gecikme sürecinde şanslıyız. Çünkü Azure Türkiye'de satışa başlayan kadar çoktan hem altyapı hem de özellikle yazılım geliştirici araçları ile olgunlaşmış olacak. Son bir yılda bile Azure tarafında geliştirme araçlarında çok BÜYÜK gelişmeler oldu! En basiti artık SQL Services için Management aracı var, eskiden yoktu! Pek teknik detaylara girerek şu yenilik geldi vs diye anlatmayacağım çünkü dediğim gibi kullanabileceğimiz birşey değil şu an için. Fakat özetlemek gerekirse Azure'u yani Cloud Computing'i SOA'dan sonraki yeni nesil model olarak öngörebiliriz belki de! Tabi unutmamak gerek ki salt "yenidir" diye eldeki herşeyi Azure'a taşımak gibi bir saçmalığa da girmemek gerek :) Neyse zamanı geldiğinde bu konuda daha detaylı yazılar yazacağım ;)

AppFabric

Eski adı / kod adı Velocity ve Dublin olan sunucu taraflı altyapı teknolojisi artık Beta 1 sürümü olan Windows Server Appfabric ile karşımıza çıkıyor. Özellikle Azure'da da entegre olarak bulunan bu yapı ile sunucular arasında bir uygulamanın dağılımından ve yönetiminden tutun önbellekleme ihtiyaçlarına kadar geniş çaplı projelerde performansın artmasını ve yönetimi kolaylaştırabiliyorsunuz.

Velocity ve Dublin oldu AppFabric!
Velocity ve Dublin oldu AppFabric!

Pinpoint ve Dallas

Şimdilik Amerika'ya özgü olan iki ilginç duyuru da PinPoint ve Dallas'tı. Pinpoint aslında özellikle Azure ortamı için bir tür marketplace olarak düşünülmüş. Yani elinizde bir servis var ve bunu satmak istiyorsunuz, Pinpoint hemen bir servis kataloğu ile size yardımcı olabiliyor. Servisiniz PinPoint'te listelenebiliyor böylece hem kullanıcıların da servis satın alabilecekleri bir yerde yer almış oluyorsunuz. Şu an için Microsoft Hosted Services platformu da aynı sistemi kullanıyor. Sitenin bir çok başka MS sitesi ile entegrasyonu olacak böylece tüm bu yazılımların promosyonu da sağlanmış olacak.

Dallas ise aslında Pinpoint'in bir parçası. Kod adı Dallas olan sistemin amacı ile DATA paylaşımı. Bu paylaşım ücretli veya ücretsiz olabiliyor. Örneğin Amerika'da NASA elindeki bazı veritabanlarını servis olarak ücretsiz bir şekilde Dallas üzerinden paylaşıyor. Bu da aktivitedeki duyurulardan biriydi. Aynı şekilde devlete ait sağlık sektörü ağırlıklı data paylaşımları da var. Gerekirse bu data paylaşımları ücretli olarak da verilebiliyor. Buradaki amaç ise herkesin elindeki datayı paylaşması ve bu dataların bir şekilde farklı kişilerce birleştirilecek apayrı uygulamaların doğmasını sağlamak.

Dallas konusunda biraz daha açıklayıcı olmak adına örnek vermek gerekirse düşünün ki ülkemizde SSK elindeki çoğu datayı ücretli olarak olsa da bir servis olarak Dallas üzerinden sunuyor. Aynı şekilde diğer özel sigorta şirketleri de datalarını paylaşıyor. Siz tüm bunları birleştirip bir Azure uygulamalası geliştirebilir ve bunu da Azure üzerinden yayınlayıp PinPoint üzerinden hizmet olarak satabilirsiniz! Böylece aslında farklı yerlerde bulunan bu dataların bir anda farklı bir birleşimi ile apayrı bir çözüm yaratılabiliyor.

Windows Identity Foundation

Benim uzun süredir çaktırmadan ilgilendiğim konulardan biri olan WIF aslında eski Geneva'nın yeni ismi. Hatırlarsanız .NET Framework 3.0 ile beraber Cardspace diye birşey eklenmişti Framework'e :) Bugüne kadar üzerinde çok çalışmış olsam da bir makale bile yazmadım çünkü maalesef gerçek hayat kullanımında ürünün sunucu taraflı desteği eksikti! Uzun süredir beklediğim Geneva sonunda WIF olarak Active Directory desteği ile beraber RC oldu! Yakında bu konuda sizlerle birşeyler paylaşmaya başlayabilirim ;)

Microsoft değişti ve değişiyor!

Farklı açılardan çok farklı bir Keynote vardı bugün. Azure tarafından bahsedilirken Java, PHP ve MySQL desteğinin defalarca üzerinde duruldu. Hatta WordPress ekibi sahneyi aldı ve Azure ile yaşadıkları deneyimin ne kadar başarılı olduğundan bahsetti! Benim için kişisel olarak WordPress'i Keynote'da görmek çok şaşırtıcı oldu diyebilirim. Diğer yandan bu kadarla kalmadı! Dallas ile ilgili mobil bir uygulama örneğinde Amerika Bilişim Bakanı (ben böyle Türkçeye çevirdim :)) canlı olarak yayına bağlandı ve örnek uygulamalarını bir iPhone üzerinde gösterdi! O an salondaki 7000 kişilik gülüşmeyi duymalıydınız! Herhalde Windows Phone ekibi kenarda ağlamaya başlamıştır!

Ray Ozzie Azure'dan bahsederken ekranda neler var neler!
Ray Ozzie Azure'dan bahsederken ekranda neler var neler!

Tüm bunlara baktığımda bazen "Kraldan çok kralcı" mı olduk diye düşünmüyor değilim :) Ama cidden bakıyorum da Windows Mobile 6.1 telefonumdan cidden memnunum :) Her neyse, konumuz bu değildi. Özetle PDC'nin ilk günü hem ilginç hem de güzel geçti. Duyurular bazı yazılımcıları çok heyecanlandırırken bazıları ise genelde infra/sunucu taraflı duyurular olduğu için sıkıldı. Özellikle Azure da kullanamayan bir ülke olarak yarınki Keynote'un bizim için daha heyecan verici olacağını düşünüyorum!

Yarın görüşmek üzere! ;)

Tuesday, November 17, 2009 6:07:41 PM (GTB Standard Time, UTC+02:00)  #    Comments [3]   Azure | WIF  | 
 Monday, November 16, 2009

PDC öncesinde Los Angeles ısınma turlarını yaptığım bugünlerde ikinci ziyaretimde sonunda Los Angeles'ta bir yerleri görme fırsatım oldu :) Daha önce ziyaretminde sadece teknoloji mağazalarını gezebilirken bu sefer biraz daha ileri giderek Holywood Universal Studios'u ziyaret ettim. Samimi olmak gerekirse MIX'te Las Vegas'ı gördükten sonra aşırı etkileyici geldiğini söyleyemem ortam olarak :) Fakat yine de Amerikan pazarlama dehasının bir parçası olarak görülebilir. Hani bir an insan kendine soruyor neden bizim Yeşil Çam'ın böyle bir müzemsi vs ortamı yapılmamış diye!

Holywood, Universal Studios
Holywood, Universal Studios

Bahsettiğim gibi PDC öncesinde tam günlük bir Regional Director toplantımız vardı. Toplantı boyunca fotoğraf makinesi vs yasak olduğu gibi tüm içerik de tamamen gizli olduğu için o toplantıdan herhangi birşey paylaşma şansım olmayacak. Fakat kabaca PDC'nin ikinci gününün benim açımdan daha heyecanlı olacağını anlamış bulundum :) Akşamında yine RD'ler olarak havuş başında bir partimiz oldu. Partinin en sevdiğim yanı hem Internet Explorer ekininden hem de .NET RIA Services (ki bu arada yeni adı WCF RIA Services oldu!) ekibinden developerlarla görüşebilmek oldu! Kaba tabiri ile "feedback kustum" diyebilirim :D Her iki konuda da epey derdim olduğu için hepsini aktarma şansım oldu hatta özellikle IE ile ilgili bazı konularda trickler de öğrendim. Türkiye'de müşterilerimizle karşılaştığımız bazı sorunları anlatırken konuştuğum kişiler bir anda kağıt kalem arayıp not alması :) beni sevindirdi!

Regional Director Party!
Regional Director Party!

Anlayacağınız güzel bir ısınma turu ile PDC'ye hazır durumdayım. Bakalım yarın neler gelecek! Tamam itiraf ediyorum neler geleceğini biliyorum :) ama yarına kadar yazamam! Yarınki Keynote'dan görüntülerle görüşmek üzere...

Monday, November 16, 2009 9:15:06 PM (GTB Standard Time, UTC+02:00)  #    Comments [1]    | 
 Sunday, November 15, 2009

Hatırlarsanız Berlin, TechEd Europe ziyaretimi sizlerle blogumdan paylaşırken TechEd Online için de bir "Multitouch in Silverlight" röportajı verdiğimden bahsetmiştim. Söz konusu röportaj TechEd Online sitesinde yayınlandı! Ben de sizlerle paylaşmak istiyorum ;)

Sunday, November 15, 2009 4:46:59 AM (GTB Standard Time, UTC+02:00)  #    Comments [3]   Silverlight 3.0  | 
 Friday, November 13, 2009

Haftaya çok heyecanlı bir hafta olacak. Los Angeles'taki PDC (Professional Developer Conference) ile beraber birçok yenilik bizi bekliyor. Büyük süprizler var. Hazır tüm bu sürprizler taze taze gelirken bir de INETA olarak Aralık yakında INETA NEXT etkinliğimizi gerçekleştirme kararı aldık! Bu sefer biraz daha farklı bir konsept ile etkinliği dört ayrı şehirde yapacağız!

INETA NEXT bomba gibi geliyor!
INETA NEXT bomba gibi geliyor!

Gerçekte de bomba gibi geliyor. Şu anda maalesef etkinlik içeriklerini duyurma şansımız yok çünkü malum zaten çoğu konuda daha Microsoft tarafında da haftaya duyurulacak :) O nedenle hemen tarihleri ve kayıt olma şansını sizinle paylaşalım istedik. İleriki haftalarda ayrıca içeriği de tabi ki paylaşacağız! Bu arada unutmadan! Her ilde bir kişiye yepyeni bir beyin veriyoruz! Benden söylemesi :)

Dört ayrı ilde hep beraber görüşmek üzere! Kayıt olmayı unutmayın!

Not: Herkesten duyuru konusunda destek istiyoruz :) Aşağıdaki bannerı bloglarınızda, sitelerinizde paylaşabilirseniz muhteşem olur! Tüm desteğiniz için çok teşekkürler.

INETA NEXT Banner

Friday, November 13, 2009 2:57:04 PM (GTB Standard Time, UTC+02:00)  #    Comments [12]   ASP.NET 4.0 | Silverlight 4 | .NET Framework 4.0  | 
 Wednesday, November 11, 2009

İşte üçüncü gün :) Dün akşam geç yatmış olmanın etkisi ile bugün biraz geç geldim TechEd'e. Doğrudan Silverlight Booth'a geçerek görevimin başında yerimi aldım. Silverlight Booth'da gerçekten ilginç soruları geliyor. Genelde baktığımda insanların çoğu Silvelright ile ilgilenmiş ve takılabilmeleri olası yerlerde de doğal olarak takılmışlar. Tabi çoğu soruya "Haftaya PDC'yi takip edin!" şeklinde cevaplar vermek zorunda kaldık :) Çünkü Silverlight MVP'leri olarak çoğumuz PDC'de olacakları biliyoruz fakat tahmin edebileceğiniz üzere paylaşamıyoruz.

Silverlight Booth'da görev başında!
Silverlight Booth'da görev başında!

Genel olarak itiraf etmek gerekirse Amerika'dans onra kabaca Silverlight konusunda en ileri ülkelerden biriyiz diyebilirim. Booth'u ziyaret edenler olsun, görevli diğer Silverlight MVP'leri olsun veya MS çalışanları hiç fark etmez, hiçbirinin de gösterebileceği ülkelerinden örnekleri yoktu! Oysa benim elimde bir sürü örnek ver :) 7innovations.com, IsBank'ın Multitouch Widget uygulaması, benim yaptığım Multitouch oyunlar olsun hepsi de soru soranların büyük ilgisini çekti. Diğer taraftan şu anda pek paylaşamayacağım Türkiye'den Enterprise level SL projeleri ile ilgili deneyimlerimiz de gördüğüm kadarı ile pek Avrupa'da yaşanmamış. Tabi tüm bu değerlendirmeye kendi gördüğüm katılımcılar ve görevlilerden yola çıkarak yapıyorum ve toplam tüm hafta boyunca 20 saate yakın görev yapmış olacağım. Artık bu değerlendirilmelerin ne kadar efektif olduğunda siz karar verin.

Her zamanki gibi zaten birinci ve ikinci gün haricinde pek janjanlı bir duyuru vs olmaz o nedenle teknik anlamda şimdi paylaşabileceğim pek birşey yok. Sadece bu arada Silverlight için Bing Map kontrolleri Release oldu o kadar.

Gün sonunda sevgili Sefer Algan ve Oğuz Yağmur ile ufak bir şehir turu yaptık. Berlin duvarın ve tek geçiş noktası olan "Checkpoint Charly"'yi ziyaret ettik. Fotoğrafları webde yayınlamamı yasakladılar :) o nedenle beraber çekildiğimiz fotoları artık yayınlayamıyorum :) Ama yine de ortamı gösterebilmek adına üç sene önceki ziyaretminden bir fotoğrafı aşağıda bulabilirsiniz :)

Checkpoint Charly, Berlin'in iki yarısı arasında geçiş noktası.
Checkpoint Charly, Berlin'in iki yarısı arasında geçiş noktası.

Her Türk gibi biz de akşam yemeğimizi Hasır Restaurant adında bir Türk restoranında yaptık :) İskender ve Künefe ikilisi ile ilgili saplantımı burada da devam ettirmiş oldum. Gördüğünüz üzere düne kıyasla biraz daha sakin fakat bir o kadar keyifli geçen bir gündü benim için. Özellikle akşam restoranda 5 saat kadar kaldığımızı sohbetin sonunda farkına varmamız keyif miktarının bir ölçütüydü :)

Yarın son günüm ve sonrasında İstanbul'a geri dönüp 20 saat içerisinde de Los Angeles'a uçacağım PDC için. Bakalım daha neler olacak!

Wednesday, November 11, 2009 10:58:49 AM (GTB Standard Time, UTC+02:00)  #    Comments [3]    | 
 Tuesday, November 10, 2009

Muhteşem bir gün daha geçti :) TechEd ikinci gününde maalesef hiçbir teknik oturuma katılamadım :) PDC'ye saklıyorum kendimi. Açık konuşmak gerekirse pek yeni birşeyler yoktu. Peki nasıl oldu da muhteşem bir gün oldu? İlk olarak MVP programı çerçevesinde bir röportajım oldu. MVP Global blogunda yayınlandığında ayrıca blogumdan duyuracağım. Sonrasında neredeyse tüm gün Avrupa'dan farklı INETA sosyal toplulukları ile görüşmeler yaptım. Fikir paylaşımlarında bulunduk.

Community Lounge'da fikirleri paylaşırken :)
Community Lounge'da INETA Avrupa Yönetiminden Jose Louis Latorre ile fikirlerimizi paylaşırken :)

Yukarıdaki fotoğraftan da anlayabileceğiniz üzere yoğun bir bilgi paylaşımı söz konusu :) Bana Guitar Hero oynamayı öğretme çabaları pek de meyve verdi diyemem. Sırtında sırt çantası ile gitar çalan tek manyak benimdir herhalde :) Daha neler neler oldu! Daha önce de sizinle paylaştığım üzere tabi tüm gün böyle geyikle geçmedi :P Technical Learning Center'da gün içerisinde dört saat kadar Silverlight Booth'da görevliydim. Özellikle gelip soru soranlar arasında bazı Türk katılımcıların da olması çok hoştu :) Tabi ki onlara özel ilgi gösterdim. Hatta bazıları "Blogunuzu da takip ediyoruz" diyince içten içe mutluluktan eridim desem yeridir.

"Silverlight nedir?" sorusunu soran iki katılımcı! :D
"Silverlight nedir?" sorusunu soran iki katılımcı! :D

Bu esnada iki katılımcı gelip "Silverlight nedir?" şeklinde bir soru sordular :D Şaka bir yana hepinizin de tanıdığı üzere sevgili Sefer Algan ve Oğuz Yağmur da TechEd Europe'a Türkiye'den katılanlar arasındaydı ve tabi ki beni tam gün İngilizce konuşmaktan kurtararak güzel bir sohbete aldılar. İkisine de çok teşekkür ediyorum, ilaç gibi geldi :) Sanırım Türkiye'den TechEd'de yer alan 3 MVP'iydik.

TechEd Day 2 Party!
TechEd Day 2 Party!

Günün sonuna doğrudan TechEd içerisinde Community Lounge'da bir parti düzenlendi. Bu partinin başka bir yüzünü dün twitter'da duyurmuştum :) Oluşan bira ve şarap kuyruğunu hayal bile edemezsiniz. Ama gerçekten eğlenceli olduğunu itiraf etmeyilim. Sonrasında yavaş yavaş otele doğru geçip ondan sonra da INETA, Culminis gibi sosyal toplulukların özel VIP :) eğlencesine geçtim.

WaterGateClub'da Community Party!!!
WaterGateClub'da Community Party!!!

WaterGateClub adında bir kulüpte düzenlenen partide malum soft içkiler sınırsız ve ücretsizdi :) Durum böyle olunca etrafta bazı Almanlar'ın bile bana saygı göstermeye başladıklarını itiraf etmeliyim :) Hep söylüyorum alkol hacmen hesaplanır ve avantajlıyım diye fakat anlamıyorlar :) Şaka bir yana nehir kenarında güzel bir kulüpte DJ eşiliğinde hoş bir aktiviteydi. Tabi eğer gidip TechEd'deki Geek'leri çağırırsanız ortaya %98'i erkek ve IT/Dev konuşan bir kitle çıkar. Bir de herkes eğer Community'lerde çalışıyorsa etrafta seminer maceraları uçuşur. :) Tüm gece boyunca herkes ya Windows 7, ya Visual Studio 2010 ya da askerlik hatıraları kıvamında seminer maceralarından bahsetti. Benim de içerisinde olduğum bir ekip son metroyu kaçırmamak adına gece yarısından önce pamuk prenses kıvamında otellerimize döndük :)

Şimdi sanırım TechEd'deki ikinci günümün neden bu kadar eğleceli geçtiğini görmüşsünüzdür :) Daha tabi ki paylaşamadığım onlarca fotoğraf var :) Bazılarının paylaşılmamasında da tabi ki fayda var :)

Bakalım yarın neler olacak :) Kalın sağlıcakla.

Tuesday, November 10, 2009 11:18:57 AM (GTB Standard Time, UTC+02:00)  #    Comments [2]    | 
 Monday, November 09, 2009

Bugün TechEd Europe'un ilk günüydü. Günün açılışının günün sonuna koyarak ilginç bir konsept uyguladılar yine :) İlk önce normal oturumlarla başladı gün ve gün sonunda da Keynote ile bitti. Benim pek oturumlara katılma şansım olmadı. Entity Framework 4.0 ile ilgili bir oturum dışında dışarıda takılmam gerekti. Neden mi gerekti? INETA Community Lounge'da INETA Europe'dan bazı arkadaşlar görüşmelerim vardı. Zaten bu tip aktivitlerin belki de özellikle TechEd'in benim için en büyük avantajı sürekli mailleştiğiniz kişilerle yüz yüze de toplantılar yapabiliyor olmak.

TechEd Europe bu sene Berlin'de!
TechEd Europe bu sene Berlin'de!

Entity Framework 4.0

Konuyu uzatmadan EF 4.0'a gelelim. Bu konuda güzel gelişmeler var. Özellikle ilk sürümdeki eksiklere kıyasla çoğu şey toparlanıyor. Concept'ten veritabanına geçişe kadar çoğu yerde eksik olan arayüzler Visual Studio 2010 ile giderilmiş durumda. Kişisel olarak (lazy loading) dahil çoğu kolaylık nedeniyle LINQ2SQL'in RAD'a daha uygun buluyordum fakat EF'de yavaş yavaş o noktaya yaklaşmaya başladı. Özellikle T4 şablonları ile code generation konusunda yenilikler süper! Tüm bunlar zaten önümüzdeki süreçte sizlerle hem INETA etkinliklerinde hem de makale ve görsel derslerde paylaşıyor olacağız.

Keynote

Genel olarak TechEd maalesef ITPro odaklı geçiyor. Developer oturumları epey az. Zaten ben de Silverlight Technical Learning Center'da görevli olduğum için çok oturumlara kaçma şansım olmuyor. O nedenle bu iki gerçek beni mutlu etmiyor diyemem :) Ama Türkiye'ye en yakın MS etkinliklerinden biri olarak TechEd Europe'un bu kadar ITPro odaklı geçmesi çok da hoşuma gitmiyor. Belki bunda özellikle Win7, Exchange 2010, ForeFront vs gibi ürünlerin lansman zamanına denk gelmesinin de etkisi vardır. Belki de sadece haftaya Los Angeles'ta yapılacak PDC (Profession Developer Conference) için saklıyorlardır içerikleri :) Merak etmeyin orada da olacağım ve yenilikleri hem twitter üzerinden anında hem de blog üzerinden günlük olarak sizlerle paylaşacağım.

TechEd Europe Keynote
TechEd Europe Keynote

Toplam 7200 kişinin katıldığı Keynote'daki en büyük duyuru Exchange 2010'du. Outlook 2010 entegrasyonu ile yapılabilenlere dair birkaç demo beni bile etkiledi diyebilirim :) Sonuçta PC başında geçirdiğim sürenin ciddi bir kısmı Outlook karşınızda geçiyor. O nedenle yenilikler ne kadar ITPro taraflı olsa da son kullanıcıya yansımaları da çok güzel. Tabi hepsi bu kadar :) yani developer odaklı herhangi bir duyuru yok :) Biliyorum, kısmen hayal kırıklığı yaşıyorsunuz, fakat yapacak birşey yok. Şimdilik durum bu :)

INETA Europe Toplantısı

Günün sonunda, akşam üstü Berlin'in sürekli duyduğum restoranlarından birinde, Gendarmenmarkt'da INETA Europe toplantısı gerçekleşti. Toplantıya tüm avrupa'dan User Group Lead'leri ve tabi ki Microsoft Regional Director'lar katıldı. Ben de MEA'dan Türkiye'yi temsilen yemekte yerimi aldım :) Gerçekten çok zevkli bir toplantıydı. Türkiye'de yaptığımız etkinliklerden bahsettikçe insanların hayranlıkla şaşakaldıklarını gördüm ve çoğu kalem kağıt çıkararak bizim Türkiye'de yaptığımız etkinliklerin konseptlerini not almaya başladılar :)

INETA Europe Yönetim Ekibi ile beraber...
INETA Europe Yönetim Ekibi ile beraber...

Malum dünyanın her yerinde gönüllü iş yapmakla ilgili karşılaşılan sorunlar genelde aynı. O nedenle bazı sorunlar bizim Türkiye'de nasıl aştığımızı anlattığımda aldığım tepkiler çoğu "Siz Türkiye'de gerçekten çok yaratıcı çözümler üretmişsiniz" şeklindeydi :) Neyse çok uzatmayacağım, fakat genel bir hayranlık oluştuğunu net bir şekilde söyleyebilirim. Çok yakında avrupa'da INETA Türkiye olarak daha çok duyulacağımızı söyleyebilirim :) Güzel gelişmeler bizi bekliyor.

Bugünlük bu kadar. Bakalım yarın neler olacak :) Genelde sanırım Silverlight booth etrafında görevime devam edeceğim. Gelişmeleri sizin hem twitter hem blogdan paylaşmaya devam ;)

Kalın sağlıcakla...

Monday, November 09, 2009 9:05:33 PM (GTB Standard Time, UTC+02:00)  #    Comments [2]    | 
 Sunday, November 08, 2009

Bugün Berlin'de MCT Day Zero etkinliğine katıldım. Günün adı merak uyandırıcı olduğu için hemen açıkliyim :) Yarın Berlin'de TechEd Europe başlıyor ve ben de TLC (Technical Learning Center)'da Silverlight bölümünde görevliyim. Bu çerçevede hazır insanlar Berlin'e gelecek diye düşünerek etkinlik öncesine de bir MCT günü konmuş ve adı da tabi ki "Gün 0" olmuş :) çünkü Gün 1 yarın :)

Neyse olayın geyik kısmı bırakıp bugün için neler olduğuna ve paylaşabileceğim bilgileri bir göz atalım. Bu bilgilerin çoğu malumuzun ağırlıklı olarak MCT'leri ilgilendirecektir.

Online Labs

İlk güzel haber Online Labs! Artık MCT'ler öğrencilerine eğitim verebilmek için uygun ortamı yaratmak, uygun bilgisayarları hazırlamak zorunda kalmayacaklar. Aynı şekilde CPLS'ler de Online Laboratuarları kullanabilecek. Online Labs çok yakında başlayacak ve başladığında tabi ki bir ücreti de olacak. Fakat öğrencilerin evlerinden bile faydalanabileceği bu güzellik bence özellikle IT tarafında bazı eğitim senaryolarında vazgeçilemez nitelikte olacak.

MOC Kitapları Dijital!

MOC kitapları özellikle ülkemizde en büyük dertlerden biri. Normal şartlarda herhangi bir CPLS'ten eğitim alındığında eğitimi bir MCT'nin vermesinin yanı sıra eğitimle ilgili varsa MOC kitaplarının da öğrenciye sağlanması gerekir. Çoğu eğitimde maalesef bu kitapların Türkçe'leri de yok. Diğer yandan özellikle hızlı, aniden açılan eğitimlerde vs kitapların yurt dışından gelme süreci çok uzayabiliyor ve eğitim bitiminde kitap ancak gelmiş oluyor. Tüm bu sorunları aşabilmek adına artık MOC kitapları dijital olarak da öğrencilere ulaştırılabilecek.

MOC'lar için Connect üzerinde bug report yapılabilecek!
MOC'lar için Connect üzerinde bug report yapılabilecek!

Eğitimlere doğrudan yorumlar!

MCT'ler MOC (Microsoft Official Curriculum) setleri ile ilgili yorumlarını farklı şekillerde Microsoft'a iletebiliyordu. Fakat bu süreçlerde sorun olduğunu zaten herkes biliyor. Özellikle bu yorumlara geri dönüş alamamak en büyük sıkıntılardan biri. Daha da ilginci bazen bu sorunlar çözülse de :) geri dönüş yapılmadığı için sorunu bildirenin haberi olmayabiliyor. Tüm bu sorunları gidermek adına zaten var olan, ürün gruplarının kullandığı ve başarılı bir şekilde işleyen Connect sistemine artık Courseware içerikleri de aktarılacak ve aynı ürünlere bug submit eder gibi Courseware'lerle ilgili de Connect altyapısı kullanılabilecek. Bu bençe eğitim materyallerinde kaliteyi ciddi şekilde arttıracaktır.

Hilekar sertifikacılar!

Bir diğer dert ise Microsoft Sertifika Sınavları ile ilgili hilekar hareketler! Bu konuda her ne yapılırsa yapılısın önüne geçilmesi zor gibi duruyor fakat ilginç bir gelişme var :) Artık sertifika sınavlarında her sonuya kullanıcıların ne kadar zamanda cevap verdikleri ve toplamda sınavı ne kadar bitirdikleri takip edilecek! Doğal olarak sınav sorularını çok hızlı cevaplayanlardan "kıllanılacak" (süper bir fiil oldu bu:))

MCT Day Zero'da tanıştığım eski bir MCT olan ve geçen sene Microsoft Learning'de Program Müdürü olarak göreve başlayan Matthew Roche söyledikleri ile beni gerçekten gaza getirdi diyebilirim. Eski bir MCT'nin Learning'de işe başlaması ve idalist olması bence çok iyi! Tabi ki değişiklikler anında yapılamıyor fakat gördüğüm kadarı ile Matthew tüm MCT'lerin sorunlarının zaten farkında ve bu farkındalıkla da gerekli düzenlemeleri yapmak için elinden geleni yapıyor. Örneğin neredeyse TR'de hiçbir MCT'nin kullanmadığım (Ben dahil) MTM konusunda o da dertli. Buradan sadece Matthew'ın bir ricasını MCT'lerle paylaşmak istiyorum. Student Evaluation sistemini kullanmasanız da MCT'lerin doldurduğu "Course Evaluation"'ı kesinlikle doldurun. Bunların değerlendirildiğini Matthew'ın kendi laptopunda kendi hazırladığı chartlardan gördüm, şahidim :)

Gelelim MCT olmayanlara :) Sizler biraz daha bekleyin. Çok yakında sizler için de heyecanlı şeyler paylaşacağım blogdan.

Hepinize kolay gelsin...

Sunday, November 08, 2009 6:05:26 PM (GTB Standard Time, UTC+02:00)  #    Comments [1]    | 
 Friday, November 06, 2009

Bugün Kıbrıs, Doğu Akdeniz Üniversitesi'nde yine her zamanki gibi güzel bir gün geçirdim. Aslında maceramız dün başladı :) Dün Microsoft'u Gençsen Geleceksin turu çerçevesinde bir sunumum oldu. Sonrasında bugün ise teknik sunumlarla devam ettik. Multitouch development, Sensor and Location API ve Windows 7 ile beraber gelen Taskbar özelliklerine dair programlama altyapısına göz attığım üç ayrı oturumda da beni yalnız bırakmayan herkese çok teşekkürler :)

Doğu Akdeniz Üniversitesi, KKTC
Doğu Akdeniz Üniversitesi, KKTC

Organizasyonda katkısından dolayı özellikle DAÜ MSP'lerinden Olcay Kük'e çok teşekkür ediyorum. Umarım herkes için faydalı bir iki gün olmuştur ;)

Friday, November 06, 2009 8:35:36 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   MultiTouch | Windows 7 | WPF  | 
 Wednesday, November 04, 2009

Windows 7 ile beraber gelen ve daha pek de hissedemediğimiz değişiklikler biri de "Sensor and Location API" adını taşıyor. Adından da anlaşılacağı üzere aslında yeni bir API topluluğundan bahsediyoruz ve bu topluluğun biz .NET yazılım geliştiricilere sağladığı şey ise işletim sistemi üzerinden donanım bağımsız olarak rahatlıkla Konum (GPS) ve diğer farklı sensörlere ulaşma altyapısı. Tabi bunun içinn elinizde söz konusu donanımın bulunması ve donanımın da Windows 7 sürücülerini taşıması veya Windows 7 uyumlu olması şart.

Ben bu makaleyi yazarken FreeScale tarafından üretilmiş deneme ve yazılım geliştirme amaçlı kullanılabilecek bir Sensör kitinden faydalandım. Bu tip sensörlerin çok yakında donanımsal olarak da laptoplara entegre edilmesi ilginç sentaryolara olanak tanıyabilecek. Bu durum ister laptoptaki bir accelerometer aracılığı ile laptopun fiziksel durumunu anlamak olsun ister laptopun içerisinde bulunduğu ortamdaki ışık miktarına bakarak otomatik olarak ekran parlaklığından tutun uygulamaların içerisindeki yazıların punto ve renklerine kadar kendi kendilerine ortam ışığına göre adapte etmelerine kadar farklı senaryolar uygulanabilir.

FreeScale sensör kit ile Windows 7 denemeleri.
FreeScale sensör kit ile Windows 7 denemeleri.

Sensörlere ulaşmak için Windows 7'nin "Sensor and Locaiton API"larını kullanmak durumundayız. Bu API'lar için gerekli .NET Wrapper'ları ise şu ancak ayrı olarak bilgisayarınıza indirebileceğiniz bir paket. .NET Framework 4.0 ile beraber bu Wrapper'lar Framework'e dahil edilecek ve herhangi bir şekilde ayrıca downloada gerek kalmayacak. Fakat şimdilik gerekli DLL'leri aşağıdaki adresten bilgisayarınıza indirmeniz şart.

http://code.msdn.microsoft.com/SensorsAndLocation/Release/ProjectReleases.aspx?ReleaseId=2359

Download işlemini tamamladıktan sonra gerekli projeyi de compile edince karşınıza Windows7.SensorAndLocation.dll adında bir dosya çıkacaktır. Bu dosya bizim Sensörlere ulaşmamız için gerekli wrapperları sunacak. Artık yeni bir proje yaratarak hızlıca sensörlerimize ulaşabiliriz.

Örnek olarak bir WPF projesi yaratarak XAML kısmına da basit bir TextBlock koyalım. Bu örnekte hedefimiz sisteme bağlı bir ışık sensörüne gelen ışık miktarını yakalayarak değişikliklere de göre sürekli durumu takip edebilmek.

[XAML]

<Window x:Class="Window1"

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

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

   Title="Window1" Height="300" Width="300">

    <Grid>

        <TextBlock x:Name="txtMiktar" Text="12" />

    </Grid>

</Window>

Yeni yarattığımız WPF projesine Windows7.SensorAndLocation.dll DLL'imizi de referans aldıktan sonra hemen kod tarafına geçiş yapıyoruz. İlk amacımız sisteme bağlı ışık sensörlerinin bir listesini almak.

[VB]

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

        Dim IsikSensorleri = SensorManager.GetSensorsByType(Of Sensors.Light.AmbientLightSensor)()

        Dim IlkSensor = IsikSensorleri(0)

        AddHandler IlkSensor.DataUpdated, AddressOf Sensor_VeriGeldi

    End Sub

Kodumuzun daha ilk satırında Generic bir metod kullanıyoruz. GetSensorsByType metoduna uygun Senör tipi olarak AmbientLightSensor verdiğimizde geriye sisteme bağlı ışık sensörlerinin bir listesi dönüyor. Bu listeden hemen ilk sensörü yakalayarak devam edebiliriz. Tabi siz farklı durumlarda birden çok sensör ile beraber işlem de yapabiliriz hatta bu koda "sistemde gerçekten ışık sensörü var mı?" gibi kontrolleri de eklemek gerek. Şimdilik makaleyi amacından şaşırmamak ve çok uzatmamak adına bu gibi kontrolleri konu dışı bırakıyorum.

Son satırda elimizdeki sensörün DataUpdated event'ını yakalıyoruz. Bu noktada önemli olan detaylardan biri bu event'ın ayrı bir Thread'de çalışacak olması. O nedenle bir sonraki adımda bu event'ı yakaladığımız kodumuzdan tekrar UIThread'e dönebilmek için ufak bir takla atacağız.

[VB]

    Private Sub Sensor_VeriGeldi(ByVal sensor As Windows7.Sensors.Sensor, ByVal dataReport As Windows7.Sensors.SensorDataReport)

        Dim IsikMiktar = dataReport.GetDataFields().ToList(2).Value

        Dim Zaman = dataReport.GetDataFields().ToList(1).Value

 

        Dim Parametreler As New List(Of Object)

        Parametreler.Add(IsikMiktar)

        Parametreler.Add(Zaman)

        Me.Dispatcher.BeginInvoke(New Aktar(AddressOf VeriGeldi), Parametreler.ToArray())

    End Sub

Sensöre her veri geldiğinde yukarıdaki method çalışacak ve bahsettiğimiz gibi bu method UIThread'e değil! İlk olarak dataReport parametresi üzerinden sensördeki ışık miktarını ve bu raporun bize aktarıldığı tam zaman dilimini ayrı ayrı değişkenlere alıyoruz. GetDataFields metodu bize bu sensör ile ilgili tüm verileri bir Key/Value Pair Dictionary olarak aktarıyor. Key'ler biraz karışık olduğu için hemen listeye çevirip index üzerinden istediğimizi yakalamak daha kolay olabilir. Ne de olsa bu listelerdeki Field sayıları sensör tipine spesifik ve sabit.

[VB]

    Private Sub Sensor_VeriGeldi(ByVal sensor As Windows7.Sensors.Sensor, ByVal dataReport As Windows7.Sensors.SensorDataReport)

        Dim IsikMiktar = dataReport.GetDataFields().ToList(2).Value

        Dim Zaman = dataReport.GetDataFields().ToList(1).Value

 

        Dim Parametreler As New List(Of Object)

        Parametreler.Add(IsikMiktar)

        Parametreler.Add(Zaman)

        Me.Dispatcher.BeginInvoke(New Aktar(AddressOf VeriGeldi), Parametreler.ToArray())

    End Sub

Gelelim eventımızı yakaladığımızda ve verileri aldığımızda bunları UIThread'e aktarmanın yoluna. WPF'de Dispatcher üzerinden UIThread'e ulaşabiliriz. Bunun için ayrıca bir Delegate ve bir de Method yaratmak şart. Bu methodlar iki ayrı parametre alacaklar, biri IsikMiktar diğeri ise Zaman. Eldeki parametre değerlerini de bir Array olarak gönderiyoruz.

[VB]

    Delegate Sub Aktar(ByVal IsikMiktar As Object, ByVal Zaman As Object)

 

    Sub VeriGeldi(ByVal IsikMiktar As Object, ByVal zaman As Object)

        txtMiktar.Text = IsikMiktar.ToString & ", " & zaman.ToString

    End Sub

Yukarıda gördüğünüz VeriGeldi kodumuz artık Dispatcher sayesinde UIThread'de çalışıyor. Yani rahatlıkla UIElement'lerimize ulaşabiliriz. Gelen parametreleri şimdilik alıp ilk aşamada ekrana yerleştirdiğimiz TextBlock üzerine yazdırıyoruz.

Gördüğünüz gibi bir sensöre ulaşarak değişiklikleri takip etmek bu kadar kolay. Tabi bu noktadan sonra tüm bu değişikliklere göre nasıl işlemler yapacağınız size kalmış. Örneğin bu şekilde bir sensör bağladığınız ortamdaki ışık miktarı arttıkça Windows 7 ekran parlaklılığını da arttıyor. Ortamdaki ışık miktarı azalınca ise ekran parlaklığı azalıyor. Böylece gözünüz çok daha rahat bir şekilde ekrandaki içeriği algılayabiliyor.

Kullanmanız olası tüm diğer farklı sensör tiplerinde de veri değişikliğini yakalama ve UIThread'e atkarma mekanizması bire bir aynı. Değişen tek şey DataFields Collection'ında gelecek bilgilerin sayıca artması veya azalması olacaktır.

Hepinize kolay gelsin.

Wednesday, November 04, 2009 4:57:54 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Windows 7  | 
Copyright © 2010 Daron Yöndem. Tüm hakları saklıdır.