Makale Özeti

Bu makalemizde geliştiricilerin WPF 'i tercih etme nedenlerinden 10 - 9 ve 8 puan alan özelliklerini incelemeye başlayacağız. Bu yazılarımızı incelerken en yüksek puandan en alt puan alan özelliğe doğru incelenmiştir.

Makale

Win – 32 ile karşımıza çıkan UI grafikleri ve bu yapı kullanılarak oluşturulmuş olan Windows XP yaklaşık 20 yıldır benzerdir. Bu benzerlikler sonucunda bizlere sürekli olarak grafik konusunda birbirlerinde farkı olmayan programlar ve işletim sistemleri sunulmaktaydı. Programların grafiklerinde herhangi bir gelişme gözlenmezken işlemci ve grafik kartı üreticileri sınırları zorlayan ürünler üretmeye başlamışlardı. Bunların başında çift çekirdekli işlemciler ve çift grafik işlemcisi (GPU) kullanan ekran kartları gelmektedir. Tabii bu gelişimler esnasında işletim sistemleri ve geliştiriciler tarafında oluşturulmuş yazılımların bunları kullanmaması çok mantıksız bir düşünce gibi olurdu.

Yukarıda bahsettiğimiz gelişmeler sonucunda Microsoft yeni çıkaracağı (Bir yılını doldurmuş olan işletim sistemi) Windows Vista ‘da grafik işlemlerinin daha önceki sürümlerden farklı olarak ilk olarak grafik kartına yükleneceği açıklanmıştı. Bu durum Windows işletim sistemleri için bir devrim niteliğindeydi. Bu sayede formlar, butonlar ve diğer bütün kontroller grafik işlemleri kullanıyorlarsa grafik kartına ve işletim sisteminde dahil olarak gelen PresentationFontCache.dll ‘ine yüklenecekti. Bu işlem grafik işlemlerinin gerçekleşmesi anında CPU ‘u çok büyük bir yükten kurtarmış olacaktır.

İşletim sistemi konusunda bu gelişimler yaşanırken geliştiriciler için nelerin yapılacağı merak konusuydu. Çünkü bizler grafik konusunda yapacağımız işlemler için CPU ‘u kullanmak zorundaydık. Bu da yapacağımız uygulamalarda performans düşüklüğüne sebep olmaktaydı. Bu durumdan kurtulmakta yeni Framework ‘ün içeriğinin açıklanması ile olmuştu. Artık Avalon kod adında yeni bir yapımız olacak ve bu yapı sayesinde bizlerde grafik işlemlerimizde grafik kartını kullanabilecektik. 2007 yılının başlarında .net Framework 3,0 çıkmış ve AVALON kod adlı yapımız Windows Presentation Foundation adını almıştı. Daha sonra ise 2007 yılının sonlarında Visual Studio 2008 ile .net Framework 3,5 yapısı da bitirilmişti. Artık WPF ‘i rahatlıkla kullanabilmemiz mümkündü.

WPF ‘in temel yapısı ve yapabilecekleri ile ilgili daha önceki makalelerimizde ayrıntılı bir biçimde bahsetmeye çalışmıştık. Bu sefer ise yukarıdaki bilgiler ışığında geliştiricilerin neden WPF ile uygulama geliştirmesi gerektiğini açıklayabilmeye çalışacağız. Bu açıklamayı yaparken ise en değerli 10 özelliğini incelerken Win32 ile neler yapabileceğine de öğrenmiş olacağız.

10 Puan - İleri Düzey Grafikler

