Ana Sayfa | English Blog | Soru Sorma Merkezi | Seminer TV | Fotoğraf Albümü | Dil Cookie Sil  Blog'u Mail ile takip et! | RSS 2.0 Atom 1.0 CDF 
Daron Yöndem
bir yazılımcının tasarıları...
 Tuesday, November 18, 2008

Silverlight ilk çıktığı günlerde en çok şaşırdığımız noktalar biri "Label" adında bir kontrolün bulunmamasıydı. İşlevsellik olarak aynı çözümü sunan TextBlock kontrolünü çok kısa bir sürede keşfetmiş olsak da neden isminin değiştiğini pek anlayalamıştık. Bugünlerde Silverlight Toolkit paketi ile beraber özel bir Label kontrolü geldi.

Nedir TextBlock ile Label'ın farkı?

Aslında kaba tanımı ile TextBlock kontrolü Label'ın yapı taşıdır. Bir Label kontrolü ControlTemplating desteklerken TextBlock desteklemez. Zaten Label Template'leri oluştururken biz de TextBlock'lardan faydalanacağız. Özetle Label'lar gelişmiş TextBlock kontrolleridir de diyebiliriz. Sözü daha çok uzatmadan gelin neler yapabildiğimize göz atalım.

Not: Silverlight Toolkit'i kullanabilmeniz için CodePlex üzerindeki adresten kütüphaneyi indirerek içerisindeki Microsoft.Windows.Controls.dll dosyasını projenize referans olarak eklemelisiniz.

Bir Label kontrolünü Silverlight Toolkit'in referans alınmış olduğu herhangi bir projede rahatlıkla kullanabilirsiniz. Expression Blend içerisinde "Asset Library" kısmında "Custom Controls" sekmesinde Label kontrolünü bulabilirsiniz. TextBlock'larda da oluğu gibi herhangi bir Label içerisine yazı yazmak için Content özelliğinden faydalanabilirsiniz.

[XAML]

<UserControl x:Class="SilverlightApplication2.Page"

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

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

  Width="400" Height="300" xmlns:controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls">

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

      <controls:Label HorizontalAlignment="Left" VerticalAlignment="Top" Content="Deneme Amaçlı Metin"/>

    </Grid>

</UserControl>

Basit bir şekilde Label kontrolünün kullanımına dair yukarıdaki XAML kodunu inceleyebilirsiniz. Bir TextBlock ile Label kontrolünü birbirinden ayıran özelliklerden ilki Label kontrolünün BorderBrush alabiliyor olması. Hatta sadece bu kadarla kalmayıp bir Label'ın hangi kenarlarında Border bulunacağına da karar verebiliyorsunuz.

Label kontrolünün BorderBrush ayarları.
Label kontrolünün BorderBrush ayarları.

Aynı şekilde isterseniz bir Label için Background da belirleyebilirsiniz. Fakat makalemizin başından beridir bahsettiğimiz Label'ın en önemli özelliği aslında ControlTemplating'e olanak tanıması. Gelin şimdi Expression Blend içerisinde Label kontrolümüze sağ tıklayarak gelen menüden "Edit Control Parts / Create Empty" komutunu verelim. Böylece hali hazırda sahnede olan Label'ın görselliği yok varsayılarak bizim Label kontrolünün yapısını tekrar tasarlayabilmemiz sağlanacak. Bunun için ilk aşamada karşınıza gelen pencerede bu şablona bir de isim vermeniz gerek. Unutmayın hazırlanan şablonlar sonrasında birden çok Label'a linklenerek merkezi bir yerden kullanılabilir.

Label kontrolü için yeni bir ControlTemplate yaratıyoruz.
Label kontrolü için yeni bir ControlTemplate yaratıyoruz.

ControlTemplate'imizi yarattıktan sonra Blend bizi otomatik olarak Template tasarımına götürecektir. Bu sahnede otomatik olarak gelen Grid nesnesini bir Canvas'a çevireceğiz. Bu seçimi tamamen örneğin kolay ilerlemesi için yapıyoruz. Siz kendi tasarımlarınızda farklı Layout kontrolleri tabi ki kullanabilirsiniz.

ControlTemplate tasarımımız bitmek üzere.
ControlTemplate tasarımımız bitmek üzere.

Tasarımımızda Canvas'ın içerisinde bir Rectangle koyarak Fill özelliğine de Radial bir GradientBrush atadık. Rectangle'ın önünde de bir TextBlock koyuyoruz. Label içerisinde metni gösterecek olan bu TextBlock kontrolü olacak. Label kontrolünün Content özelliğine verilen değerlerin otomatik olarak şablon içerisinde bu TextBlock'un Content'ine aktarılmasını sağlamalıyız. Bunu da ancak TemplateBinding ile yapabiliriz.

Blend arayüzünden TemplateBinding ayarlarımızı yapıyoruz.
Blend arayüzünden TemplateBinding ayarlarımızı yapıyoruz.

Blend'in arayüzünde şablonumuzu tasarlarken TextBlock kontrolümüzü seçtikten sonra ekranın sağında kalan "Properties" sekmesinden söz konusu TextBlock'un Content özelliğini ayarladığımız yerin hemen yanındaki ufak kareye tıklıyoruz. Gelen menüden "Template Binding" komutunu verdikten sonra Blend bize ana kontrolün hangi özelliğinin şablondaki bahsi geçen özelliğe bağlanacağını soruyor. Tabi biz de hemen Content özelliğini seçiyoruz. Böylece Label kontrolünün Content özelliğini şablonun içindeki TextBlock'un Content özelliğine bağlamış olduk.

