WPF Temel Kavramlar

WPF modern grafik gösterme sistemidir. Hardware-acceleration ve resolution independence özelliklerine sahiptir.

Windows Vista ve üstü sürümlerde zengin içerikli uygulamaların çalışmasını istiyorsak, WPF ile uygulama geliştirmeliyiz. Ayrıca Windows XP üzerinde çalışması için Visual Studio'da projeyi derlerken .NET 4.0'a göre derlememiz gerekir.

Windows Graphics Gelişimi

WPF'den önce geliştirilen uygulamalar User32 ve GDI/GDI+ arayüzlerini kullanıyordu. WPF ise DirectX teknolojisini kullanmaktadır.

User32: Geleneksel Windows uygulamalarının görünümünü sağlayan arayüzdür. GDI/GDI+: Şekiller, text ve resimlerin gösterilmesini sağlayan arayüzdür

Not: Bu iki arayüz Windows işletim sisteminin uygulamalarıdır. Windows GUI uygulamalarını gösterirken, bu iki arayüz kullanılır.

DirectX: The New Graphics Engine

Windows'ta oyun uygulamalrı yaratmak için geliştirilen bir teknolojidir. Bu ihtiyaç User32 ve GDI/GDI+ teknolojinin eksikliklerini kapatmak için ortaya çıkmıştır.

DirectX teknolojisini kullanarak, enterprise uygulamalar geliştirmek zor olmuştur. Çünkü karmaşık kod yazmayı gerektirmektedir. WPF bu problemi çözmüştür. WPF'te kullanılan teknoloji GDI/GDI+ değil, DirectX teknolojisidir. Bu sayede üç boyutlu grafikler, transparency ve anti-aliasing(resimlerin tırtıklı kenarlarını smooth yapma teknolojisi) gibi özellikleri kolayca uygulamamızda kullanabiliriz. Ayrıca DirectX hardware acceleration kullandığı için daha hızlı çalışan uygulamalarda yapmış oluruz.

Not: WPF'in bir parçası User32'yi kullanmaktadır.

WPF: A Higher-Level API

Hardware acceleration'a ek olarak, WPF aşağıdaki yenilikleri getirmiştir:

1. Web-like Layout Model: Button gibi elementleri sabit bir noktaya eklemek yerine, esnek layout mantığını getirerek, farklı ekranlarda elementlerin otomatik olarak düzenlenmesini sağlar. Hatırlarsak, C# form uygulamalarda sürükle-bırak yöntemine göre tasarım yapılıyordu. Bunun sonucunda ise elementler sabit koordinatlara sahip olmaktaydı. WPF ile web sayfası tasarlar gibi tasarlamalar yapılmaktadır. Ayrıca farklı dillere göre tasarımın rahatça yapılabilmesi sağlanmıştır.

2. Rich Drawing Model: Pikselleri çizmekten ziyade, WPF true transparent kontroller gibi yapıları oluşturur. Native 3D desteği, farklı opacity'ler kullanarak çoklu katmanlı yapılar yaratmayı sağlar.

3. Rich Text Model: Zengin, şık görünümlü text'leri eklemeyi sağlar. Ayrıca text'i listeler ile kayan figürler ile ve diğer kullanıcı arayüz elementleri ile kullanabilir. Ayrıca çok büyük boyutta text göstermek istersek, WPF'in sunduğu gelişmiş dosya gösterme özelliğini kullanabiliriz.

4. Animation: WPF'te animasyon yapmak için timer kullanarak formun kendisini repaint etmesine gerek yoktur. Animasyonları gerekli tag'ler kullanarak oluşturabiliriz.

5. Support for Audio and Video Media: Gelişmiş destek sunar

6. Styles and Templates: Styles ile kontrollerin özelliklerini formatlı hale getirirken, template ile bir elementin nasıl gösterileceğini ayarlayabiliriz.

7. Commands: Bir çok kullanıcı, Open komutunun menu aracılığı ile veya bir toolbar ile tetiklenmesiyle ilgilenmez. Çünkü sonuç aynıdır. WPF uygulama komutlarının bir yerde tanımlayıp, bir çok kontrole bağlantı oluşturmasına olanak sağlamıştır

8. Declarative User Interface: WPF Window'unu kodla oluşturabildiğimiz gibi XAML uzantılı dosya kullanarak ta oluşturabiliriz. WPF'te kod ile arayüz tamaman birbirinden ayrılmıştır. Bu sayede grafik tasarımcılar ile yazılımcılar birbirinden bağımsız çalışabilirler.

9. Page-based Applications: WPF ile, browser üzerinde çalışan uygulamalar geliştirebiliriz. İleri ve geri navigasyon butonları ile sayfa sayfa uygulama tasarlayabiliriz. Hatta WPF uygulamasını direkt Internet Explorer veya Mozilla'da bile çalıştırabiliriz.

Resolution Independence