Yıllarca alışık olduğumuz grafiklerden yukarıdaki paragraflarda bahsetmeye çalışmıştık. Bu grafik işlemleri oluşturulurken drawing isim alanı (namespace) kullanılmaktaydı. Bu kullanım için ise bütün metotlarının ayrıntılı bir biçimde bilinmesi gerekiyordu. Ayrıca bu isim alanını bilmemiz sadece 2D işlemlerimizi yapabilmemizi olanak tanıyacaktır. Farklı ve daha çok boyutta grafik kullanmak istediğimizde ise daha birçok API ve isim alanı öğrenmek zorunda kalıyorduk. Bu durumun ortadan kaldırılması amacıyla GDI+ içeriğinde birçok yenilik getirilmiştir. Bu yeniliklerin en önemlisi ise daha önceden bizlerin uzun işlemler ile oluşturmuş olduğumuz grafik fonksiyonlarının içeriğine eklenmiş olmasıydı.

GDI+ ‘ta ilk olarak 2D fonksiyonlar eklenmişti. Çünkü bu grafik fonksiyonları daha önceki sürümlerde oldukça fazla kullanılmıştı. Bazı geliştiriciler raporlamalar için hazırlanmış olan 3. Parti yazılımların yerine bile GDI+ ile hazırladıkları grafikleri kullanmaktaydılar. Ayrıca WPF içinde sadece grafik çizimleri değil form kontrollerinin özelleştirilmesi gibi özellikler kullanılacaktı. Açıkladığımız bu sebeplerden ötürüdür ki WPF için geliştirilen GDI+ ta ilk öncelik 2D işlemlerine verilmiştir.

GDI+ içerisinde Bezier eğrileri, karmaşık daireler, yazılar ve daha birçok çizim işlemi bulunmaktadır. Yazı işlemleri için ise vektörsel çizimlerde olduğu gibi anti – aliasing özelliği de eklenmiştir. Bu özellik sayesinde yakınlaştırılan olan yazılarda ve çizilen grafiklerin kenarlarında oluşmakta olan kırılmalar ortadan kalkacak ve pürüzsüz bir görünüme sahip grafikler oluşacaktır. Bu pürüzsüzleştirme işlemini daha önceleri yapmak oldukça zahmet bir işti ve yapılan işlemler bizlere uzun zamanlar kaybettirmekteydi. Artık grafik işlemlerini kolaylık ile yapabilecektik.

GDI+ ve XAML ile WPF ‘de eskiden yapmak istediğimizde oldukça karışık olan fakat yeni yapımız ile oldukça kolay yapabileceğimiz bir uygulamanın örneğine göz atalım.

XAML
<DrawingBrush Viewbox="0,0,1,1" ViewboxUnits="Absolute" Viewport="0,0,0.07,0.2" TileMode="Tile">
   <DrawingBrush.Drawing>
       <GeometryDrawing Brush="LightGreen"> <!--ikinci ekran görüntüsünde yararlanılacaktır.--!>
          <GeometryDrawing.Geometry>
             <RectangleGeometry Rect="0,0,1,0.6" />
          </GeometryDrawing.Geometry>
       </GeometryDrawing>
    </DrawingBrush.Drawing>
</DrawingBrush>

Yapmış olduğumuz bu uygulama sonucunda karşımıza çıkan örnek ise aşağıdaki gibidir.



Bu örneğimizde, şeffaflık eklenmiş yazı ile dolgu rengini değiştirdiğimizde ise aşağıdaki gibi bir ekran görüntüsü ile karşılaşırız.



Böyle güzel özelliklerinin olması dışında kısıtlanan ufak bir özelliği de var. Yukarıdaki örnek kodumuza dikkat ettiyseniz GDI+ kolaylık ile kullanılabilmektedir. Bu kolaylıktan ötürü .net 3,x isim alanları kullanıldığı durumlarda eskiden olduğu gibi Win32 API ’lerini direkt olarak kullanamıyoruz. Eğer ki kullanmak istersek Windows.System.Shapes isim alanını kaldırıp eskiden kullanmış olduğumuz Windows.System.Drawing isim alanını tanıtmamız 2D işlemler için yeterli olacaktır. Diğer durumlar içinde yeni nesil isim alanları kaldırılıp yerlerine eskileri eklenebilmektedir. Fakat yeni altyapı ile gelen isim alanları hem performans hem de kolaylık açısından bakıldığında geliştiricilere büyük katkıları bulunmaktadır.

