WPF, Windows Phone Command Binding Event Handling

WPF ve Windows Phone’da Command Binding İşlemiyle Event Handling

Aşağıdaki uygulama Windows Phone için yazılmıştır. Windows Phone, WPF/Silverlight altyapısı üzerine geliştirilmiş olduğu örnekte kullanılan bu özellik WPF ile geliştirilen masaüstü veya Silverlight ile geliştirilen web uygulamalarında da kullanılabilir.

NOT : Bu yazı Aykut TAŞDELEN’in C++ Java ve C# ile UML ve Dizayn Paternleri kitabından alıntıdır izinsiz kullanılıp alıntı yapılamaz ! Konunun devamı söz konusu kitapta yer almaktadır.

WPF’te event handling konusuna command patern’i bağlamında yeni bir boyut getirilmiştir. System.Windows.Input.ICommand interface’i ile command patern’i uygulanarak event handling işlemi gerçekleştirilebilir.

public interface ICommand

{

event EventHandler CanExecuteChanged;

bool CanExecute(object parameter);

void Execute(object parameter);

}

Command nesneleri bir eyleme ilişkin lojiği enkapsüle eder. Böylece uygulamanın çeşitli unsurları bir eylemi gerçekleştirmek istediğinde bunu ilgili command nesnesi yoluyla yapabilir. Aşağıdaki örnekte ICommand interface’inin gerçekleştirimi olan TestCommand sınıfı görülmektedir.

namespace WPhoneCommandBinding

{

public class TestCommand : System.Windows.Input.ICommand

{

public bool CanExecute(object parameter)

{

return true;

}

public event EventHandler CanExecuteChanged;

public void Execute(object parameter)

{

MessageBox.Show(“Test : ” + parameter);

CanExecuteChanged(this, new EventArgs());

}

}

}

Bu sınıfın Execute() metodu parametresine gönderilen bilgiyi mesaj kutusu içinde göstermektedir. Ancak bu sınıfa ait bir nesnenin kullanımı ve Execute() metoduna parametre gönderilişi oldukça ilginçtir zira XAML içerisinden dekleratif şekilde yapılmaktadır.

<phone:PhoneApplicationPage

xmlns:tst=”clr-namespace:WPhoneCommandBinding”>

<StackPanel>

<StackPanel.Resources>

<tst:TestCommand x:Key=”komut” />

</StackPanel.Resources>

<Button
Command=”{StaticResource komut}”
CommandParameter=”Deneme123″
Name=”btnTest” Content=”Test” />

</StackPanel>

</phone:PhoneApplicationPage>

XAML kodu incelenirse öncelikle WPhoneCommandBinding namespace’inin tst kısaltmasıyla tanımlandığı daha sonra buradaki TestCommand türünde komut isimli bir kaynak tanımlanıp bu kaynağın da daha sonra Button’un Command property’sine bind edilerek kullanıldığı görülmektedir. Örnek emülatörde çalışırılıp denendiğinde ise ekrana gelen mesaj kutusu içerisinde “Deneme123” metninin sunulduğu görülecektir.

Reklamlar

XAML Editörleri

WPF ya da Silverligth’la uğraşan programcılar Visual Studio’nun XAML editörünü genelde beğenmez ve farklı editör arayışına girer. Şüphesiz Expression Blend iyi bir editör ancak farklı alternatifleri de yok değil. Örneğin XAMLPAD, SDK içinden çıkan basit ama güzel bir editör ya da KAXAML bir 3. parti editör olarak tavsiye edilebilir.

WPF Windows Presentation Foundation

WPF Windows Presentation Foundation Kitabı Çıktı

Uzun bir süredir üzerinde çalışmakta olduğum WPF Windows Presentation Foundation kitabım pusula yayıncılıktan çıktı. Okurlarım Türkçe kullanımına ne kadar dikkat ettiğimi bilirler, bu kitapta da öğretici, sade ve düzgün bir dil kullandım. Çünkü internetteki yazılarda hep eleştiregeldiğim VJ ağzıyla yazılmış bozuk Türkçeli yazılara çok kızıyorum. Hep kızdığım bir şey de; bu maalesef kitaplarda da yapılıyor ele alınan konuya hayran kalmış onu öve öve bitiremeyen yazar klişesi. Ben konuyu şövenist bir tutumla anlatmak yerine eleştiriler de yaparak, zaman zaman API,MFC, Swing ya da QT gibi farklı teknolojilerle karşılaştırarak, benzerliklerine dikkat çekerek ele aldım. Herşeyden önemlisi C ve Sistem Programcıları Derneğinin genel çizgisi ve tarzında yani bir sistem programcısının bakış açısıyla WPF’i inceledim. Özellikle bazı bölümlerde bu durum dikkatinizi çekecektir. Ayrıca kitapta XAML, MVC, WCF (Windows Communication Foundation) ve Blend ile ilgili de başlıklar bulacaksınız. Kitapta ele alınan başlıklar ise şöyle;
•             MVC ve MVVM Patern’lerinin kullanımı
•             XAML kullanımı
•             Paneller ve Diğer Nesneler
•             Routed Event ve Komutlar
•             WPF’te Kaynak Kullanımı
•             WPF’te DataBinding işlemleri
•             XBAP, BAML vb kavramlar
•             WPF ile animasyon uygulamaları
•             Çizim işlemleri
•             WPF’te Win32 mesajlarının yakalanması
•             WPF MultiThread Programlama
•             WPF’te Tema ve stil uygulamaları
•             WCF kullanımı
•             .NET Framework 4.0 Eklentileri
•             Expression Blend’in Kullanımı
•             Ve diğerleri .

