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

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

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

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

Isparta Geceleri :)
Isparta Geceleri :)

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

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

Daha dün yazdığım yazı sonrasında birçok mail aldım, hatta bloga da yorumlar geldi. Blogumda zaten kendi konuştuğum ve genel blog okuyucularımın katılacağını düşündüğüm aktiviteleri duyuruyorum. Örneğin onlardan biri de Yazgeliştir Zirvesi olacak! 29 Mayıs tarihinde Microsoft ofisinde gerçekleşecek zirvede ben de ilginç bir oturum sunacağım :) "Silverlight ile Kullanıcı İstatistikleri" olarak özetlediğim bu oturumda Silverlight kullanılan web sitelerinde kullanıcıların hareketlerini ve davranışlarını nasıl takip edebileceğimize ve bu yönde istatistiksel bilgilerin nasıl toplanabileceğine dair hoşunuza gideceğini düşündüğüm bir oturum sizi bekliyor ;) Tabi bu kadar değil daha birçok oturum etkinlik boyunca beğeninize sunulacak :)

Yazgeliştir Zirvesi

Buradan detaylarına ulaşabileceğiniz etkinlikle ilgili özellikle iki isme teşekkür etmem gerek. Sevgili RD dostlarım Atakan Kesler ve Kerem Özsu! Yazgeliştir'in tekrar offline aktivitilerle karşımıza çıkmasında çok büyük katkıları var. Bundan sonra da Kerem ve Atakan yazgeliştir'in liderleri olarak eminim ki çok daha farklı yenilikler gerçekleşecek. Aslında bazılarını biliyorum ama sürpriz :) Unutmadan, INETA tarafındaki .NET 4 lansmanlarımız çerçevesinde biliyorsunuz nedirtv ile başlamıştık, yazgeliştir sonrasında da maxiasp'nin bir etkinliği olacak. Hiçbirini kaçırmayın derim ;)

Thursday, April 22, 2010 3:51:58 PM (GTB Standard Time, UTC+02:00)  #    Comments [8]   Silverlight 4  | 
 Tuesday, April 20, 2010

Bugün Ankara'da Ankara Üniversitesi'ndeydim. Son dönemde bolca "Neden Ankara'ya gelmiyorsunuz" mesajları aldığım için özellikle bu ziyaretimi de bloga yazmak istiyorum :) Bu süreçte hala bazen bu gibi etkinlikleri geç haber alanların şikayetlerini duymuyor değilim. O nedenle hızlıca bu meseleyi bir halledelim. Sevgili dostlar :) bu tarz etkinliklerden haberdar olmak için etkinliklerin organize eden veya etkinlikte konuşmacı olarak bulunan kişileri takip etmeniz şart. Ben kendi adıma bunun için birkaç farklı kanal kullanıyorum.

Blog: Teknik makale, videoların bulunduğu ağırlıklı paylaşım alanı olmanın yanı sıra blog okuyucularımın çoğunun katılabileceğini düşündüğüm, halka açık büyük etkinlikleri de bazen duyurduğum yer. Etkinlik sonrasında deneyimlerimi, teşekkürlerimi ve heyecanımı da paylaştığım yer yine blogum oluyor. Bu bağlamda blogu ister RSS ister e-mail ile takip etmenizde fayda var.

Twitter: Ufak duyuruları çıktığım yer. Örneğin Visual Studio 2010 downloada açıldıktan 3 dk sonra twitter'a girmiştim :) Bloga yazmadım. Neden mi? Çünkü sadece "Visual Studio 2010 Çıktı" diye blog post atmak istemiyorum. Twitter üzerinden beni takip etmeniz en az blog kadar önemli. Buradan hemen kayıt olabilirsiniz. Visual Studio 2010'dan tutun SL4'ün çıkmasına ve bazen üniversite ziyaretlerime kadar herşeyi Twitter'dan erkenden duyuruyorum. Örneğin haftaya Isparta, Süleyman Demirel Üniversitesi'nde olacağım ve bunu sadece Twitter'dan duyurdum.

Facebook: Facebook'u özel olarak pek kullandığımı söylemem. Genelde gelen mesajlara pek cevap veremiyorum. O nedenle mail atmanız daha uygun olur. Twitter üzerinden gönderdiğim herşey, bloga yazdığım her yazı facebook'a düşüyor otomatik olarak. Yani orayı da bir takip mekanizması olarak kullanabilirsiniz. Bazen çok büyük etkinliklerde tüm arkadaşlarımı davet etmeyi de unutmuyorum tabi ki :) İsteyenler için facebook sayfam http://www.facebook.com/daron.yondem

FriendFeed: Maalesef friendfeed'e neredeyse hiç bakamıyorum. Yorumları vs ancak mail ile takip ediyorum. Yine facebook gibi bloga ve twitter'a girdiğim herşey friendfeed'e de gidiyor ama onun dışında pek bir aksyon yok benim tarafta açıkçası. Friend feed adresi : http://friendfeed.com/daronyondem

İşte tüm bu araçları doğru bir şekilde kullanabilmek ve community'yi takip etmek gerekiyor. Böylece neredeyse çoğu şeyden rahatlıkla haberdar olabilirsiniz. Şimdi gelelim postun esas konusuna :) Ankara Üniversitesi etkinliği :)