Template tasarımı modundan çıkalım.
Template tasarımı modundan çıkalım.

Artık tasarımımızı tamamladığımızda göre şablon tasarım modundan çıkıp ana uygulamaya geri dönebiliriz. Artık Label kontrolünün Content'ini değiştirdiğinizde ayarladığınız görsellik içindeki Textblock'a yerleştiğini görebilirsiniz. En güzel de yeni bir Label eklediğinizde aynı şablonu kullanmasını sağlayabilirsiniz.

Hazırladığımız şablonu istediğimiz Label kontrolünde kullanabiliriz.
Hazırladığımız şablonu istediğimiz Label kontrolünde kullanabiliriz.

Uygulamanıza yeni bir Label ekledikten sonra hazırladığınız şablonu bu Label üzerinde de kullanmak istiyorsanız doğrudan söz konusu Label'a sağ tuş ile tıklayarak gelen menünden "Edit Control Parts / Apply Resource" diyerek şablonunuzu adı ile seçebilirsiniz. Böylece geri dönüp bu şablonda bir değişiklik yaptığınızda birden çok Label'da değişiklik yapmış olacaksınız. Merkezi yönetim :)

Yaptığımız tüm işlemlerin sonucunda aşağıdaki XAML kodu yaratılıyor.

[XAML]

<UserControl x:Class="SilverlightApplication2.Page"

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

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

  Width="400" Height="300" xmlns:controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls">

  <UserControl.Resources>

    <ControlTemplate x:Key="DenemeSablon" TargetType="controls:Label">

      <Canvas>

        <Rectangle Height="50" Width="200" Stroke="#FF000000">

          <Rectangle.Fill>

            <RadialGradientBrush>

              <GradientStop Color="#FF000000"/>

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

            </RadialGradientBrush>

          </Rectangle.Fill>

        </Rectangle>

        <TextBlock TextWrapping="Wrap" HorizontalAlignment="Stretch" Canvas.Top="17" Canvas.Left="45.348" Foreground="#FFFFFFFF" Text="{TemplateBinding Content}"/>

      </Canvas>

    </ControlTemplate>

  </UserControl.Resources>

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

      <controls:Label HorizontalAlignment="Left" VerticalAlignment="Top" BorderBrush="#FFFF0000" BorderThickness="10,0,5,0" Template="{StaticResource DenemeSablon}" Content="Tamamen Denemedir"/>

    </Grid>

</UserControl>

Yukarıdaki kodda özellikle önemli olan birkaç nokta var. İlk olarak nasıl olmuş da Label'ımız UserControl.Resources altındaki DenemeSablon adlı şablona bağlanmış? TemplateBinding'in kodu nasıl yazılmış? Tüm bunların cevaplarını kod içerisinde kalın yazılı bölümlerde bulabilirsiniz.

Label'a DataBinding nasıl yapılır?

Bir Label'e neden DataBind yapmak isteyelim? Sonuçta sadece Text göstermeyecek mi? Ve bu Text'in değişme şansı da yok ki TwoWayBinding vs gereksin? Tüm bu soruların cevabı aslında yukarıdaki ControlTemplating ile de alakalı. Bir Label düşünün ki kendisine Bind edilmiş nesneye göre şekil alabiliyor? Ne dersiniz?

Bir önceki örneğimizden devam edelim. Varsayalım ki Label'ımızda bir ürünün adını göstereceğiz fakat ürünün satış miktarına göre de Label'ın arkasında Gradient'ın (Aslında Rectangle) şeffaflaşmasını veya görünür olmasını istiyoruz. Bunun için ilk olarak gelin kontrolümüzün tasarımını biraz değiştirelim.

DataBind yapacağımız Label kontrolünün şablonunu biraz değiştirdik.
DataBind yapacağımız Label kontrolünün şablonunu biraz değiştirdik.

Sadece renklerde biraz değişiklik yaptık. Böylece arkadaki Rectangle tamamen şeffaf olsa da yazı görünebilecek. Şimdi geçelim kod tarafına ve bu Label'a nasıl veri bağlarız ona bakalım.

İlk olarak Label'a bağlayacağım Urun'ümüzün bir sınıf olarak programatik anlamda tanımlamamız gerekiyor.

[VB]

    Public Class Urun

 

        Private PAdi As String

        Public Property Adi() As String

            Get

                Return PAdi

            End Get

            Set(ByVal value As String)

                PAdi = value

            End Set

        End Property

 

        Private PSatis As Double

        Public Property Satis() As Double

            Get

                Return PSatis

            End Get

            Set(ByVal value As Double)

                PSatis = value

            End Set

        End Property

 

    End Class

