WPF ile Programlama

WPF ile Programlama                                                                 WPF ile ProgramlamaBir önceki yazimizda Windows Presentation Foundation konusuna giris yapmis, getirdigi yeniliklerden ve özelliklerinden bahsetmistik. Bu makalemizde WPF ile programlamaya giris yapmaya çalisacağız. Ancak WPF oldukça büyük bir degisim içerdigi için öncelikle bazi kavramlari açiklamamiz lazim.Uygulama Türüne Karar VermekWPF biz programcilara iki farkli uygulama gelistirebilmemiz için imkan saglar. Bunlardan biri Windows Forms"un devami sayilabilecek olan masaüstü uygulamalari, digeri ise masaüstü uygulamalarin web ortamina tasinmis hali olan Web uygulamalari. Yalniz dikkat ettiyseniz burada Web Uygulamalari için ASP.Net"in devami sayilabilecek gibi bir cümle kullanmadim, çünkü ögrendikçe sizde fark edeceksiniz ki böyle bir benzetme yapmak son derece yanlis olacaktır .Windows UygulamalariGelistirmeyi düsündügünüz uygulamanin; Sistem kaynaklarını kullanmaya ihtiyacı varsa, registery, disk sürücüleri, vs. Uygulamanın offline (çevrimdışı) çalışmasının bir mahsuru yok ise. Ağ kaynaklarına erişmesi gerekiyor ise

o zaman Windows uygulamaları seçilmelidir.

Bir windows uygulaması geliştirildikten sonra standart olarak 3 dosya ile gelir.

.exe : Çalıştırılabilir olan uygulama .application: Uygulamanın ClickOnce ile dağıtılması sırasında gereken Application dosyası .exe.manifest: Uygulama ile ilgili metadata bilgilerini tutan dosya

Ayrıca uygulamayı geliştirirken DLL"ler kullanıldı ise bunlarda yer alacaktır.

Web Uygulamaları - Yeni bir terim XBAP

XBAP yani Xaml Browser APplications WPF ile web ortamından dağıtılabilecek uygulamalar yazabilmek için geliştirilen bir teknolojidir. Alışılmış web teknolojilerinden (ASP, PHP veya ASP.Net bile) oldukça farklı olan XBAP ile uygulama sanki masaüstü uygulaması gibi tasarlanıyor ve herhangi bir kısıt olmadan geliştiriliyor. Burada XBAP"ları masaüstü uygulaması olmaktan ayıran en büyük fark kullanıcıların sanki Web ortamında gibi sayfalar (page) arasında dolaşabilmesi ve istediği zaman geri dönebilmesi.

XBAP ile hazırlanmış bir uygulama açılmak istendiği zaman ClickOnce aracılığı ile uygulama dağıtılmaya çalışılacaktır ardından .exe, .xbap, .exe.manifest ve .deploy uzantılı dört dosya makineye indirilecektir.

Buradaki .exe uzantısı sizi korkutmasın çünkü bu exe"nin işi sadece XBAP"ın sağlıklı birşekilde açılabilmesini sağlamak. Bilgisayarınıza bir defa .xbap dosyası indikten sonra bu dosya sadece bir kere çalıştırılabilir. Bir kere daha çalıştırmak istediğiniz zaman mutlaka sunucudan son halini alacaktır, çünkü o sunucu taraflı bir uygulamadır ve son versiyon her zaman sunucudadır; kullanıcı da bu son versiyonu kullanmalıdır.

XBAP ile ilgili en çok merak edilen ya da kuşku ile yaklaşılan güvenlik konusudur. Çünkü burada kullanıcının (ya da sizin) bilgisayarınıza inen .exe ve programatik kodlar ile XAML kodlarından olaşan .xbap dosyaları söz konusu. Merak edilen ise bu dosyalardaki kodlar ile kullanıcının bilgisayarına müdahale edilip edilemeyeceği. Bunun cevabı çok kısa ve net, HAYIR. Çünkü XBAP uygulamaları klasik web uygulamaları gibi Internet Security Zone ile kısıtlanmıştır. Böylece uygulama yüksek güvenlik seviyesinde çalışacak ve sistem kaynaklarına ulaşamayacaktır. Dolayısı ile sistem kaynaklarına ulaşması gereken veya offline çalışması gereken bir uygulama geliştirmek istiyorsanız XBAP size göre değildir. Çünkü az öncede bahsedildiği gibi XBAP her seferinde sunucudan yüklenir.