GDI ve GDI+ ‘ı eskiden kullandığımız zamanlarda rectangle sınıfı ile çizimlerimizi yapardık. Bu çizim işlemleri sırasında piksellere çizgilerin nasıl yerleştirileceği konusunda büyük sorunlar yaşanırdı. Bu sorunları ortadan gidermek için ise çizginin geçtiği karelere bakılır ve bu karelerin içerisindeki dolgu yüzdesi fazla ise o kare seçilir ve devam edilirdi. Bu yöntem dışında bir de tek kare seçimi yerine birden fazla kareden yararlanılarak yapılan yöntemler kullanılırdı. Bu yöntemler mantıksal olarak uygun yöntemlermiş gibi gözükse de pratikte istenilen sonuçları vermemektedir. Çizilen grafiklerin yaklaştırılması durumunda çizgiler üzerindeki kırılmalar göze çarpıyor ve kusursuz bir çizimi yaşamamış oluyoruz. Bu sorunlar yeni altyapı ile ortadan kaldırılmış durumdadır.

Yukarıda açıkladığımız bu kadar bilginin ışığında kafamıza bir soru takılıyor. Soru ise,Bu grafik işlemlerini form kontrolleri üzerinde de kullanabilir miyiz? biçiminde oluyor. Sorunun cevabı ise kesinlikle evet olacaktır. Çünkü WPF ile birlikte bizlere XAML kod ortamı sunulmaktadır. Bu kod ortamında grafik işlemlerini kullanabilmemiz dışında form kontrollerini dilediğimiz biçimde özelleştirebilmemizde mümkündür. Bu olanaklar yardımıyla form kontrollerini istediğimiz şekilde değiştirebilmemiz ve özelleştirebilmemize olanak vardır.

Bu bilgiler ışında WPF form kontrolüne şeffaflık özelliği eklenerek değiştirilmiş yeni görünüme ait ekran görüntüsü aşağıdadır.



Oluşturabildiğimiz farklı form kontrollerinin dışında bu kontrollerin boyutları konusunda da iyileştirmeler yapılmıştır. Daha önceden hazırlamış olduğumuz uygulamalarda form kontrollerimizin çözünürlük kaliteleri 150dpi iken yeni nesil form kontrolleri ile oluşturabildiklerimizin kaliteleri 200dpi olmuştur. Bu durum ise son kullanıcıların daha düşük çözünürlüklü bir ekran görüntüsü kullandıkların karşılarındaki kontrollerin kenarlarında oluşan kırılmış yapıyı görmemeleri anlamına gelmektedir. Aynı şekilde uygulamanın üzerinde bir noktaya yakınlaştırma yapıldığı zamanda bu durum söz konusu olacaktır.

Grafik işlemlerinin dışında bizler formlarımızın üzerinde animasyon işlemleri yapmak istersek neler yapmalıyız sorusuna değinmeye çalışacağız. Eskiden hazırlamış olduğumuz animasyonlar için GDI, GDI+ veya yönetilebilir DirectX APIleri kullanmamız gerekiyordu. Yine bu işlemlerde grafik işlemleri gibi hazırlanması oldukça zor ve zahmetliydi. Ayrıca bir etken daha var. Eski altyapılar grafik işlemleri ve animasyon işlemlerinde ilk olarak grafik kartı yerine işlemciyi kullanmalarıydı. Bu durumda kullanış olduğumuz bilgisayarın performansında büyük düşüşler gözlenmekteydi. Yukarıdaki paragraflarda neden grafik kartını kullandığını uzunca anlatmıştık. Şimdi ise animasyon işlemlerini XAML yardımı ile ne kadar kolay yapabileceğimize bir örnek ile göz atalım. Örneğimizde yatay eksende bizim belirdiğimiz sürede genişleyen bir dikdörtgen yapılacaktır.