[C#]

    public class Urun

    {

        public string Adi { get; set; }

        public double Satis { get; set; }

    }

Gördüğünüz üzere Urun sınıfımızın iki Property'si var. Bunlardan ilki ürünün ismini saklayacak olan Adi, diğeri ise Satis miktarı. Özellikle Satis Property'sinin Double olarak tanımlandığına dikkat edelim. Herhangi bir Convertor kullanmadan bu Property'si Bind edeceğimiz için Opacity ile uyumlu şekilde 1 ile 0 arasında Double değerler taşımalı.

[VB]

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

        Etiket.DataContext = New Urun() With {.Adi = "Bir ürün adı", .Satis = 0.5}

    End Sub

[C#]

    private void Page_Loaded(object sender, System.Windows.RoutedEventArgs e)

    {

        Etiket.DataContext = new Urun { Adi = "Bir ürün adı", Satis = 0.5 };

    }

Kodumuzda basit bir şekilde yeni bir ürün yaratarak Etiket adındaki Label kontrolümüze DataContext özelliği üzerinden bağlıyoruz. Peki Adi ve Satis Property'leri Label içerisinde neleri etkileyecek? İşte bunun için ayrıca XAML tarafında ayarlar yapmamız gerek.

Rectangle'ın Opacity'sinin DataBinding ayarlarını yapıyoruz.
Rectangle'ın Opacity'sinin DataBinding ayarlarını yapıyoruz.

Blend tarafında Label kontrolünün şablonuna tekrar geri dönüyoruz. Daha önce yarattığımız ControlTemplate'i açarak üzerinde değişiklikler yapmamız gerekiyor. İlk olarak şablon içerisinde Rectangle'ı seçerek Properties tabından Opacity'sinin yanında ufak kareye tıklıyoruz ve gelen menüden "Custom Expression" komutunu seçiyoruz. Böylece artık binding ile ilgili ayarı doğrudan el ile yazacağız.

DataBinding için Custom Expression yazıyoruz.
DataBinding için Custom Expression yazıyoruz.

Yazdığımız Custom Expression ile artık Label kendi içindeki Rectangle'ın Opacity değerinin kendisine verilen datadan geleceğini ve bağlanması gereken Property'nin adının da Satis olduğunu biliyoru. Aynı işlemi ControlTemplate içerisindeki TextBlock için de yaparak bu sefer TextBlock'un Content özelliğini Adi Property'sine {Binding Adi} Custom Expression'ı ile bağlamamız gerek.

Tüm bu işlemleri yaptıktan sonra uygulamayı çalıştırdığınızda bağladığınız verideki ürün adının TextBlock içerisine yerleştiğini ve gelen satış bilgisine göre de arkadaki Rectangle'ın şeffaflığının belirlendiğini görebilirsiniz. Böylece gelen veriye göre görselliğini değiştiren bir Label tasarlamış olduk.

Hepinize kolay gelsin.

Tuesday, November 18, 2008 5:57:33 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 2.0  | 
 Monday, November 17, 2008

WPF'den Silverlight dünyasına geçince eksiğini hissettiğimiz kontrollerin Silverlight Toolkit projesi ile sağlanmaya çalışıldığına dair daha önceki yazılarımda ufak ipuçları vermiştim. Bu sefer de yine Toolkit içerisinde ViewBox kontrolünü inceleyeceğiz. ViewBox hali hazırda WPF içerisinde bulunan bir Layout kontrolü. Silverlight tarafında ise herhangi bir muadilinin olmaması bazı durumlarda ciddi sıkıntı yaratabiliyor.

Peki nedir ViewBox?

İster WPF ister Silverlight tarafında olun sahnenin planını Layout kontrolleri dediğimiz kontroller ile düzenlemek durumundasınız. Bu kontrollerin her birinin birbirinden farklı özellikleri var. Tüm bu özellikleri göz önünde aldığımızda ViewBox'ın eşsiz olduğu nokta içerisindeki tüm nesneleri vektörel olarak görsel anlamda tekrar boyutlandırabiliyor olması. Birkaç görsel örnek ile konuyu netleştirelim.

Not: Silverlight Toolkit'i kullanabilmeniz için CodePlex üzerindeki adresten kütüphaneyi indirerek içerisindeki Microsoft.Windows.Controls.dll dosyasını projenize referans olarak eklemelisiniz.

Grid içerisinde 5 farklı Ellipse'in değişen durumları.
Grid içerisinde 5 farklı Ellipse'in değişen durumları.

Yukarıdaki gibi bir Grid içerisinde bulunan nesneler Grid'in kenarlarından olan uzaklarına ve farklı hizalama bilgilerine göre konumlandırılırlar. Bu nedenle Grid'in boyutu değiştiğinde nesnelerin kenarlara olan uzaklıklarını sabit tutabilmek adına nesneler garip şekillerde boyutlandırılır. Oysa biz bu Grid'in boyutlandırırken içindeki görselliği doğrudan aynı şekilde büyütmesini istiyorduk hem de vektörel olarak. Maalesef Silverlight 2.0 ile beraber hali hazırda gelen ve bu işlevselliği sağlayacak hiçbir Layout kontrolü yok! Tabi bu durum "Böyle bir Layout kontrolü yazılamaz" anlamına gelmiyor :) Nitekim yazmışlar ve Silverlight Toolkit içerisinden de biz ViewBox kontrolünü alıp kullanabileceğiz.

ViewBox kontrolümüzü kullanalım.

Silverlight Toolkit'i projenize referans olarak aldıktan sonra Expression Blend içerisinde doğrudan "Asset Library"'de "Custom Controls" tabında "ViewBox" kontrolünü bulabilirsiniz. Bir önceki bölümdeki görsel örneğimizde kullandığımız Grid'i gelin bir ViewBox içerisine yerleştirelim.

[XAML]

<UserControl x:Class="SilverlightApplication1.Page"

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

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

  Width="400" Height="300" xmlns:controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls">

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

        <controls:Viewbox Margin="24,24,176,108">

          <Grid Height="Auto" Width="Auto">

            <Ellipse Margin="8,8,8,8" Fill="#FFFF0000" Stroke="#FF000000"/>

            <Ellipse Height="16" HorizontalAlignment="Left" Margin="56,40,0,0" VerticalAlignment="Top" Width="32" Fill="#FFFFFFFF" Stroke="#FF000000"/>

            <Ellipse Height="16" HorizontalAlignment="Right" Margin="0,40,48,0" VerticalAlignment="Top" Width="32" Fill="#FFFFFFFF" Stroke="#FF000000"/>

            <Ellipse Margin="88,80,88,80" Fill="#FFFFFFFF" Stroke="#FF000000" Width="20" Height="20"/>

            <Ellipse Height="40" Margin="56,0,48,24" VerticalAlignment="Bottom" Fill="#FFFFFFFF" Stroke="#FF000000"/>

          </Grid>

        </controls:Viewbox>

    </Grid>

</UserControl>

Yukarıdaki kod içerisinde de görebildiğiniz üzere elimizdeki Grid'i doğrudan alıp bir ViewBox içerisinde yerleştirdik. Böylece artık ViewBox'ı tekrar boyutlandırdığımızda içerisinde tüm görseller vektörel olarak bir bütün şeklinde kabul edilecek ve o şekilde tekrar boyutlandırılacak.

ViewBox güzelliği.
ViewBox güzelliği.

Gördüğünüz gibi görselde hiçbir değişiklik yok. Elimizdeki çizim vektörel olduğu için büyüdüğünde de herhangi bir görsel bozulma olmuyor. Tabi ViewBox'ı her durumda kullanmak da doğru olmayacaktır. Örneğin Silverlight ekranınızda bir Button varsa (veya herhangi bir kontrol) ve bu kontrolün dinamik olarak boyutlandırılmasını istiyorsanız ViewBox yerine Grid'i tercih etmelisiniz. Çünkü Grid Button'un Height ve Width gibi özellikleri üzerinden Button'a boyut verirken ViewBox doğrudan Button'un görselliği üzerinden vektörel olarak büyütecektir.

ViewBox ve Grid farkı.
ViewBox ve Grid farkı.

ViewBox özellikleri...

Bir ViewBox kontrolü içerisinde görsellerin nasıl boyutlandırılacağı ile ilgili verebileceğimiz kararlar var. Bunlardan ilki Strech özelliği. Gelin Strech özelliğine verebileceğimiz değerler arasındaki farklara bir örnek ile bakalım.

ViewBox'ın Strech özellikleri arasındaki farklar.
ViewBox'ın Strech özellikleri arasındaki farklar.

Farklar sanırım görselde açık bir şekilde belli oluyor. None değerini verdiğimiz Strech özelliği ViewBox içerisindeki görsellerin boyutlandırılmamasını sağlıyor. Uniform değeri en/boy oranını koruyarak ViewBox'ın içerisinde tam sığacak şekilde görseli büyütürken UniformToFill ise yine en/boy oranını korusa da bu sefer ya eni ya da boyu her şekilde ViewBox'ın içine en büyük değeri ile yerleştiriyor. Strech özelliğine doğrudan Fill değerini verirseniz bu sefer görselin en/boy oranı korunmadan tamamen ViewBox'ın içerisine yayılıyor.

Ayrıca isterseniz ViewBox'ın VerticalAlignment ve HorizontalAlignment özellikleri ile de UniForm modunda ViewBox içerisindeki görselin nasıl hizalanacağına karar verebilirsiniz.

StretchDirection özelliği.

Şu ana kadar ViewBox içerisinde görsellerin sürekli büyüdüğünü gördük fakat isterseniz ViewBox'ın boyutunu ufaltarak aynı şekilde elinizdeki görseli küçültebilirsiniz de. Bazı durumlarda ise ViewBox içerisindeki görselin sadece gerektiğinde büyütülmesini veya sadece küçültülmesini isteyebilirsiniz. Bu gibi durumlarda gerekli sınırlamaları yapmak için doğrudan StretchDirection özelliğini kullanabilirsiniz.

Eğer StretchDirection değeri UpOnly olursa ViewBox içerisindeki görsel gerektiğinde sadece büyütülecektir. ViewBox kendi içindeki görselden daha fazla ufaltılırsa içindeki görseli kesinlikle ufaltmayacaktır. Aynı şekilde DownOnly özelliği de ViewBox'ın kendi içerisindeki görseli gerektiğinde sadece ufaltmasını sağlayacaktır. StretchDirection özelliğinin varsayılan değeri Both olarak geldiği için normal şartlarda hem ufaltma hem de büyütme yapar.

Hepinize kolay gelsin.

Monday, November 17, 2008 4:30:02 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 2.0  | 
 Sunday, November 16, 2008

Dünkü oyun günündeki katılımcılar bilirler :) Beni de Silverlight 2.0 ile Oyun Programlama alanında ekstra bir heyecan sarmıştık. Tabi bu heyecanı soğutmadan hızlı bir şekilde koda dökmek gerek. O nedenle seminerde yaptığımız oyun üzerinden kabaca devam ederek bazı özellikler ekledim. Artık adam akıllı oynanabilir bir oyun oldu :) Aşağıda beğenilerinize sunuyorum.