Ankara Üniversitesi, Silverlight 4
Ankara Üniversitesi, Silverlight 4

Etkinlik benim açımdan çok güzel geçti. Bunun en önemli nedeni aslında salonun tamamen beni daha önce hiç dinlememiş bir kitle ile dolu olmasıydı :) Bu bağlamda benim için çok verimli oldu diyebilirim. Silverlight 4' bakarken biraz benim de animasyon anlatmak sıkılmam sonucunda :) tamamen data odaklı bir anlatım yaptım. Sonunda gelen özel rica olmasa sanırım animasyonları hiç göstermeyecektim :) Eh ne de olsa kaynaklar var blogda seminler var izlersiniz ;) Etkinliğin ikinci ayağında Microsoft Ankara ofisinden sevgili Tayfun Akçay Sharepoint anlattı ve günü bu şekilde bitirdik. Günün organizasyonunda emeği geçen sevgili MSP Atahan Ceylan'a, TBD Genç ekibine ve üniversitenin bilişim kulübüne de çok teşekkürler.

Tekrar görüşmek üzere ;)

Tuesday, April 20, 2010 11:59:25 AM (GTB Standard Time, UTC+02:00)  #    Comments [10]   Silverlight 4  | 
 Monday, April 19, 2010

Bugün Trabzon'da Karadeniz Teknik Üniversitesi'ndeydim. Visual Studi 2010 akademik lansmanları çerçevesinde hem Visual Studio 2010 hem de .NET Framework 4 Yeniliklerine baktığımız bir oturum ile zevkli bir lansman geçti diyebilirim. Trabzon ve genel olarak Karadeniz bölgesi temiz havası ve denizi ile benim aşık olduğum bir bölge. Özellikle sanırım Türkiye'nin en havalı havalimanı :) Trabzonda.

Karadeniz Teknik Üniversitesi, Visual Studio 2010 Lansmanı
Karadeniz Teknik Üniversitesi, Visual Studio 2010 Lansmanı

Etkinliklte emeği olan tüm öğrenci kardeşlerime çok teşekkür ediyorum. Özellikle sevgili MSP'miz Mehmet Aydın Bahadır'a buradan onlarca teşekkürler. Keyifli bir lansman sonrası yarın da Ankara'da Ankara Üniversitesi'nde olacağım. TBD Genç'in organize ettiği ve dışarıya da açık olacak yarınki etkinliği kaşırmayın derim.

Monday, April 19, 2010 7:05:51 AM (GTB Standard Time, UTC+02:00)  #    Comments [3]   Visual Studio 2010  | 
 Saturday, April 10, 2010

Bugün NedirTV 4. Yıl Dönümü etkinliğindeydim. Etkinlikten bahsetmeden önce 4. yılına giren NedirTV'yi ve özellikle bu süreçte büyük katkısı olan kurucusu sevgili Uğur Umutluoğlu'nun kutluyorum! NedirTV'ye gönüllü olarak harcadığı süreyi çok net biliyorum ;) Gelelim etkinliğe. Benim etkinlikte minik bir HTML5 oturumum vardı. HTML5 konuşmak için aslında daha çoook erken :) fakat yine de özellikle IE9 Developer Preview'ın da çıkması ile beraber şöyle bir göz atmakta fayda olacağını düşündüm. Fena da olmadı gibi :) Geleceğe bir bakış attık. Oturumun video kayıtlarını aldım, daha detaylı inceleme şansım olmadı fakat teknik bir sorun yoksa kesinlikle oturumun kaydını blogdan da paylaşacağım. Hazır kayıt almışken tüm günü kaydettik. Tüm oturumların kayıtlarına topluca ulaşmak isterseniz nedirtv.com'u takip edebilirsiniz.

NedirTV 4. Yıl Dönümü
NedirTV 4. Yıl Dönümü

Etkinlikteki tüm fotoğraflara buradan ulaşabilirsiniz. Bir başka etkinliklte tekrar görüşmek üzere ;)

Saturday, April 10, 2010 7:09:56 PM (GTB Standard Time, UTC+02:00)  #    Comments [2]   HTML5 | IE 9  | 
 Wednesday, April 07, 2010

Bu hafta sonu benim de editörü olduğum nedirtv.com'un kuruluşunun 4. yılını kutluyoruz :) Tabi bir sosyal topluluğun kutlaması nasıl olur? Bir seminer serisi ile olur :) Etkinlik ile ilgili detaylar ve katılım için kayıt olabilmek için aşağıdaki adresi ziyaret edebilirsiniz.

http://www.nedirtv.com/haber/nedirtvcom-Seminerleri---4-Yildonumu.aspx

Ben de seminer serisinde HTML5 konusuna değineceğim ;) Hoş bir konu olacak, ayrıca bir kişiye de güzel bir hediyem olacak. Şimdiden söylemesi benden :)

Görüşmek üzere...

Wednesday, April 07, 2010 12:07:03 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   IE 9 | HTML5  | 
 Tuesday, April 06, 2010