XAML
<Rectangle Fill="Red" Height="100">
   <Rectangle.Triggers>
      <EventTrigger
         RoutedEvent="Rectangle.Loaded">
            <BeginStoryboard>
               <Storyboard TargetProperty=
                 "(Rectangle.Width)">
                  <DoubleAnimation From="20" To="200"
                    Duration="0:0:5"
                    RepeatBehavior="Forever" />
               </Storyboard>
            </BeginStoryboard>
         </EventTrigger>
      </Rectangle.Triggers>
</Rectangle>

Animasyon işlemleri dışında medya dosyalarını da MediaElement yardımıyla çağırabilmemiz mümkündür. Şimdi de bu işlemi nasıl yaptığımızı XAML kod bloğunda görelim.

XAML
<MediaElement Name="myVideo"
   Source="C:\WINDOWS\system32\oobe\intro.wmv"
   Width="450" Height="400" >

Son örneğimiz ile ileri düzey grafikler başlığını bitirmiş oluyoruz. Sadece yukarıda belirtmiş olduğumuz özellikler değil dönüşüm işlemlerinden kontrollere atanan başka stil özelliklerine kadar yapabileceğimiz birçok işlem vardır. Fakat temel bilgi teşkil etmesi açısında yukarıda anlattıklarımızın yeterli olduğunu düşünüyoruz. Bu konular hakkında daha ayrıntı bilgi edinmek isterseniz WPF hakkındaki diğer yazılarımızı okuyabilirsiniz.

9 Puan - Çizim Nesnesi (Drawing Object)

Çizim nesnesinin nasıl kullanıldığını iki biçimde incelememiz daha doğru olacaktır. Birincisi WPF öncesi nasıl kullandığımız, ikincisi ile WPF ile nasıl kullandığımız olacaktır.

WPF öncesi durum için ilk olarak modellenmiş durum şemasına göz atalım;



WPF ‘in grafik sistemi tam olarak kullanılabilen bir yapı olduğundan uzunca bahsedilmişti. WPF öncesi durumda ise sistem tabanlı uygulamalar ile karşılaşmaktaydı. Bu uygulamalarda çizim işlemleri ilk olarak işletim sistemine gönderilir daha sonrasında GDI veya GDI+ gönderilmek üzere uygulamaya işlenmiş olarak geri gönderilirdi. Bu işlenmiş verileri GDI ailesi ile şekiller oluşturulduktan sonra grafik karta gönderilir ve çizim işlemi yapılırdı. Fakat bu durumda ilk olarak GDI kullanıldığı için bu işlemlerin gerçekleşmesi esnasında işleminin tamamını kullanma gereksinimi hissedilmektedir. Böyle bir olayın gerçekleşmesi ise hazırlanmış olan uygulamanın grafik işlemleri esnasında gerçek performansından uzak kalmasına sebep olacaktır. Peki, şu anda kullanılan uygulamalar bu durumları nasıl çözüyorlar. OpenGL ve DirectX APIleri kullanılarak bu yoğunluktan kurtarılabilmesi mümkün oluyordu. Ama kafamıza başka bir soru geliyor. Bu soru; “Uygulamamızda sadece tek bir yerde çizim işlemi uygulayacak bile olsak bu APIleri öğrenmek zorunda mı kalacağız” biçiminde oluyor. Maalesef bu sorunun cevabı evet oluyor.
Başka alternatif çözüm ise WPF kullanmaktadır. WPF ’in çizim nesnesini kullanırken nasıl bir yol izlediğine dair modellenmiş şemasına göz atalım;



WPF kullanılırken arka planda çalışan mantık bir öncekine göre daha kolay gibi gözüküyor. Şimdi bu kolaylığın sebeplerini araştıralım.