Get Microsoft Silverlight

Oyunun tüm kaynak kodlarını da aşağıdan indirebilirsiniz.

Silverlight 2.0 Oyun Kaynak Kodları - 16112008_1.rar (2,58 MB)

Hepinize kolay gelsin.

Sunday, November 16, 2008 4:41:54 PM (GTB Standard Time, UTC+02:00)  #    Comments [21]   Silverlight 2.0  | 
 Saturday, November 15, 2008

Bugün Microsoft İstanbul ofisinde Oyun Turu'nun ilk ayağını gerçekleştirdik. Güne "Oyun Sektörü" ile ilgili genel bir oturumun sonrasında Silverlight 2.0 ile Oyun Programlama konusu ile giriş yaptık. Oyunumuzu yazarken yarattığımız buglar nedeniyle epey eğlenceli anlar yaşadığımızı itiraf etmeliyim. Öğle arasından sonra ise XNA konusunda uzman konuşmacımız Engin Yıldız ve süpriz konuşmacımız :) sevgili Cem Demir sahne aldı. Neden mi sürpriz? eh sürpriz :)

Microsoft Oyun Turu, İstanbul
Microsoft Oyun Turu, İstanbul

Kaçıranlar üzülmesin, Silverlight 2.0 ile Oyun Programlama kısmını doğrudan benim SeminerTV'ye koyacağım :) Diğer yandan çok yakında oyun programlama konusunda yazılarla beraber bir de kaynak kodları ile hazırladığım bir oyunu paylaşmayı düşünüyorum. Hatta bu oyun seminerde yazdığımız oyunun biraz daha rötuşlanmış hali de olabilir :) Yakında başka illerde de Oyun Turu'na devam edeceğiz.