Silverlight 4 ile beraber gelen "Full Trust Out Of Browser" modunun getirdiği ek özelliklerden biri de tarayıcı dışına alınan bir Silverlight uygulamasının host edildiği işletim sistemi penceresini de özelleştirebiliyor olmak. Aslında daha gerçekçi bir bakış açısı ile konuya bakarsak :) işletim sisteminin penceresini kullanmayıp kendi pencere yapınızı oluşturmanız gerekiyor fakat bu noktada da Silverlight içerisinde yeni API'ler gerçekten bu işi çocuk oyuncağına çeviriyor. Bu yazımıda sıfırdan bir Full Trust OOB uygulaması yaratıp uygulama penceresinin görünüşünde yapabileceğimiz değişikliklere göz atacağız.

Uygulamamızın penceresi ile ilgili yapabileceğimiz ayarlar.
Uygulamamızın penceresi ile ilgili yapabileceğimiz ayarlar.

Yeni yarattığımız uygulamaya sağ tuş ile Solution Explorer içerisinde tıklayıp ulaşabileceğimiz "Properties" ekranında ilk olarak uygulama bir "Out Of Browser" application yapabilmek için "Enable running application out of the browser" seçeneğini işaretliyoruz. Sonrasında "Out-Of-Browser Settings" bölümüne geçerek hemen full-trust moduna geçmek "Require elevated trust" kutucuğunu işaretliyoruz. Böylece "Windows Style" adındaki combo aktif hale gelerek bizim uygulamamıza ait işletim sistemi penceresini özelleştirebilmemizi sağlıyor. İlk olarak gelin uygulamamızda örnek amaçlı olarak ihtiyacımız olacak kontrolleri yaratalım.

[XAML]

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

        <Rectangle x:Name="recBar" Fill="Blue" Height="27" VerticalAlignment="Top"/>

        <Button x:Name="btnKapat" Content="Button" HorizontalAlignment="Right" Height="19" Margin="0,8,8,0" VerticalAlignment="Top" Width="23"/>

        <Rectangle x:Name="recKose" HorizontalAlignment="Right" Height="22" VerticalAlignment="Bottom" Width="31">

            <Rectangle.Fill>

                <LinearGradientBrush EndPoint="1.273,1.348" StartPoint="0.5,0">

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

                    <GradientStop Color="White"/>

                </LinearGradientBrush>

            </Rectangle.Fill>

        </Rectangle>

        <Button x:Name="btnUfalt" Content="Button" HorizontalAlignment="Right" Height="19" Margin="0,8,72,0" VerticalAlignment="Top" Width="23"/>

        <ToggleButton x:Name="btnBuyut" Content="ToggleButton" HorizontalAlignment="Right" VerticalAlignment="Top" Width="20" Margin="0,5,48,0"/>

    </Grid>

Uygulama ekranımızda iki adet ayrı Rectangle var. Bunlardan birini uygulama ekranını sağa sola taşıyabilmek için handle olarak kullanacağız. Diğer rectangle ise uygulama ekranın sağ alt köşesine yapıştırılmış durumda. Böylece bu rectangle da uygulama ekranının sağ alttan tutularak tekrar boyutlandırılabilmesini sağlayacak. Rectangle'lar haricinde iki button ve bir de ToggleButton'umuz var. Düğmelerden biri uygulamayı kapatmak için diğeri ise Windows Taskbar'a küçültebilmek için lazım. ToggleButton ise uygulamanın gerektiğine tam ekran yapılabilmesini veya eski haline geri alınabilmesini sağlayacak. Anlayacağız aslında kabaca normal bir Windows penceresi yapacağız ama tamamen kendi tasarımımız ve implementasyonumuz ile yapacağız.

Basit hali ile uygulama ekranımız.
Basit hali ile uygulama ekranımız.

Aslında bu noktaya kadar tasarımınızı tamamladınız ve "No Border" ayarını yaptıysanız uygulamanızın desktop modundaki penceresini bitirdiniz demektir. Fakat geriye kalır işlevsellikleri eklemek. Yani en basiti "Kapat" düğmesine basıldığında uygulama kapanmalı. Gelin şimdi bu gibi özellikler için kullanacağımız API'lere hızlıca göz atalım.

[VB]

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

        If App.Current.HasElevatedPermissions And App.Current.IsRunningOutOfBrowser Then

            App.Current.MainWindow.DragMove()

        End If

    End Sub

Yukarıdaki kod ile uygulama penceremizin taşınması ile ilgili gerekli işlevselliği projemize eklemiş olduk. Çok kolay değil mi? Tek yapmanız gereken handle olarak kullanacağınız bir UIElement'i sahneye eklemek (bu bizim örneğimizde bir rectangle) sonra da MouseLeftButtonDown eventinde DragMove metodunu çağırmak. Geriye kalan herşey otomatik olarak halloluyor. Artık uygulamamızın kendi tasarladığımız penceresindeki handle'dan tutup sağa sola taşıyabiliriz. Tabi eğer taşınan koordinatı kenara bir yere kaydetmek ve bir dahakine oradan açmak isterseniz kaydetme ve okuma işlemlerini IsolatedStorage'dan AppSettings ile sizin yapmanız gerekecektir.

[VB]

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

        If App.Current.HasElevatedPermissions And App.Current.IsRunningOutOfBrowser Then

            App.Current.MainWindow.DragResize(WindowResizeEdge.BottomRight)

        End If

    End Sub