Çizim nesnesinin uygulamanın içerisinde oluşturulması GDI ailesine yapılacak olan yüklenmeyi ortadan kaldırmaktadır. Bunun sebebi ise WPF ve XAML içerisinde GDI+ ’in en üst seviyede kullanılıyor olması ve anlık olarak çizilen grafiklerin oluşturulabilmesidir. Bu durum çizim işlemi gerçekleştirilirken işlemciye olan yüklenmeyi ortadan kaldırmaktadır. Ayrıca işletim sistemi derlenme sonucunda nasıl bir çizim işlemi gerçekleşeceği yerine uygulama için hangi protokolleri çalıştırabilirim düşüncesi ile hareket etmektedir. Bu sayede direk WPF ile iletişim içerisinde olmaktadır. Aynı biçimde Uygulama da çizim işlemlerini kod veya XAML ile WPF bünyesinde oluşturduğu için direk grafik kartı ile işlemlerini yapabilmesi mümkün kılmaktadır. Bu sayede çizim işlemeleri grafik kartında oluşturularak sistemin CPU ve RAM gibi bellek elemanlarını zorlamadan yapmış olacaktır.

Tabii bu durumun gerçekleştirilebilmesi için işletim sisteminizin yukarıda açıklamış olduğumuz modele uyumlu olması gerekmektedir. Uyumlu işletim sistemleri ise;

Windows XP + SP3
Windows Vista ve sonrası
Windows Server 2008 (Longhorn) ve sonrası
biçiminde sıralanmaktadır.

C#
public partial class Window1 : Window
{
   private Rectangle[] rectangles = new Rectangle[10];

   public Window1()
   {
      InitializeComponent();

      Canvas can = new Canvas();
      this.Content = can;

      Random rand = new Random();
      byte[] colors = new byte[3];
      for (int i = 0; i < rectangles.Length; ++i)
      {
         rectangles[i] = new Rectangle();
         rand.NextBytes(colors);
         rectangles[i].Fill = new SolidColorBrush(Color.FromArgb(
            255, colors[0], colors[1], colors[2]));
         rectangles[i].Width = 200;
         rectangles[i].Height = 100;
         Canvas.SetLeft(rectangles[i], i*20);
         Canvas.SetTop(rectangles[i], i*10);

         can.Children.Add(rectangles[i]);
      }
   }

   protected override void OnMouseWheel(MouseWheelEventArgs e)
   {
      int diff = e.Delta / 10;
      for (int i = 0; i < rectangles.Length; ++i)
      {
         if (rectangles[i].Width + diff > 0)
         {
            rectangles[i].Width += diff;
         }
      }
   }
}

Yukarıdaki kod parçacığı sonucunda oluşan uygulamanın ilk açılış anı ve fare kaydırma aracı sonrası oluşan görüntüsü aşağıdadır.




Yukarıdaki örneğimiz yardımı ile grafik işlemleri kolayca nasıl yapabildiğimize değinmiş bulunuyoruz. Yeni nesil grafik uygulamalarında hiç zorlanmadan işlemlerin yapılabilmesi için yeni nesil grafik kartlarının kullanılması uygulamalarımızın gerçek performansları açısından çok yararlı olacaktır.

8 Puan - Zengin Metin Uygulamaları (Rich Text)

Web uygulamalarında uzun zamandır Windows içerisinde kullanılan yazı formatları kullanılabilmekteydi. Kullanmış olduğumuz yazı ve stil işlemlerini daha sonraları tekrardan çağırmamak için bir dil oluşturulmuştu ve buna cascading style sheets (CSS) denilmiştir. Fakat web üzerinde kullanılabilen bu formatlar masaüstü uygulamalarında yeterinde kullanılamamaktaydı. Kullanılanlar ise çok kısa metin dosyalarına uygulanmaktaydılar.

Masaüstü uygulamalarında zengin yazı formatları kullanılmak istendiğinde ise Microsoft Word veya Windows işletim sistemlerinin bünyesinde bulunan zengin yazı formatları kullanılmaktaydı. Fakat buton gibi kontrollerde farklı ve süslü yazı stillerini maalesef tam verim ile kullanamıyorduk. Bu durumun en azında web ortamında ortadan kaldırılması amacıyla Microsoft MSHTML dosya formatının sürmüştü. Fakat bu dosya formatı da beklenen ilgiyi geliştiriciler alamamıştır.