XBAP uygulamaları alışılagelmiş web uygulamalarından çok farklıdır. Örneğin Javascript dışında herhangi bir şekilde kullanıcıya MessageBox (alert) gösterilemezdi. Oysa ki WPF ile bu mümkün, çünkü burada web uygulaması geliştirmiyoruz, webten dağıtılan, kullanıcının bilgisayarında çalışan ama web tarayıcısı içinde çalışan bir uygulama geliştiriyoruz.

XBAP uygulamaları .Net Framework 3.5 versiyonundan beri Firefox tarayıcısı ile de sorunsuz çalışıyor.

Application Nesnesi

Application nesnesi WPF uygulamalarının temelinde yer alan bir nesnedir. presentationframework.dll "inde yer alan System.Windows namespace"i içinde bulunan sınıf tüm uygulamalayı kanatları altına alan bir nesne olarak görülebilir.

Ayrıca bu nesne uygulama ile işletim sistemi arasında bir arayüz olarak çalışır, böylece uygulamadan sisteme gidecek mesajlar, sistemden uygulamaya gidecek mesajlar Application nesnesi aracılığı ile iletililir.

Application nesnesi uygulama için önem arz eden bir çok özelliğe, metoda ve olaya sahiptir. Ayrıca uygulama sınırları içerisinde veri taşımak için kullanılabilir. Uygulama oluşturulduktan sonra, App.xaml ve App.xaml.cs uzantılı iki dosya oluşur. Bu dosyalar uygulamanın başlangıç noktasıdır (WinForms"taki Program.cs gibi). App.xaml dosyasının görsel arayüzü yoktur ama XAML kodlarından oluşur. Örnek bir App.xaml aşağıdaki gibidir.

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"StartupUri="Window1.xaml" />

Bu kod da bulunan x:Class ifadesi App.xaml.cs dosyasındaki sınıfı temsil eder.

using System;using System.Collections.Generic;using System.Configuration;using System.Data;using System.Windows;namespace ApplicationNesnesi{/// /// Interaction logic for App.xaml/// public partial class App : Application{}}

xmlns ile başlayan kısımlar ise tüm XAML dökümanlarında bulunan XML namespace"lerini ifade eder. Burada en önemli özellik StartupUri özelliğidir. Bu özellik hangi XAML sayfasının açılacağını gösterir, yani başlagıç sayfası belirtilmiş olunur.

Application Nesnesini Kullanmak

Application nesnesi bir uygulama için birçok önemli özelliğe ve olaya sahip olduğundan bahsetmiştik. Bunlardan bir kısmını denemek için aşağıdaki gibi bir uygulama geliştirilelim. Uygulamanın Window1 isimli penceresine bir Label ve ListBox koyalım.

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Application Nesnesi" Height="336" Width="515" Loaded="Window_Loaded">Uygulama mesajları

Sonra da aynı Form_Load (veya Page_Load) olaylarında olduğu gibi sayfanın yüklenmesi ile çalışan Window_Load olayına bir metod yazalım.

private void Window_Loaded(object sender, RoutedEventArgs e){Application.Current.Properties.Add("Site", "MaxiASP.Net");Application.Current.Activated += new EventHandler(Current_Activated);Application.Current.Deactivated += new EventHandler(Current_Deactivated);Application.Current.Startup += new StartupEventHandler(Current_Startup);listBox1.Items.Add ("Çalışan ana pencerenin adı: " + Application.Current.MainWindow.Title);OzelliktenOku();}

Bu metod ile Application.Current özelliği ile mevcut Application nesnesine ulaşarak Activated, Deactivated olaylarına metod bildiriyoruz. Ayrıca

Application.Current.Properties.Add("Site", "MaxiASP.Net");

satırını kullanarakta Application nesnesinin Properties kollokesiyonuna saklamak istediğimiz veriyi ekliyoruz. Bu kolleksiyon IDictionary arayüzünden türediği için Key-Value çifti olarak değerleri tutuyor ve tüm uygulama içerisinde geçerli oluyor. Bunu bir nevi ASP.Net"in Session nesnesinde tuttuğumuz verilerle benzetebiliriz.

private void OzelliktenOku(){listBox1.Items.Add("Site: " + Application.Current.Properties ["Site"]);}

void Current_Deactivated (object sender, EventArgs e){// uygulama deaktif olduğunda çalışan olay.listBox1.Items.Add ("Uygulama deaktif oldu");}

void Current_Activated(object sender, EventArgs e){// uygulama aktif olduğunda çalışan olay.listBox1.Items.Add ("Uygulama aktif oldu");}

Uygulamayı bu kodlar ile çalıştırdığımızda aşağıdaki gibi bir görüntü ile karşılaşıyoruz.

Ayrıca Application nesnesi uygulamanın kapatılmasını yönetebilecek olayara ve özelliklere de sahiptir. Örneğin Application.Current.ShutdownMode özelliğinden, ShutdownMode numaralandırıcısı ile ayarlanabilen özellik, uygulamanın kapatılırken nasıl davranacağının belirlenmesinde kullanılır. Bu numaralandırıcının üç değeri aşağıdaki gibidir.

OnExplicitShutdown: Uygulama sadece Exit metodunun çağrılması, işletimin sisteminin kapatılması gibi harici bir etken ile sonlandırılabilir. OnMainWindowClose: Ana ekran kapatıldığı an uygulamanın kapatılmasını sağlar. OnLastWindowClose: Ekranda bulunan son ekranda kapatılana kadar uygulama açık kalır.

Pencere Yönetimi

Bir uygulama geliştirilirken tek bir pencere kullanılmaz. Birden fazla pencereye ihtiyaç duyulur. WPF "te WinForms"tan farlı olarak size 3 farklı pencere türü sunar.

Window NavigationWindow Page

Window Nesnesi

Window nesnesi standart pencereyi temsil eder, örneğin az önceki Application Nesnesi örneğinde olduğu gibi. NavigationWindow"a göre az sistem kaynağı harcar ve daha hızlı çalışır.

Window nesnesi birçok özelliğe, metoda ve olaya sahiptir. Bu elemanlar aracılığı ile istediğinizi yapabilirsiniz. Ayrıca bir uygulama da hem NavigationWindow hem de normal Window bulunabilir.

NavigationWindow

NavigationWindow"lar Page"ler arasında ileri ve geri tuşları ile gezilmesini sağlayan yapılardır. Bu konu ile ilgili daha sonra detaylı bir makale kaleme almayı düşündüğümden burada çok açıklama yapmıyorum.

Ekran görüntülerine dikkat ettiyseniz pencerelerde ileri ve geri düğmeleri belirdi. Bu düğmeler aracılığı ile sanki web ortamındaymışçasına sayfalar arasında dolaşılabilir.

NavigatedWindow"lar birer container kontrolü olmadıkları için, içerik bulunduramazlar sadece başka Page"lerin gösterilmesini sağlayabilirler.

Page

Az önceki örnekte NavigationWindow aracılığı ile görüntülenenler birer Page"dir. Page"ler Window"lar ve NavigatedWindow"lar tarafından gösterilebilecek olan, çoğunlukla XBAP uygulamalarında kullanılan yapılardır.

Page"ler kendi başlarına kullanılıp ekrana getirilemezler. Mutlaka bir Window ya da NavigatedWindow gerekmektedir.

Döküman Arama

Başlık :

Kapat