Dikkatinizi çektiyse tüm API'leri kullanırken uygulamanın Desktop modunda olup olmadığını ve Full Trust bir uygulama olup olmadığını da kontrol ediyoruz. Çünkü aksi halde kullanıcıların bu API'leri tarayıcı içerisinde de çağırabilirlerde ve tek alacakları şey de garip hatalar olurdu. Konumuza dönecek olursak. Bir sonraki adımda hedefimiz uygulama penceremizin boyutunun kullanıcı tarafından değiştirilebilmesini sağlamak. Bunun için zaten uygulama ekranında ek bir Rectangle nesnesini ekranın sağ altına yerleştirmiştik. Böylece kullanıcıların o Rectangle üzerinden tıklayarak uygulama penceresini boyutlandırabilecekti. İşte bunu da yapabilmek için söz konusu Rectangle'ın MouseLeftButtonDown durumunda DragResize metodunu çağırıyoruz. Metodumuzu çağırırken ayrıca uygulamanın neresinden Resize edildiğini de parametre olarak vermemiz gerekiyor. Bizim Rectangle sağ altta olduğunda göre BottomRight parametresi doğru olacaktır. Başka herhangi birşey yapmamız gerekmiyor. Artık penceremiz hem taşınabilir hem de boyutlandırılabilir oldu.

[VB]

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

        If App.Current.HasElevatedPermissions And App.Current.IsRunningOutOfBrowser Then

            App.Current.MainWindow.Close()

        End If

    End Sub

 

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

        If App.Current.HasElevatedPermissions And App.Current.IsRunningOutOfBrowser Then

            App.Current.MainWindow.WindowState = WindowState.Minimized

        End If

    End Sub

 

    Private Sub btnBuyut_Checked(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnBuyut.Checked

        If App.Current.HasElevatedPermissions And App.Current.IsRunningOutOfBrowser Then

            App.Current.MainWindow.WindowState = WindowState.Maximized

        End If

    End Sub

 

    Private Sub btnBuyut_Unchecked(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnBuyut.Unchecked

        If App.Current.HasElevatedPermissions And App.Current.IsRunningOutOfBrowser Then

            App.Current.MainWindow.WindowState = WindowState.Normal

        End If

    End Sub

Yukarıdaki dört durumu çok basit bulduğum için topluca değerlendirmeyi uygun buldum. Kodlarımızdan ilki Close metodu ile programı kapatıyor. Diğer metodlar ise özünde hem Winforms hem de WPF'ten alışık olduğumuz WindowsState'i değiştiriyor. Yani uygulama penceresini tam ekran yapabiliyor, normal haline alabiliyor veya taskbara ufaltabiliyoruz. Tüm bunları uygun kontrollere de atayınca olay bitiyor.

Gördüğünüz gibi kendi özel pencerelerini tasarlayarak Silverlight Desktop uygulamalarınızı da apayrı görselliklerle sunabilirsiniz ;)

Hepinize kolay gelsin.

Tuesday, April 06, 2010 8:12:24 PM (GTB Standard Time, UTC+02:00)  #    Comments [5]   Silverlight 4  | 

Bugün Akdeniz Üniversitesi İnternet Haftası'ndaydım. Geçen sene Silverlight ve WPF ile kullanıcı deneyimine değinmiştik. Bu sene de yine aynı etkinlikte WPF4, .NET Framework 4 ve Visual Studio 2010 ile sahnedeydim. Benden önce de sevgili Ahmet Uygur hızlıca bir Office 2010 upgradi yaptı hepmize ;) Her zamanki gibi çok eğlenceli bir gündü özellikle İstanbul'dan bir gün de olsa Antalya'ya gidince insanın havası değişiyor öyle geri döndüğünüzde bir saçmalama dönemi geçirip kendinizi tatilde sanabiliyorsunuz :)

Akdeniz Üniversitesi Seminerim
Akdeniz Üniversitesi Seminerim

Etkinlikte emeği geçen tüm öğrenci kardeşlerime ve tabi ki bizleri gün boyunca yalnız bırakmayan tüm hocalarımıza defalarca teşekkürler. Umarım faydalı olmuştur ;) Önümüzdeki sene için şimdiden çok farklı planlarımız ben Akdeniz Üniversitesi için, benden söylemesi :)

Tuesday, April 06, 2010 7:07:00 PM (GTB Standard Time, UTC+02:00)  #    Comments [1]   .NET Framework 4.0 | ASP.NET 4.0 | Silverlight 4 | Visual Studio 2010 | WPF  | 
 Monday, April 05, 2010

DataGrid kontrolü belki de iş uygulamalarında en sık kullanılan kontrollerden biridir. Silverlight içerisinde de uzun bir süredir DataGrid kontrolü bulunuyor. Özellikle performans artıları ve esnekliği ile aslında Silverlight ile beraber gelen DataGrid emin olun üçüncü parti bir DataGrid almanızı gerektirmeyecek kadar kuvvetli. Daha da güzel bu DataGrid'in kaynak kodları da CodePlex üzerindeki Silverlight Toolkit içerisinde bulunuyor. Hatırlarsanız çok önceleri DataPager kontrolünden bahsederken PagedCollectionView adında bir sınıftan bahsetmiştim. Söz konusu sınıf aslında bir DataGrid kontrolünün gruplama özelliğini de ortaya çıkarak ilginç bir yapıya sahip. Bu yazımızda ilk olarak DataGrid'in gruplama özelliğinin kullanımına değineceğiz. Sonrasında da bu gruplama özelliğini daha da özelleştirmeye çalışacağız.