WPF ile zengin yazı uygulamaları konusunda oldukça verim alınmış gibi görünüyor. Bu işlemlerin oluşturulmasındaki en büyük etken ise XAML gözükmektedir. XAML sayesinde form üzerine istediğimiz özelleştirmeleri yapabildiğimiz için hiç zorlanmadan zengin metin dosyalarını oluşturabilmemiz mümkün kılınmıştır.

Yukarıda açıkladığımız özellikler ışığında ufak bir uygulama oluşturalım ve oluşturmuş olduğumuz bu uygulamada zengin formatlı metin işlemleri, yazı stilleri ve renklerini kullanalım. Bu işlemleri daha kolay yapılabilmesi için XAML ortamında yapacağız.

XAML
   <Grid>
      <TextBlock FontFamily="Calibri" FontSize="11pt">
         Merhaba,
         <Span FontFamily="Old English Text MT" FontSize="24pt">
            Turhal
         </Span>
         <Italic>
            KTU
         </Italic>
         &lt;<Span Foreground="DarkRed">
            TextBlock
         </Span>/&gt;
         <Hyperlink>
            Link
         </Hyperlink>
      </TextBlock>
   </Grid>

Yukarıdaki koda dikkat ederseniz normal form özeliklerinin dışında web uygulamalarından alışık olduğumuz span metoduna kullanılmaktadır. Bu işlem yapısı sayesinde web programcılar ile Windows programcılarının uyum içerisinde çalışmaları amaçlanmıştır. Şimdi yukarıdaki kod bloğu sonucunda karşımıza çıkan ekran görüntüsüne göz atalım;



Peki, zengin metin dosyalarının içerisinde web uygulamalarında olduğu gibi form kontrollerini kullanamıyor muyuz? “ biçiminde bir soru aklımıza takılabilir. Bu sorunun cevabı oldukça açık ve nettir. “Web üzerinde yapmış olduğumuz işlemlerin neredeyse hepsini WPF uygulamaların da kullanabilmemiz mümkündür.

Şimdi bu bahsettiğimiz web uyumunu uygulayan bir örnek verelim. Bu örnekte bir önceki yazı işlemlerimize buton, checkBox ve radioButon ekleyeceğiz. Kod tarafında yukarıdaki kodda </TextBlock> ‘ın alt kısmını vereceğimiz kodları ekliyoruz.

XAML
   <CheckBox Height="16" Margin="0,38,0,0" Name="checkBox1" VerticalAlignment="Top"
         HorizontalAlignment="Left" Width="120">
      CheckBox
   </CheckBox>
   <RadioButton Height="16" Margin="0,59,0,0" VerticalAlignment="Top"
         HorizontalAlignment="Left" Width="120">
      RadioButton
   </RadioButton>
   <Ellipse Margin="97,38,181,124" Name="ellipse1" Stroke="AliceBlue" Fill="Brown" OpacityMask="Beige">
      <Ellipse.BitmapEffect>
         <EmbossBitmapEffect />
      </Ellipse.BitmapEffect>
   </Ellipse>
   <Button HorizontalAlignment="Left" Margin="0,83,0,0" Name="button1"
         Width="75" Height="23" VerticalAlignment="Top" FontFamily="Old English Text MT">
      Button
   </Button>

Eklediğimiz bu kod parçası sonucunda karşımıza çıkan ekran görüntüsü ise aşağıdaki gibidir.



Zengin metin uygulamalarını WPF ile ne kadar kolay ve performanslı bir biçimde yapacağımıza göz attık. Metin işlemleri ile ilgili diğer işlemleri deneme yanılma yöntemleri veya MSDN yardımı ile öğrenilebilmesi mümkündür.

Umarım Yararlı olmuştur.
Turhal TEMİZER