Hepinize kolay gelsin.

Saturday, November 15, 2008 1:03:42 AM (GTB Standard Time, UTC+02:00)  #    Comments [4]   Silverlight 2.0  | 
 Friday, November 14, 2008

Bugün Bursa, Uludağ Üniversitesi'ndeydim. Silverlight 2.0 ve WPF konularını inceledik. Gelen sorular gerçekten muhteşemdi, özellikle Bursa'daki kurumsal katılıma teşekkür etmem gerek. Yeniliklere bu kadar heyecanla yaklaşmaları ve hafta içi iş günlerinde ofislerini bırakıp beni dinlemeye gelmelerini emin olun hayranlıkla karşıladım. Öğrenci kardeşlerimiz de tabi ki ayrı heyecanlıydı, seminerin yarattığı etkinin olabildiğince uzun süre hayatta kalmasını diliyorum :)

Bursa, Uludağ Üniversitesi, Silverlight ve WPF Semineri
Bursa, Uludağ Üniversitesi, Silverlight ve WPF Semineri

Aktivitenin organizasyonu için sevgili Muhammed Medeni Baykal'a teşekkürlerimi iletiyorum. Ayrıca Muhammed'e yardım ettiğini de bildiğim birçok öğrenci dostuma buradan sevgiler ve teşekkürler :) Hepiniz muhteşemdiniz.

Friday, November 14, 2008 12:49:27 AM (GTB Standard Time, UTC+02:00)  #    Comments [2]   Silverlight 2.0 | WPF  | 
 Thursday, November 13, 2008

Mart ayında sizleri Silverlight T-Shirt'üm ve sonrasında da Tish-O ile tanıştırmıştım. Böylece sizler de isterseniz SilverMan T-Shirt'ünden sipariş verebilecektiniz :) Eh birileri siparişleri vermiş :) FaceBook'taki Fan Club'ımın da kurucuları olan Ahmet Enes Dabanlıoğlu ve Fatih Gençaslan heyecanları ile gerçekten beni etkilediler. Arkadaşlar bu heyecanı satır satır kodlara dökmeniz dileği ile ;)

The Silver Team :)
The Silver Team :)

Thursday, November 13, 2008 12:30:41 AM (GTB Standard Time, UTC+02:00)  #    Comments [5]   Silverlight | Silverlight 2.0  | 
 Wednesday, November 12, 2008

Layout kontrolleri XAML ile arayüzler oluştururken "olmazsa olmazlar" listemizin en başında geliyor. Silverlight 1.0'daki Canvas kontrolünden sonra 2.0'da birçok kontrol yardımımıza yetişse de maalesef WPF'deki zenginliğe ulaşamamıştı. Bu eksikliği Silverlight Toolkit karşılıyor ve paket içerisindeki WrapPanel aynı WPF içerisindeki işlevsellikleri Silverlight için de sağlıyor.

Silverlight Toolkit DLL'lerinden Microsoft.Windows.Controls.DLL dosyasını Silverlight 2 projenize referans olarak ekledikten sonra WrapPanel kontrolünü Blend 2 içerisinde Asset Library'de "Custom Controls" tabında bulabilirsiniz.

Expression Blend 2 içerisinde Silverlight Toolkit'ten WrapPanel.
Expression Blend 2 içerisinde Silverlight Toolkit'ten WrapPanel.

Bu noktadan sonra Blend içerisinde doğrudan bir WrapPanel'i sahneye yerleştirebilirsiniz. Peki nedir WrapPanel? WrapPanel içerisindeki kontrolleri bir sepete atırılmış gibi sürekli toplayarak kendi içine sığdırmaya çalışan bir kontroldür. Gelin örnekler ile tam olarak nasıl çalıştığına göz atalım.

WrapPanel içerisinde birden çok nesne.
WrapPanel içerisinde birden çok nesne.