DataGrid ile gruplama....

DataGrid kontrolü aslında kendi içerisinde gruplama sistemini barındırıyor. Tek yapmanız gereken gruplama desteğine sahip ve gerekli ayarları yapılmış bir PagedCollectionView kullanmak. Şimdi elimizde hali hazırda bir DataGrid olduğunu düşünelim ayrıca bir de entitylerimizden oluşan listemiz var.

[XAML / DataGrid]

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

        <sdk:DataGrid HorizontalAlignment="Stretch" Name="DataGrid1" VerticalAlignment="Stretch" />

    </Grid>

[VB]

    Public Class OrnekEntity

        Public Property Adam As String

        Public Property Sehir As String

        Public Property Ilce As String

    End Class

 

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

        Dim EldekiListe As New List(Of OrnekEntity)

        For index = 1 To 10

            EldekiListe.Add(New OrnekEntity With {.Adam = "Örnek Adam" & index,

                                                   .Ilce = "İlçe" & (index Mod 2).ToString(),

                                                   .Sehir = "Şehir" & (index Mod 5).ToString()})

 

        Next

 

    End Sub

Bu listeyi hemen aşağıdaki gibi bir PagedCollectionView'e çevirebiliriz.

[VB]

        Dim Paged = New PagedCollectionView(EldekiListe)

        Paged.GroupDescriptions.Add(New PropertyGroupDescription("Sehir"))

        Paged.GroupDescriptions.Add(New PropertyGroupDescription("Ilce"))

        DataGrid1.ItemsSource = Paged

Kodumuz olabildiğince kısa ve basit. Paged adındaki PagedCollectionView bir liste üzerinden yaratılıyor. Liste içerisindeki entitynin property'lerinin ikisinin adı Sehir ve Ilce şeklinde. İşte tam da bu noktada eldeki listenin söz konusu property'lerin değerlerine göre gruplanmasına gerektiğine dair bilgiyi PagedCollectionView'a iletiyoruz. Bunun için bir PropertyGroupDescription yaratarak parametre olarak olası property'lerin adlarını String olarakveriyoruz ve PropertyGroupDescription'ları da PagedCollectionView'ın GroupDescriptions listesine ekliyoruz. Son olarak eldeki PGD'yi de gride aktarıyoruz gösterilmek üzere. Gördüğünüz üzere aslında herşey yeterince basit.

DataGrid'den Grouping Desteği
DataGrid'den Grouping Desteği

Gördüğünüz üzere iç içe gruplamalar dahil kolaylıkla güzel bir sistem oluşturulabiliyor. Bu manzarada hoşunuza gitmeyebilecek ilk şey gruplama için kullanılan bilgilerin DataGrid içerisinde de kolonlarda gösteriliyor olması. Bu sorunu çözmek çok kolay. Eğer DataGrid'in AutoGenerateColumns özelliği False yapar ve kolonları siz belirlerseniz istediğiniz property'lerin kolon olarak gösterilmemesini sağlayabilirsiniz. Söz konusu Property'lerdeki değerler sadece gruplama amaçlı kullanılabilir.

Aslında bu manzarada en sinir bozucu şeylerden biri her grubun başında "1 item", "2 item" gibi İngilizce birşeylerin yazılı olması ve maalesef bunu değiştiremiyor olmanız. Tabi yazımızın başında da bahsettiğimiz gibi kontrolün kaynak kodları veriliyor ve rahatlıkla o seviyede gerekli değişiklikler yapılabilir fakat SDK dışına çıkmak istemeynler ve sürekli her yeni sürümü çıktığında DataGrid assemblysini özelleştirmek zorunda kalmak istemeyenler için daha pratik bir yol olmalı değil mi? Çok pratik olmasa da sizlerle bir taktik paylaşacağım. Bu taktik ile gruplama için DataGrid içerisindeki kullanılan yapıyı tamamen değiştirebileceksiniz.

Ne de olsa herşey Silverlight değil mi?

DataGrid'in gruplama esnasında kullandığı görsel yapıyı ilk gördüğümde. "Ne de olsa herşey Silverlight değil mi burada?" demiştim. Bir şekilde oradaki yapıya ulaşabilmem ve değiştirebilmem gerekirdi. Fakat maalesef ki DataGrid kontrolü geliştirilirken bu pek de düşünülmemiş ve son developer (son kullanıcıdan yola çıkıp ürettiğim bir terim) pek düşünülmemiş. O nedenle biraz takla atmak gerekecek.

İlk olarak yapılması gereken şey kontrolün kaynak kodlarını inceleyerek hali hazırda DataGrid'in gruplama için kullanılan görsel kısmını bulmak. Böylece söz konusu görsel kısmı değiştirerek belki de parametrik olarak elimizdeki normal DataGrid'e verebiliriz? DataGrid'in iç yapısını ve kaynak kodunu incelediğimizde gruplama görseli için DataGridRowGroupHeader adında primitive bir kontrol kullanıldığını görüyoruz. Söz konusu kontrol System.Windows.Controls.Data assemblysi altında System.Windows.Controls namespace'inde bulunuyor. Bu kontrol DataGrid'in içerisinde gruplama amaçlı kısımlarda kullanıldığına göre bu kontrolün görselliğini yani şablonunu (template) değiştirmemiz yeterli olacaktır. Hatta daha önce de bahsettiğimiz gibi hali hazırda var olan şablonu alıp kaynak kodlarından rahatlıkla ilerleyebiliriz.