Kitap temini, WPF ve Silverlight eğitimleri için info@aykuttasdelen.net adresinden yazara ulaşabilirsiniz…

What is Dependency Property (WPF) Dependency Property Nedir

Dependency Property Nedir

Bu yazı Aykut TAŞDELEN’in WPF kitabından alıntıdır izinsiz kullanılamaz ! Konuyla ilgili diğer kısımlar kitapta devam etmektedir.

WPF kütüphanesindeki çeşitli sınıflar incelendikçe tasarımdaki genel yaklaşımın WPF’te property’lere daha fazla anlam yüklediği görülecektir. Gerçekten de WPF sisteminde property’ler fonksiyon ve event’lere göre daha önemlidir ve daha sık kullanılmak zorundadır. Bu durum özellikle data binding konusunda daha da keskinleşmektedir. Bu nedenle WPF, CLR’ın sunduğundan daha zengin bir property sistemi sunar.

 

WPF’in “property sistemi” diye anılan niteliği aslında büyük ölçüde dependency property gibi yeni kavramlara dayanmaktadır. Dependency property; WPF property sistemine kaydedilmiş (register edilmiş) property’lerdir. Bu property’ler; value expression’ları, data binding, animasyon, değişim uyarısı, ve styling gibi özel konularda destek sağlar.

 

Dependency Property gibi yeni bir kavramın varlık gerekçesi; söz konusu property’e ait değerin databinding, stil kullanımı, animasyon gibi dışsal girdilere bağlı şekilde hesaplanabilmesini sağlamaktır.
Daha önce de dile getirildiği gibi dependency property’ler özellikle data binding konusunda hayati önem arzetmektedir. Zira bir nesnenin herhangi bir özelliğine veri bağlamanın gerek şartı; söz konusu özelliğin bir dependency property’e sahip olmasıdır !

 

Herhangi bir sınıfta, bir dependency property oluşturmak (yani bir property’i dependency property haline getirmek) için; DependencyProperty sınıfı türünde ve “public static readonly” bir veri elemanı tanımlamak gerekir. Tanımlanan bu elemanın ismini, asıl property’nin isminin sonuna Property kelimesini ekleyerek tanımlamak gerekir. Örneğin Control sınıfında FontSizeProperty elemanı bu şekilde tanımlanmıştır. Böylece FontSizeProperty, FontSize isimli property’nin dependency property’si olmaktadır.

 public class Control: FrameworkElement {
    public static readonly DependencyProperty FontSizeProperty;     // ... }

 

Bu  eleman artık WPF’in property sistemine register yani dahil edilebilir. Bu işlem DependencyProperty sınıfının statik Register() fonksiyonu ile gerçekleştirilir. Register() ilk parametresine asıl property’nin ismini, 2.parametresine türünü, 3.parametresine ise property’nin ait olduğu sınıfın türünü almalıdır.

 

public class Control : FrameworkElement {
    public static readonly DependencyProperty FontSizeProperty;
    static Control()
    {
         FontSizeProperty = DependencyProperty.Register("FontSize",   typeof(double),                      typeof(Control));
    }
}

 

Bu noktada artık asıl property’e ilişkin implementasyon gerçekleştirilebilir. Ancak bu noktada CLR property’lerinden farklı olarak DependencyObject sınıfından kalıtım yoluyla elde edilen GetValue() ve SetValue() isimli metotlar kullanılacaktır.

 

public Object GetValue(DependencyProperty dp)

 

public void SetValue(

      DependencyProperty dp,

      Object value

)

 

Bu metotlar dependency property’de saklanan değeri get ve set eder. Kodun aşağıda tamamlanmış son halini inceleyiniz.

 

public class Control : FrameworkElement {     public static readonly DependencyProperty FontSizeProperty;
    
    static Control()
    {
         FontSizeProperty = DependencyProperty.Register(                      "FontSize",                      typeof(double),
                     typeof(Control));
    }
 
     public double FontSize
     {
          get
          {
              return (double) this.GetValue(FontSizeProperty);
          }
          set
          {
              this.SetValue(FontSizeProperty, value); 
          }
     }
}