Yukarıdaki görselde sahnede bir WrapPanel yer alıyor. Söz konusu WrapPanel içinde toplam 6 tane Button var. Bu Button'ların konumları ile ilgili hiçbir ayar yapmadık. Düğmeleri WrapPanel içerisinde attıkça WrapPanel kendisi ilk başta düğmeleri yan yana koymaya başladı sonra yer kalmayınca alt satıra attı ve alt satıra düğmeler dizmeye başladı. İşte WrapPanel'in mantığı da budur. İçerisinde bulunan nesneleri sırası ile toparlayarak konumlandırır.

[XAML]

<UserControl x:Class="SilverlightApplication23.Page"

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

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

  Width="400" Height="300" xmlns:controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls">

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

 

      <controls:WrapPanel Margin="39,35,141,93">

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

      </controls:WrapPanel>

 

    </Grid>

</UserControl>

Örneğimizin XAML kodunu da yukarıda bulabilirsiniz. Gördüğünüz gibi WrapPanel içerisindeki düğmelerin hiçbirinin konumlandırma bilgisi yok. Düğmelerin içerisinde yazılacak yazılar dışında hiçbir özellikleri set edilmiş değil.

WrapPanel'in Orientation özelliği Vertical yapılınca...
WrapPanel'in Orientation özelliği Vertical yapılınca...

İsterseniz bir WrapPanel'in içerisindeki nesnelerin ekranın üstüne doğru değil de soluna doğru da toparlanmalarını sağlayabilirsiniz. Bunun için WrapPanel'in Orientation özelliğini Vertical olarak ayarlamanız yeterli olacaktır. Böylece sıralama işlemi dikey olarak yapılacak ve dikey boy doldurulduğunda yeni bir kolon yaratılarak hizalama devam edecektir.

[XAML]

    <controls:WrapPanel Margin="39,35,141,142" Orientation="Vertical">

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

      </controls:WrapPanel>

WrapPanel içerisinde nesnelerin hizalama ayarlarına dikkat!

WrapPanel içerisindeki nesnelerin her biri kendi satır ve sütunları içerisinde hizalandırılabilirler. Stretch modunda olan nesnelerin oluşan bir kolon veya sütun içerisinde tüm nesnelerin en geniş veya en yüksek olan nesneye uyum sağlayacaktır. Bu nedenle eğer bir satır veya sütun içerisinde nesnelerin orijinal büyüklüklerinde kalmalarını istiyorsanız hizalamalarını kesinlikle tek tek ayarlamalısınız.

Farklı hizalamalara sahip nesneler!
Farklı hizalamalara sahip nesneler!

Yukarıdaki görselde ikinci düğmenin dikey hizalamalası değiştirilerek kendi özgün boyutunda gösterilmesi sağlanmıştır. Söz konusu düğmenin bulunduğu satırın yüksekliğini arttıran isen birinci düğmedir.

[XAML]

      <controls:WrapPanel Margin="39,35,141,142" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top">

        <Button Content="Button" Width="134" Height="50" HorizontalAlignment="Left" VerticalAlignment="Top"/>

        <Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

        <Button Content="Button"/>

      </controls:WrapPanel>

Nerelerde kullanılabilir?

WrapPanel'in belki de en sık kullanıldığı basit yerlerden biri harici kontrollerdeki diğer Layout kontrollerinin yerini alarak farklı görsellikler sağlama noktasıdır. Örneğin normal şartlarda içerisindeki öğelerin dikey veya yatay olarak tek bir satır veya sütunda gösterilebileceği bir ListBox kontrolünün Layout kontrolünü değiştirerek ListBox içerisinde tüm nesnelerin ekrana sığacak şekilde bir WrapPanel içerisinde toplanmasını sağlayabilirsiniz.

Standart bir ListBox.
Standart bir ListBox.

Yukarıda gördüğünüz standart ListBox içerisinde öğeler dikey olarak sıralanmış durumda. Oysa bu öğelerin uzunlukları kısa ve belki de "Deneme 1" ile "Deneme 2" yan yana konabilirdi. Böylece çok daha fazla öğe aynı anda ekranda gösterilirken kullanıcının çok daha hızlı şekilde aradığı şeye ulaşması sağlanabilirdi. Bu detayların haricinde görsel olarak da daha güzelbir sonuç alabiliriz.

Bu durumda bizim yapmamız gereken  yukarıda hazırladığımız standart ListBox'ın Layout kontrolünü değiştirmek. Bunun için Expression Blend içerisinde kontrolü seçerek sağ tuş tıklayıp aşağıdaki görselde görebileceğiniz menüye doğru hızlı bir yolculuk yapıyoruz.

ListBox'ın Layout kontrolünü değiştireceğiz.
ListBox'ın Layout kontrolünü değiştireceğiz.

ListBox'ın içerisinde normal şartlarda bir Grid Layout kontrolü bulunuyor. Bu kontrolü silerek yerine bir WrapPanel koymamız gerekecek.

Grid yerine WrapPanel karşınızda.
Grid yerine WrapPanel karşınızda.

WrapPanel'i koyduktan sonra WrapPanel'in genişliğini de ListBox'ınızın genişliğine eşitlemeyi unutmayın. Bunu dinamik arayüzlerde LayoutUpdated eventlarında yapabilir veya XAML tarafında bir Binding ile çözebilirsiniz.

ListBox içerisinde WrapPanel.
ListBox içerisinde WrapPanel.