[XAML]

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

Yukarıdaki şekilde kontrolü XAML tarafında tanımlanabilir hale getirdikten sonra kaynak dosyalarından kontrolün varsayılan şablonuna ait XAML kodunu da aşağıdaki şekilde alıyoruz.

[XAML]

<ControlTemplate x:Name="Ornek" TargetType="dataprimitives:DataGridRowGroupHeader">

            <sdk:DataGridFrozenGrid x:Name="Root" Background="{TemplateBinding Background}">

                <sdk:DataGridFrozenGrid.Resources>

                    <ControlTemplate x:Key="ToggleButtonTemplate" TargetType="ToggleButton">

                        <Grid Background="Transparent">

                            <VisualStateManager.VisualStateGroups>

                                <VisualStateGroup x:Name="CommonStates">

                                    <VisualState x:Name="Normal"/>

                                    <VisualState x:Name="MouseOver">

                                        <Storyboard>

                                            <ColorAnimation Duration="0" To="#FF6DBDD1" Storyboard.TargetProperty="(Stroke).Color" Storyboard.TargetName="CollapsedArrow"/>

                                            <ColorAnimation Duration="0" To="#FF6DBDD1" Storyboard.TargetProperty="(Fill).Color" Storyboard.TargetName="ExpandedArrow"/>

                                        </Storyboard>

                                    </VisualState>

                                    <VisualState x:Name="Pressed">

                                        <Storyboard>

                                            <ColorAnimation Duration="0" To="#FF6DBDD1" Storyboard.TargetProperty="(Stroke).Color" Storyboard.TargetName="CollapsedArrow"/>

                                            <ColorAnimation Duration="0" To="#FF6DBDD1" Storyboard.TargetProperty="(Fill).Color" Storyboard.TargetName="ExpandedArrow"/>

                                        </Storyboard>

                                    </VisualState>

                                    <VisualState x:Name="Disabled">

                                        <Storyboard>

                                            <DoubleAnimation Duration="0" To=".5" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="CollapsedArrow"/>

                                            <DoubleAnimation Duration="0" To=".5" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ExpandedArrow"/>

                                        </Storyboard>

                                    </VisualState>

                                </VisualStateGroup>

                                <VisualStateGroup x:Name="CheckStates">

                                    <VisualState x:Name="Checked"/>

                                    <VisualState x:Name="Unchecked">

                                        <Storyboard>

                                            <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="CollapsedArrow">

                                                <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>

                                            </ObjectAnimationUsingKeyFrames>

                                            <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ExpandedArrow">

                                                <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>

                                            </ObjectAnimationUsingKeyFrames>

                                        </Storyboard>

                                    </VisualState>

                                </VisualStateGroup>

                            </VisualStateManager.VisualStateGroups>

                            <Path x:Name="CollapsedArrow" Data="F1 M 0,0 L 0,1 L .6,.5 L 0,0 Z" HorizontalAlignment="Center" Stretch="Uniform" Stroke="#FF414345" Visibility="Collapsed" VerticalAlignment="Center" Width="5"/>

                            <Path x:Name="ExpandedArrow" Data="F1 M 0,1 L 1,1 L 1,0 L 0,1 Z" Fill="#FF414345" HorizontalAlignment="Center" Stretch="Uniform" VerticalAlignment="Center" Width="6"/>

                        </Grid>

                    </ControlTemplate>

                </sdk:DataGridFrozenGrid.Resources>

                <sdk:DataGridFrozenGrid.ColumnDefinitions>

                    <ColumnDefinition Width="Auto"/>

                    <ColumnDefinition Width="Auto"/>

                    <ColumnDefinition Width="Auto"/>

                    <ColumnDefinition Width="Auto"/>

                    <ColumnDefinition/>

                </sdk:DataGridFrozenGrid.ColumnDefinitions>

                <sdk:DataGridFrozenGrid.RowDefinitions>

                    <RowDefinition Height="Auto"/>

                    <RowDefinition/>

                    <RowDefinition Height="Auto"/>

                </sdk:DataGridFrozenGrid.RowDefinitions>

                <VisualStateManager.VisualStateGroups>

                    <VisualStateGroup x:Name="CurrentStates">

                        <VisualState x:Name="Regular"/>

                        <VisualState x:Name="Current">

                            <Storyboard>

                                <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisual"/>

                            </Storyboard>

                        </VisualState>

                    </VisualStateGroup>

                </VisualStateManager.VisualStateGroups>

                <Rectangle Grid.ColumnSpan="5" Grid.Column="1" Fill="#FFFFFFFF" Height="1"/>

                <Rectangle x:Name="IndentSpacer" Grid.Column="1" Grid.Row="1"/>

                <ToggleButton x:Name="ExpanderButton" Grid.Column="2" Height="15" IsTabStop="False" Margin="2,0,0,0" Grid.Row="1" Template="{StaticResource ToggleButtonTemplate}" Width="15"/>

                <StackPanel Grid.Column="3" Margin="0,1,0,1" Orientation="Horizontal" Grid.Row="1" VerticalAlignment="Center">

                    <TextBlock x:Name="PropertyNameElement" Margin="4,0,0,0" Visibility="{TemplateBinding PropertyNameVisibility}"/>

                    <TextBlock Margin="4,0,0,0" Text="{Binding Name}"/>

                    <TextBlock Loaded="TextBlock_Loaded" Margin="4,0,0,0" DataContext="{Binding}" Text="DENEME"/>

                    <TextBlock x:Name="ItemCountElement" Margin="4,0,0,0" Visibility="{TemplateBinding ItemCountVisibility}"/>

                </StackPanel>

                <Rectangle Grid.ColumnSpan="5" Grid.Column="1" Fill="#FFD3D3D3" Height="1" Grid.Row="2"/>

                <Rectangle x:Name="FocusVisual" Grid.ColumnSpan="4" Grid.Column="1" HorizontalAlignment="Stretch" IsHitTestVisible="false" Opacity="0" Grid.RowSpan="3" Stroke="#FF6DBDD1" StrokeThickness="1" VerticalAlignment="Stretch"/>

                <sdk:DataGridRowHeader x:Name="RowHeader" sdk:DataGridFrozenGrid.IsFrozen="True" Grid.RowSpan="3"/>

            </sdk:DataGridFrozenGrid>

        </ControlTemplate>