WPF kullanmadan yapılan Windows masaüstü uygulamalarında geliştiriciler genellikle standart ekran çözünürlüğüne (1366 × 768 piksel) göre uygulama arayüzlerini tasarlarlar. Bunun sonucunda uygulamalar scalable olmaz. Daha yüksek çözünürlüğe sahip bir monitorde uygulama, pikseller daha yoğun olduğu için, daha küçük ve okunması zor olmaktadır.

WPF uygulamaları, arayüzü kendisi oluşturduğu için bu tarz bir probleme neden olmamaktadır. Bunun sonucunda, eğer 1 inch genişliğine sahip bir buton eklemişsek, bu button yüksek çözünürlüğe sahip monitorde de 1 inch genişliğe sahip olacaktır. Yüksek çözünürlüklü monitor bu butonu daha yoğun pixel olaak ve daha yoğun ayrıntı şeklinde gösterecektir.

Not: WPF otomatik scale özelliğini, fiziksel cihazının DPI () ayarına göre değil, işletim sisteminin DPI ayarına göre yapmaktadır. Örneğin, 100-inch lik bir projector'de WPF uygulamasını açtığımızda, uygulama o oranda büyük gösterilir. Benzer şekilde, yüksek çözünürlüklü bir laptopta uygulama çalıştırıldığında, kısmen daha küçük gösterilecektir. Peki WPF, uygulamanın ne kadar büyük olacağını nasıl belirlemektedir?

Cevap: Bir WPF penceresi ve bu pencere içerisindeki tüm elementler device-independent units kullanılarak ölçülür. Device-independent unit 1/96 inch değerine eşittir. Bunun ne anlama geldiğini açıklamak için şöyle örnek verebiliriz: Diyelim ki 96x96 piksellik bir button ekledik. Eğer standart Windows DPI ayarı (96 dpi) kullanıyorsanız, her device-independent unit, gerçek fiziksel piksele eşit olur. WPF aşağıdaki hesaplamayı yapar:

1 [Physical Unit Size] = [Device-Independent Unit Size] x [System DPI] 2 = 1 / 96 inch x 96 dpi 3 = 1 pixel

Gerçekte, WPF 96 pikseli 1 inch olarak varsayımda bulunur. Çünkü Windows sistem DPI ayarına göre bu belirlenir. Ancak gerçek display cihazına bağlı olmaktadır. Örneğin, 19-inch'lik ve 1600'e 1200 piksellik maksimum çözünürlüklü bir LCD monitor düşünelim. Bu monitor'ün dpi değerini aşağıdaki gibi hesaplarız:

[Screen DPI] = Ekranın bir köşesinden diğer köşesine olan uzaklığa düşen piksel sayısı / inch 1 sayısı

Bu piksel sayısı ise Pisagor bağlantısından 2000 olarak çıkar. 2000 / 19 ~= 100 dpi eder. Bu durumda, piksel yoğunluğu 100 dpi değerine eşit olacaktır. Windows 96 dpi değerini varsaydığı için button biraz daha küçük gösterilecektir. Eğer 15 -inch'lik bir LCD monitor olsaydı ve 1024x768 çözünürlükte olsa idi, piksel yoğunluğu yaklaşık 85 dpi olacaktı. Bunun sonucunda 96x96 piksellik button daha büyük gösterilecekti. Çünkü her iki durumda da Windows sistem DPI ayarı 96 dpi olarak kalır. Diğer bir deyişle, Windows 1 -inch yapmak için 96 piksel olduğunu varsaymaya devam eder.

Architecture of WPF

WPF çok katmanlı bir yapıya sahiptir. En üstte, C# dili ile yazılmış high-level servislerler ilişkili çalışmaktadır. milcore.dll ismindeki lower- level component ile .NET nesneleri Direct3D textures ve triangles'larına dönüştürülür.

PresentationFramework.dll: Panel, Windows ve diğer türlerdeki top-level WPF kontrolleri tutar. Ayrıca sitiller gibi daha yüksek programlama yapılarını da implement eder.

PresentationCore.dll: Tüm shape'lerin ve kontrollerin türediği UIElement ve Visual sınıfları gibi ana türleri içerir. Eğer full window ve kontrol abstraction katmanını kullanmayacaksanız bu dll dosyasını uygulamaya eklemeye gerek yoktur.

WindowsBase.dll: DispatcherObject sınıfı ve DependencyObject sınıfı gibi WPF'in dışında kullanılan bileşenleri içerir milcore.dll: WPF rendering sisteminin ve Media Integration Layer (MIL) 'in temelini oluşturur. İçerdiği bileşen görsel elementleri Direct3D'nin algılayabileceği, triangle ve textures'a dönüştürür. milcore.dll kütüphanesi WPF'in parçası olmaktan ziyade, ve 'nin parçasıdır. Ayrıca Desktop () masaüstünü göstermek için bu kütüphaneyi kullanmaktadır.