Yukarıdaki görselde WrapPanel ile ListBox'ın iş ortaklığının sonucunu görebilirsiniz. ListBox içerisinde nesneler mümkün oldukça yan yana alınarak yukarıya doğru toplanmışlar. Bizim örneğimizde nesne sayısı artık az geldiği için ListBox'ın scroll barları da gözükmüyor.

Hepinize kolay gelsin.

Wednesday, November 12, 2008 11:10:33 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 2.0  | 
 Tuesday, November 11, 2008

Hem WPF hem Silverlight maalesef ki "yazılımcılar tarafından tasarlanan uygulamalar" havuzuna çok daha garip :) balıkların atılmasını sağladı. Bu süreçte sadece tasarımcıların WPF veya Silverlight tarafına geçememesi sorunu değil, ek olarak şirketlerin yazılım arayüzü tasarımına kaynak ayırmakta sıkıntılarının da büyük katkısı var. Tüm bunları düşündüğümüzde yazılımcıların en azından kolay yolda hazırladıkları arayüzlere makyaj yapabilmeleri için yeni araçların oluşması, hazır şablonların yaratılması çok önemli.

Geçenlerde size Silverlight Toolkit ile beraber gelen tasarım şablonlarından bahsetmiştim. Bu sefer de aynı senaryoyu WPF tarafına taşıyalım ve CodePlex üzerindeki WPF Themes projesi ile tanışalım.

Rudi Grobler tarafından hazırlanan projenin ilk çıkış noktasına aslında Silverlight Toolkit ile beraber gelen şablonlar olmuş. Bu şablonları WPF tarafına taşımaya karar veren Rudi sonrasında farklı şablonlar da oluşturarak şu an toplam 12 farklı şablonun bulunduğu kütüphaneyi oluşturmuş. Hepsine buradan ulaşabilirsiniz.

Nasıl kullanırız?

Bahsettiğimiz tüm görsel şablonlar esasen Silverlight üzerinden hazırlananlardan çevrildikleri için işin kolayına kaçıp :) VisualStateManager kullanmaya devam etmişler. Malum VisualStateManager ilk önce Silverlight 2.0 ile geldi ve hala WPF'de yok. WPF'de VisualStateManager yapısını kullanabilmek için yine CodePlex üzerinden WPF Toolkit'i indirmeniz gerekiyor.

WPF Toolkit'i indirirken kaynak kodları ile beraber indirin. Aksi halde bir yükleme dosyası ile sisteminizde GAC'ye tüm toolkit'i yüklemek zorunda kalırsınız ve bu ileride nahoş durumlara yol açabilir. En iyisi kaynak kodları indirip Assembly'leri elle Compile edip istediğiniz yerde kendi kararınız ile kullanmak. WPF Toolkit'i bilgisayarınıza indirdikten sonra Visual Studio ile kaynak kodlarına ait projeyi açın. Projeyi Build edin ve ortaya çıkan DLL'lerden WPFToolkit.dll adındaki dosyayı istediğiniz bir WPF projenize referans olarak ekleyin.

Artık Toolkit içerisinden VisualStateManager yapısını kullanabileceğimize göre sıra geldi WPF Themes ile gelen temaları denemeye. WPF Themes projesini bilgisayarınıza indirdikten sonra paket içerisindeki WPF.Themes klasöründe farklı temalara ait ayrı ayrı klasörler göreceksiniz. Her bir klasörün içerisinde Theme.xaml adında bir dosya bulunur. Tek yapmanız gereken bu dosyayı WPF projesine "Add Existing Item" diyerek eklemek. Otomatik olarak projenizdeki tüm kontroller bir anda eklediğiniz temadan etkilenecektir.

WPF Themes paketinden benim favorim : DavesGlossyControls :)
WPF Themes paketinden benim favorim : DavesGlossyControls :)

Hepinize kolay gelsin.

Tuesday, November 11, 2008 12:46:53 AM (GTB Standard Time, UTC+02:00)  #    Comments [3]   WPF  | 
 Monday, November 10, 2008

14 Kasım'da Bursa, Uludağ Üniversitesi'nde Silverlight ve WPF anlatıyor olacağım. Aktivite tamamen halka açık ve ücretsiz. Kayıt için aşağıdaki adreste takip edebilirsiniz;

http://tinyurl.com/yazilim-atolyesi

Etkinliğimiz Uludağ Üniversitesi Mühendislik - Mimarlık Fakültesi 2. Kat / Ahmet Rasim Büyüktür Salonu Görükle Kampüsü'nde olacak ve sabah 11.00'da başlayarak 17.00'da sonlanacak.

Bursa civarından herkesi bekliyorum ;)

Monday, November 10, 2008 12:36:23 PM (GTB Standard Time, UTC+02:00)  #    Comments [4]   Seminer | Silverlight 2.0 | WPF  | 
 Sunday, November 09, 2008

Yıldız Teknik Üniversitesi Bilişim Kulübü, bu yıl 8.'sini düzenleyeceği Bilişim Günleri Etkinliği'ni 12-14 Kasım 2008 tarihleri arasında Yıldız Teknik Üniversitesi Merkez Kampüsü Oditoryum Salonunda gerçekleştirilecek. Katılım halka açık ve tamamen ücretsiz.

Etkinlik içerisinde ben de 12 Kasım günü saat 14.15-17.15 arasında Silverlight 2.0 ve 17.30-18.30 arasında da WPF'ten bahsedeceğim. Etklinliğin tam programına Bilişim Kulübü web sitesinden ulaşabilirsiniz.