Yukarıdaki kod içerisinde özellikle dikkat edilmesi gereken kısmı renki bırakmaya çalıştım. Gördüğünüz renkli kod kısmı tam da bizim DataGrid içerisindeki gruplama kısmını tanımlıyor. Gruplamanın açılıp kapanmasını sağlayan bir ToggleButton ve gruba ait bilgilerin yazıldığı TextBlock'lar. Ne kadar doğal değil mi? :) Biz de yapsak böyle yapardık herhalde.  Ben kod içerisinde bir de ekstra TextBlock yerleştirdim. Söz konusu TextBlock'a DataContext olarak gelen bütün veriyi Bind ettim. Malum diğer kontrollere de baktığımızda Binding'ler görebiliyoruz. Hatta gruplama yapılan Property'nin adının yazıldığı TextBlock'un Text'i Name adında birşeye bind edilmiş. Acaba bu nesne nedir diyerek deneme amaçlı TextBlock'u koyalım.

Şimdi sıra geldi bu şablonu eldeki sıfır bi DataGrid'in içerisindeki tüm otomatik yaratılan DataGridRowGroupHeader nesnelerine Template olarak aktarmaya. Peki bunu nasıl yapacağız?

[VB]

    Private Sub DataGrid1_LoadingRowGroup(ByVal sender As Object, ByVal e As System.Windows.Controls.DataGridRowGroupHeaderEventArgs) Handles DataGrid1.LoadingRowGroup

        e.RowGroupHeader.Template = Me.Resources("Ornek")

    End Sub

Her DataGrid'in zaten LoadingRowGroup adında bir event'i var. Eğer yukarıda tanımladığımız ControlTemplate'i DataGrid ile aynı sayfada UserControl.Resources kolleksiyonu içerisine koyarsanız ismi ile resource'u bulup aynı yukarıdaki şekilde yaratılan her RowGroupHeader'a Template olarak atayabiliriz. Her atama sonrasında da bizim TextBlock yaratılacağı için kendi Binding'i ile beraber Loaded eventini çalıştıracaktır. Böylece biz de datayı alıp birşeyler yapabiliriz.

[VB]

    Private Sub TextBlock_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)

        Dim TXT As TextBlock = sender

        Dim x As CollectionViewGroup = CType(sender, TextBlock).DataContext

        Dim Subx = x.Items(0)

 

        If TypeOf Subx Is OrnekEntity Then

            TXT.Text = Subx.Adam

        Else

            TXT.Text = CType(Subx.Items(0), OrnekEntity).Adam

        End If

    End Sub

Textblock'un Loaded eventını yukarıda bulabilirsiniz. Aslında ControlTemplate içerisine Binding ile gelen nesne bir CollectionViewGroup ve bu nesne kendi içerisinde hem alt itemlarının sayısını hem de alt itemların bir kolleksiyonunu saklıyor. Tabi bazen alt item dediğimiz şey bir başka CollectionViewGroup olabiliyor. O neden gerekli kontrolleri yazarak en alt item'a kadar gidip istediğimiz bir entity'ye ulaştığımızdan emin olmamız gerek. Sonrasında artık grubun altındaki herhangi bir Entity'le ulaştığınız (veya hepsine) artık istediğinizi yapabilirsiniz. Örneğimizde biz sadece grubun altındaki ilk Entity'nin bir propertysini doğrudan TextBlock'a yazdırıyoruz. Siz kendi örneklerinizde hem tasarım tarafında XAML'ı istediğiniz gibi değiştirebilir hem de farklı işlevsellikler ekleyebilirsiniz.

[XAML]

                <StackPanel Grid.Column="3" Margin="0,1,0,1" Orientation="Horizontal" Grid.Row="1" VerticalAlignment="Center">

                    <TextBlock x:Name="PropertyNameElement" Margin="4,0,0,0" Visibility="{TemplateBinding PropertyNameVisibility}"/>

                    <TextBlock Margin="4,0,0,0" Text="{Binding Name}"/>

                    <StackPanel Orientation="Horizontal">

                        <TextBlock Margin="4,0,0,0" Text="("/>

                        <TextBlock Margin="0,0,0,0" Text="{Binding ItemCount}"/>

                        <TextBlock Margin="4,0,0,0" Text="öğe)"/>

                    </StackPanel>                   

                </StackPanel>