Not: milcore.dll genelde "managed graphics" için bir engine olarak bilinir. Common Language Runtime (CLR) bir .NET uygulamasının yaşam döngüsünü yönetirken, milcore.dll display state'i yönetir. CLR'nin yazılımcıyı, nesnelerin yok edilmesi gibi işlemlerden kurtardığı gibi, milcore.dll 'de bir window'un açılıp kapatılmasından, barındırdığı kontrollerin gösterilmesinden vb gibi işlemlerden kurtarır.

WindowsCodecs.dll: Bitmap ve JPEGs türünden resimlerin gösterilmesini ve scale edilmesini sağlayan low-level API'dir.

Direct3D: WPF uygulamasındaki tüm grafiklerin gösterilmesinden sorumlu olan low-level API'dir.

User32: Native windows ve kontrolleri içeren ve diğer bir çok ana yapıları barındıran bir Windows bileşenidir. WinForms tüm form'ları ve kontrolleri yaratmak için bu bileşeni kullanır. WPF ise Windows'ları bu bişelen ile yarattıktan sonra Direct3D'yi kullanarak ekranda gösterir.

Not: Akılda tutulması gereken en önemli kısım şudur: WPF'te tüm rendering işlemleri Direct3D aracılığı ile yapılmaktadır. GDI+ veya User32 kullanılmamaktadır.

Class Hierarchy

System.Threading.DispatcherObject

WPF uygulamaları genelde, tek bir thread tarafından yönetilen modeli kullanır. Diğer bir thread'ten bu thread'e direkt erişmek güvenli olmadığı için, WPF klavyeden, fare hareketlerinden gelen mesajları bu thread'e aktarmak için bir dispatcher kullanır. Bu dispatcher DispatcherObject sınıfından yaratılmış bir nesnedir.

System.Windows.DependencyObject

WPF'te onscreen elementlerine direkt etkileşim property'ler aracılığı ile yapılmaktadır. DependencyObject'in görevi, bir elementin property değeri değiştiği zaman, "change notification" sağlamak ve property'lerin değerlerini hesaplamaktır.

System.Windows.Media.Visual

WPF'te her element bir Visual'dır. Visual sınıfını tek bir drawing nesnesi olarak düşünebiliriz. Bu nesne drawing komutlarını, drawing işleminin nasıl yapılacağı (örneğin clipping, opacity ve transformation ayarları) ile ilgili ek özellikleri ve temel fonksiyonları içerir. Visual sınıfı ayrıca display'i sağlayan milcore.dll ile WPF kütüphaneleri arasındaki bağlantıyı da sağlar. System.Windows.UIElement

UIElement layout, input, focus ve event'lar gibi WPF'te bulunan temel yapılara destek sağlar.

System.Windows.FrameworkElement

FrameworkElement WPF mimari yapısının son modülüdür. UIElement'in sağladığı bazı property'lerin implement edilmesine katkı sağlar. Örneğin, UIElement WPF layout sisteminin ana yapısını oluştururken, FrameworkElement, HorizontalAlignment ve Margin gibi property'leri sağlar. UIElement ayrıca data binding, animation ve şablon gibi temel özellikleri de sağlar.

System.Windows.Shapes.Shape

Rectangle, Polygon, Ellipse, Line ve Path gibi sınıflar Shape sınıfından türerler. Bu şekiller, buttonlarda ve text box'larda kullanılabilirler.

System.Windows.Controls.Control

Bir control, kullanıcının etkileşimde bulunduğu element olarak ifade edilir. Bu element TextBox, Button ve ListBox gibi sınıfları içerir. Control sınıfı, font, foreground ve background özelliklerini ayarlamayı sağlayan ek özellikler sağlar. Fakat en önemli özelliği herhangi bir Control sınıfının template desteği sunmasından dolayı görünüşünü değiştirme olanağı sağlar.

Not: Windows Form uygulamalarında her visual item control olarak ifade edilmektedir. Fakat WPF'te durum böyle değildir. Visual item'lar element olarak adlandırılır ve sadece bazı elementler gerçekte kontrollerdir.(focus özelliğine sahip ve kullanıcıyla etkileşimli olanlar)

System.Windows.Controls.ContentControl

Tek bir parça content'e sahip olan tüm kontroller için temel sınıftır. Content Label'den Window'a kadar her şeyi içerir.

System.Windows.Controls.ItemsControl

ListBox ve TreeView gibi item'lardan oluşan kontroller için temel sınıftır. List kontroller oldukça esnektir. Örneğin, ItemsControl sınıfındaki özellikleri kullanarak ListBox'ı, radio butonlardan oluşan bir yapıya dönüştürebiliriz. WPF'te aslında menüler, toolbar'lar ve status bar'lar özelleşmiş listelerdir. Bundan dolayı bu sınıflar da ItemsControl sınıfından türemişlerdir.

System.Windows.Controls.Panel

Tüm layout konteynırlar için temel sınıftır.

Not: WPF teknolojisi .NET 3.0 ile gelmiştir. WPF ile uygulama geliştirirken, .NET 4.0'a göre tasarlarsak, Windows XP'de de uygulama çalışır. Fakat .NET 4.5'e göre yapıldığında XP'de çalışmaz.