|
WPF ile
Programlama
Bir
ö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
Vermek
WPF 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 Uygulamalari
Gelistirmeyi 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.
<Application
x:Class="ApplicationNesnesi.App"
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
{
/// <summary>
/// Interaction logic for
App.xaml
/// </summary>
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.
<Window x:Class="ApplicationNesnesi.Window1"
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">
<Grid>
<ListBox Name="listBox1" Margin="0,29,0,0" />
<Label Height="28" Name="label1"
VerticalAlignment="Top" HorizontalAlignment="Left"
Width="120">Uygulama mesajları</Label>
</Grid>
</Window> |
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.
|