Yukarıdaki örnekte sadece ControlTemplate içerisinde değişiklik yaparak "(1 item)" gibi İngilizce yazıları Türkçe'ye çevirebiliyoruz. Yatay bir StackPanel koyduktan sonra üç adet TextBlock ile "(1 öğe)" gibi bir metni oluşturabiliriz. Binding üzerinden gelen CollectionViewGroup sınıfı ile beraber zaten ItemCount adında bir Property geliyor ve her grubun altındaki sayı hızlıca bir TextBlock'a bind edilebiliyor. Siz isterseniz ToggleButton'un tasarımını bile değiştirebilirsiniz ;) İpler sizin elinizde....

DataGrid'de gruplama Türkçeleştirildi.
DataGrid'de gruplama Türkçeleştirildi.

Hepinize kolay gelsin.

Monday, April 05, 2010 10:54:51 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 4  | 
 Sunday, April 04, 2010

Geçenlerde hatırlayacaksınız DeveloperMania'nın etkinliğinde "Silverlight 4 RC Yenilikleri / Değişiklikleri" adında bir oturum sunmuştum. İşte o oturumun video kaydını da sizlerle paylaşıyorum. Özellikle Beta ile RC arasında ne gibi değişiklikler olduğunu merak ediyorsanız kaçırmayın derim ;)

Yukarıdaki videoyu bilgisayarına indirmek isteyenler blogumun SeminerTV bölümünden faydalanabilirler.

İyi seyirler...

Sunday, April 04, 2010 10:45:00 AM (GTB Standard Time, UTC+02:00)  #    Comments [1]   Silverlight 4  | 
 Saturday, April 03, 2010

Geçen haftalarda Microsoft ofisinde iş ortakları için özel olarak düzenlenen bir seri seminerin son parçasını da sizlerle paylaşıyorum. Bu defa Expression Studio'da Design ve Blend, Sketchflow taraflarına değiniyoruz.

Yukarıdaki videoyu bilgisayarına indirmek isteyenler blogumun SeminerTV bölümünden faydalanabilirler.

İyi seyirler...

Saturday, April 03, 2010 10:40:48 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Expression Blend | Expression Design | Expression Studio | Silverlight 3.0 | WPF  | 
 Friday, April 02, 2010

Geçen haftalarda Microsoft ofisinde iş ortakları için özel olarak düzenlenen bir seri seminerin diğer bir parçasını daha sizlerle paylaşıyorum. Bu sefer .NET Framework 4 RC ve Visual Studio 2010 RC yeniliklerine göz atıyoruz.

Yukarıdaki videoyu bilgisayarına indirmek isteyenler blogumun SeminerTV bölümünden faydalanabilirler.

İyi seyirler...

Friday, April 02, 2010 11:02:19 AM (GTB Standard Time, UTC+02:00)  #    Comments [15]   .NET Framework 4.0 | Visual Studio 2010  | 
 Thursday, April 01, 2010

Geçen haftalarda Microsoft ofisinde iş ortakları için özel olarak düzenlenen bir seri seminerin bir parçası olarak sunduğum "Silverlight 4 Beta ve WPF 4 Beta yenilikleri" oturumunun video kaydını aşağıda bulabilirsiniz :) Evet sonunda tekrar seminer kayıtlarını alarak paylaşmaya başladım. ;) Videoyu izlerken yeniliklerin Beta sürecindekiler olduklarını unutmamakta fayda var. RC sürecindekileri çok yakında ayrı bir video ile paylaşacağım..

Yukarıdaki videoyu bilgisayarına indirmek isteyenler blogumun SeminerTV bölümünden faydalanabilirler.

İyi seyirler...

Thursday, April 01, 2010 3:50:50 PM (GTB Standard Time, UTC+02:00)  #    Comments [2]   Silverlight 4 | WPF  | 

Her sene 1 Nisan MVP'liğimin bittiği gün :) Şaka gibi değil mi? :) Biliyorsunuz MVP ünvanı her seferinde senelik olan Microsoft tarafından verilen bir ünvan bu nedenle bir bitiş tarihi var ve bu nedenle de her sene yenilenmesi gerekiyor :) Eh benimki bugün yenilendi. 2010 yılında da "Silverlight MVP"si olarak var olmaya devam edeceğim. Bu gaz ile önümüzdeki dönemde blogda ekstra hareketlilik göreceğinizden de emin olabilirsiniz :)

Hepinize bu dönemde gösterdiğiniz destek için ayrıca çok teşekkürler. Bilgiyi paylaşmak ancak paylaşabileceğiniz insanlar oldukça zevkli ve güzel. 2010'da da daha yapacak çok işimiz var ;) ve güzel sürprizlerim var ;)

Görüşmek üzere.

Thursday, April 01, 2010 6:58:01 AM (GTB Standard Time, UTC+02:00)  #    Comments [3]   Silverlight | Silverlight 2.0 | Silverlight 3.0 | Silverlight 4  | 
Copyright © 2010 Daron Yöndem. Tüm hakları saklıdır.