Sunday, November 09, 2008 12:29:11 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 2.0 | WPF  | 
 Saturday, November 08, 2008

Bugün Afyon Kocatepe Üniversitesi'ndeydim. Sabahtan başlayarak Silverlight 2.0, WPF, LINQ ve ASP.NET Dynamic Data konularına değinerek zevkli bir gün geçirdik. Günün sonunda tadına vardığım Afyon kaymağı ve ekmek kadayıfı süper ikilisi aslında neredeyse oturumları uzatarak Afyon'a yerleşmeme bile sebep olacaktı :)

Kocatepe Üniversitesi 2. Bilişim Günleri oturumlarımın sonundan bir kare.
Kocatepe Üniversitesi 2. Bilişim Günleri oturumlarımın sonundan bir kare.

Aktivite boyunca yardımlarından dolayı teşekkür etmem gereken o kadar çok kişi var ki kesinlikle atladığım kardeşlerim olacaktır. İster üniversite dahilinde öğretim görevlisi olsun ister öğrenci olsun aktivitede emeği geçen herkese ve tabi ki tüm katılımcılara çok teşekkürler. Muhteşem bir aktiviteydi. Organizasyondaki katkılarından dolayı sevgili Sadık Oral'a özellikle teşekkür ediyorum.

Herkese çok teşekkürler.
Rektör Yardımcısı Prof. Dr. Belkıs Özkara - Daron Yöndem

Saturday, November 08, 2008 1:26:58 PM (GTB Standard Time, UTC+02:00)  #    Comments [5]   ASP.NET 3.5 | LINQ | Silverlight 2.0 | WPF  | 
 Friday, November 07, 2008

Renklerin birbirine uyumu özellikle biz yazılımcılar için pek anlaşılamayan bir sistemi tanımlar :) Kişisel olarak ben bir renk yığınındaki renklerin birbirine uyumlu olup olmadığını anlayabilsem de "Buyur uyumlu 3 renk seç" derseniz pek de başarılı olamam. Belli ki bu durum genel geçer bir sorunu tanımlıyor ki RD, Jonas Folloseo birazdan sizlere detaylarından bahsedeceğim uygulamayı hazırlamış. Uygulama özünde Adobe'nin Kuler sitesinin API'larını kullanıyor. Kuler'dan hızlı bir şekilde bahsetmek gerekirse tasarımcıların birbirleri ile uyumlu renk şemalarını paylaştıkları bir Web 2.0 portalı diyebiliriz.

Colorful Expression

Aşağıdaki adresten indirebileceğiniz uygulama toplam 3 bölümden oluşuyor.

http://www.codeplex.com/colorful

Birincisi Colorful WPF adında tek başına çalışabilen bir WPF uygulaması. Bu uygulama içerisinde birbirleri ile uyumlu renk şemalarını inceleyebilir ve aramalar yapabilirsiniz. Unutmayın ki sistem Kuler'ın API'larından faydalanıyor yani programı ancak online durumdayken kullanabilirsiniz. Colorful WPF'in en güzel özelliği herhangi bir renk şemasının altındaki düğmeler aracılığı ile hızlı bir şekilde bu renkleri kullanabilmenizi sağlayacak XAML Brush kodlarını alabiliyor olmamız.

Colorful WPF içerisinde birbiri ile uyumlu renklerin bir listesi.
Colorful WPF içerisinde "silver" kelimesi aratıldığında çıkan birbiri ile uyumlu renklerin bir listesi.

Yukarıdaki ekran görüntüsünde yer alan en üstteki "Silver" adındaki renk şemasının altındaki "Swatches" düğmesine tıkladığımda doğrudan aşağıdaki XAML kodu panoya kopyalanıyor ve rahatlıkla Silverlight veya WPF projelerinde kullanabiliyoruz.

<SolidColorBrush x:Key="SilverColor1" Color="#FF474143" />

<SolidColorBrush x:Key="SilverColor2" Color="#FFA69E9D" />

<SolidColorBrush x:Key="SilverColor3" Color="#FFE7E2DA" />

<SolidColorBrush x:Key="SilverColor4" Color="#FFFFFFFF" />

<SolidColorBrush x:Key="SilverColor5" Color="#FFE7E8E7" />

Expression Design ve Blend Add-In

Colorful Expression içerisindeki renk şablonlarını isterseniz doğrudan Expression Design veya Blend içerisinde de kullanabiliyorsunuz. Bunun için download paketi içerisinden program adına uygun klasörün içindeki 2 DLL dosyasını programların bilgisayarlarınızda yüklü oldukları konumlara kopyalamanız gerek. Sonrasında aşağıdaki şekilde hem Blend hem de Design'ı çalıştırdığınızda Colurfull Expression'ı doğrudan Blend veya Design içerisinde de kullanabilirsiniz.

Blend.exe –addin:Colorful.Blend.AddIn.dll
Design.exe –addin:Colorful.Design.AddIn.dll

Expression Design içerisinde Colorful paneli.
Expression Design içerisinde Colorful paneli.

Yukarıdaki ekran görüntüsünde Colurful Expression'ın doğrudan Expression Design içerisinde kullanılabildiğini görebiliyorsunuz. Aynı şekilde Blend 2 içerisinde de rahatlıkla Colurful paneline ulaşılabiliyor.