Abdurrahman KÖKEN | BLOG

just a developer... | Microsoft Student Partner

WPF-Otomatik Stil Uygulama

Ağustos 20
by Abdurrahman Köken 20. Ağustos 2010 00:33

Uygulamalarımızda bulunanan elementlerimizin görünüşü değiştirmek için XAML’da stilleri kullanırız.Diyelim ki uygulamamızda bulunan butonlara stil vermek istiyoruz.Örnek olarak şu şekilde bir stilimiz olduğunu varsayalım:

<Window.Resources>
 <Style x:Key="buttonStyle" TargetType="{x:Type Button}">
  <Setter Property="FontSize" Value="24"/>
  <Setter Property="Foreground" Value="ForestGreen"/>
  <Setter Property="FontWeight" Value="Bold"/>
 </Style>
</Window.Resources>

Yukarıdaki stilimizi butonlara uygulamak içinse her bir butonun Style property’sinde hazırlamış olduğumuz  stili aşağıdaki gibi belirtmemiz gerekir:

<Button Content="Click" Style="{StaticResource buttonStyle}"/>
Eğer uygulamamızdaki bütün butonlara aynı stili tek tek yerine hepsine aynı anda uygulamak istiyorsak  stilimizdeki x:Key attribute’unu kaldırmamız yeterli olacaktır.Sadece TargetType belirterek o tiple eşleşen tüm elementlere stili otomatik uygulatabiliriz.Bunu yapmanın diğer bir yolu ise TargetType attribute’unu kaldırıp x:Key’de element tipini belirtmektir.

1.yol

<Style TargetType="{x:Type Button}">
  <Setter Property="FontSize" Value="24"/>
  <Setter Property="Foreground" Value="ForestGreen"/>
  <Setter Property="FontWeight" Value="Bold"/>
</Style>

2.yol

<Style x:Key="{x:Type Button}">  
 <Setter Property="Button.FontSize" Value="24"/>  
 <Setter Property="Button.Foreground" Value="ForestGreen"/>  
 <Setter Property="Button.FontWeight" Value="Bold"/>
</Style>

Gördüğünüz gibi kolayca stillerinizi otomatik olarak elementlere  uygulayabilirsiniz.Hatta stil uygulanmasını istemediğiniz kontrolleri

<Button Content="Click" Style="{x:Null}"/>

şeklinde belirtebilirsiniz.İlk yolu deneyerek yazdığım uygulamanın XAML kodunu ve çıktısını bulabilirsiniz.

<StackPanel> 
 <Button Content="Click"  Width="100" Height="50"  /> 
 <Button Content="Click"  Width="100" Height="50" Style="{x:Null}"/> 
 <Button Content="Click"  Width="100" Height="50"/>
</StackPanel>

Kolay gelsin.

 

Tags: , ,

WPF

WPF-Attached Property Nedir?

Temmuz 04
by Abdurrahman Köken 4. Temmuz 2010 21:18

Sıradan property’lerin yanı sıra XAML,pek çok kontrolün uygulayabildiği fakat farklı bir sınıfta tanımlanan attached property adında bir konsepti de içerisinde barındırmaktadır. WPF uygulamalarında attached property’ler daha çok kontrollerin düzeni(layout)  için kullanılmaktadır.

Nasıl Çalışır?

Her kontrolün kendine has belirli property kümesi vardır.Örneğin bir textbox’ın fontu,metin rengi ve text içeriği gibi özellikleri vardır.Bu özellikler FontFamily,Foreground ve Text gibi propertyler tarafından set edilebilmektedir.Bunun yanı sıra bir kontrolü bir konteynırın içine yerleştirdiğimizde, kontrol konteynırın tipine bağlı olarak ek özellikler kazanır.Örneğin bir textbox’ı bir Canvas’ın içerisini yerleştirdiğimizde sol üst noktaya göre pozisyonunu ayarlayabiliyor olmalıyız.Bu ekstra detaylar attached property ‘ler kullanılarak ayarlanabilmektedir.

Attached property’ler isimlendirilmesi daima  DefiningType.PropertyName şeklinde iki kısımdan oluşur.Bu ikili isimlendirme sözdizimi XAML Parser’ın  normal property’ler ile attached property’leri ayırt etmesini sağlar.

<Canvas> 

<TextBox Canvas.Top="10"/> 

<TextBox Canvas.Top="40"/> 

<TextBox Canvas.Top="70"/>

</Canvas> 

Attached property’ler aslında gerçek property değildirler.Onlar özünde method çağrımlarına çevrilmişlerdir.XAML parser DefiningType.SetPropertyName() formundaki static bir metodu çağırır.Örneğin yukarıdaki kodumuzda DefiningType Canvas,Property’miz  de Top olduğu için xaml parser Canvas.SetTop() metodunu çağırır.

SetPropertyName()’i çağırırken xaml parser iki parametre geçirir:düzenlenen nesne ve belirlenen property değeridir.Örneğin textbox kontrolünde Canvas.Left özelliğini set ettiğimizde parser şu kodu çalıştırır:

Canvas.SetLeft(txtBox1,10);

Burada soldan uzaklık aslında uygulanan nesne üzerinde saklanmaktadır.Bu durumda property değer TextBox üzerinde saklanmaktadır.Çünkü tüm WPF kontrolleri gibi TextBox kontrolü de DependencyObject temel sınıfından türemiştir.Bilindiği gibi DependencyObject, dependency property’lerin sınırsız bir koleksiyonunu saklamak için tasarlanmıştır.Attached property’ler de dependency property’lerin özel bir tipidir.Belirtmem gereken bir husus da şudur.Aslında Canvas.SetLeft() metodu DependencyObject.SetValue() metodunun bir kısayoludur.Örneğin:

txtBox1.SetValue(Canvas.LeftProperty,10);

Attached property’ler WPF’in çekirdek bileşenleridir.Çok amaçlı genişletilebilir bir sistem gibi davranırlar.Örneğin Left property’sini attached property olarak tanımlayarak,bu property’nin herhangi bir kontrol ile kullanılabilmesini sağlamakla beraber esnek bir yapı oluşturmuş oluruz.

Kolay gelsin.  

WPF-Binding Modlar

Temmuz 04
by Abdurrahman Köken 4. Temmuz 2010 01:37

Bu yazımda data binding işlemlerinde kullanılan binding modlar hakkında bilgi vermek istiyorum.Binding modları kullanarak kaynak ile hedef arasındaki veri akışını kontrol edebiliriz.Özellikle bazı durumlarda verilerimizin kaynaktan hedefe gibi tek yönlü akmasını isteriz.Aşağıdaki tabloda binding modların bir listesini ve hangi modun ne işe yaradığını bulabilirsiniz.

 

OneWay

OneWay mod tablodaki açıklamada da belirtildiği gibi tek yönlü bir veri akışı söz konusudur.Bu akış da kaynaktan hedefe doğrudur.Kaynak property de herhangi bir değişiklik olduğunda bu değişiklik hedef property eye de yansımaktadır.

TwoWay

En sık kullanılan modlardan birisidir.OneWay moda ek olarak  hedeften kaynağa veri akışı da sağlamaktadır.

OneTime

OneTime mod ise aslında bazı yerlerde çok kullanışlı olabilmektedir.Bu mod ile kaynaktan hedefe doğru sadece bir kez binding işlemi söz konusudur.

OneWayToSource

İsminden de anlaşılacağı gibi OneWay modun tam tersi işlemi yerine getirmektedir.Hedef property de  olan bir değişiklik kaynağa yansıtılmaktadır.

<TextBox x:Name="txtSource"/>

<TextBox Text="{Binding ElementName=txtName,Path=Text,Mode=OneWay}"/> 

Yukarıdaki kodda binding modların kullanılışını gösteren bir örnek bulunmaktadır.Buradaki kodda dikkat ederseniz OneWay  mod kullanılmış.Yani üstteki TextBox’a girilen metnin aynısı binding işlemleri sayesinde alttaki TextBox’ta da görülecektir.Fakat alttaki kutucukta yapılan değişiklik kaynak TextBox’ın Text property’sinde herhangi bir değişikliğe sebep olmayacaktır. Aşağıdaki şekilde kolay bir şekilde modlar arasındaki farkları görebilirsiniz.

   

Kod Tarafında Binding İşlemi 

Binding binding = new Binding();

binding.Source = txtSource;

binding.Path = new PropertyPath("Text");

binding.Mode = BindingMode.OneWay;

txtTarget.SetBinding(TextBlock.TextProperty, binding);

Yukarıda bahsettiğim modlar arasındaki farkı daha iyi anlamanız için yukarıdaki örnek kodun modlarını değiştirmenizi tavsiye ederim.

Hepinize kolay gelsin.

 

WPF-Dependency Property Nedir?

Mayıs 06
by Abdurrahman Köken 6. Mayıs 2010 02:34

Giriş

WPF ile uğraştıysanız farkında olmadan da olsa mutlaka Dependency propertyleri kullanmışsınızdır.Dependency propertyler  normal .NET propertylerine oldukça benzemektedir, fakat Dependency propertyler konsept olarak çok daha güçlü ve komplekstir.Aralarındaki en önemli fark,normal bir  .NET propertynin değeri sınıfta tanımlanmış private bir üyeden direkt olarak okunur.

Bir dependency propertynin değeri ise GetValue() metodu çağrıldığında dinamik olarak çözümlenir.Bir dependency propertynin değerini set ettiğimizde bu nesnemizin bir alanında saklanmaz onun yerine DependencyObject temel sınıfı tarafından sağlanan bir dictionary de saklanmaktadır.Bildiğiniz gibi dictionary ler key ve value dan oluşmaktadır.Giriş key dediğimiz property ismi,value ise set etmek istediğimiz değeri tanımlamaktadır.

Dependency propertylerin avantajlarından en önemlileri bellek dağıtık kullanımını azaltma,değer kalıtımı ve property değişim bildirimi olarak sıralayabiliriz.Burada değer kalıtımı dediğimiz bir dependency propertye eriştiğimizde değeri, değer çözümleme stratejisi kullanılarak çözümlenir.Eğer lokal bir değer ayarlanmamışsa,dependency property bir değer buluncaya kadar mantıksal ağaçta bir üste yönlenir.Örneğin root elementte FontWeight’i ayarlarsak root element altındaki tüm TextBlock lara bu stili override etmediğimiz sürece uygulanacaktır.

Değer Çözümleme Stratejisi

Dependency property lere her erişimimizde değeri çözümlemek için yukardan aşağıya doğru öncelik sırasını takip eder.

1.Animation

2.Binding Expression

3.Local Value

4.Custom Style Trigger

5.Custom Template Trigger

6.Custom Style Setter

7.Default Style Trigger

8.Default Style Setter

9.Inherited Value

10.Default Value 

Her WPF kontrolü static DependencyProperty sınıfına bazı dependency property leri kayıt eder.Bu propertylerin her biri tekil bir key ‘e (anahtar) ve geridönüş ve varsayılan değer içeren metadata ya sahiptir.Dependency property kullanmak isteyen tüm tipler Dependency Object sınıfından kalıtılmış olmak zorundadır.Bir dependency property’e onun .NET property wrapper üzerinden eriştiğimizde , değere erişmek için GetValue() metodunu çağırır.Bu metod değer çözümleme stratejisini kullanarak uygun değeri döndürür.

Dependency Property Tanımlama

// Dependency Property        

 public static readonly DependencyProperty HasTextProperty =  DependencyProperty.Register("HasText", typeof(bool), typeof(MainWindow), new FrameworkPropertyMetadata(false));  

//.NET Property wrapper       

 public bool HasText       

{          

      get { return (bool)GetValue(HasTextProperty); }    

      set { SetValue(HasTextProperty, value); }      

} 

Yukarıda tanımlanan dependency property ilk bakışta biraz karışık gelse de aslında çok kullanışlı ve güçlü bir yapısı vardır.Bir dependency property tanımlamak için isterseniz kısayol olarak code snippet kullanabilirsiniz.Kod tarafında propdp yazıp klavyeden  iki kere Tab tuşuna bastığınızda otomatik olarak bir dependency property tanımlanır.Buradan önemli bir nokta isimlendirmeye dikkat ettiyseniz sonu Property ile bitmektedir.Bu tanımlama için gerekli bir koşuldur.İsimlendirmenin sonuna Property kelimesi konulması gerekmektedir HasTextProperty gibi.

Her dependency property değişikliği bildirme,değeri zorlama ve doğrulama  için bir callback sağlar.

new FrameworkPropertyMetadata(false, OnHasTextPropertyChanged, OnCoerceHasTextProperty,OnValidateHasTextProperty); 

Change Notification Callback Metodu

HasTextProperty’ sinin değeri her değiştiğinde çağrılır.Yeni değer EventArgs üzerinden geçirilir.

private static void OnHasTextPropertyChanged(DependencyObject source,DependencyPropertyChangedEventArgs e) {       

     MainWindow control = source as MainWindow;         

     bool val= (bool)e.NewValue;                   

 }

Coerce Value Callback Metodu

Coerce value callback,exception fırlatmadan değerin belirlenen sınırlar içerisinde olmasını ayarlamamızı sağlar.Mesela bir progress  bar’ı ele alırsak değerinin minimum 0 ve maximum 100 arasında olması için zorlayabiliriz.Böylece exception fırlatmasını da engellemiş oluruz.Aşağıdaki örnek kodda eğer değerimiz 0 ile 100 arasında değilse değerimizi  0 olarak atıyoruz.

private static object OnCoerceHasTextProperty(DependencyObject sender, object data)      

 {       

     if (!((int)data >= 0 && (int)data<=100))            

     {          

          data = 0;  

     }        

     return data;       

}

Validation Callback Metodu

Bu metodumuzda ise set edilen değerin bizim dependency property nesnemizin tipinde olup olmadığını doğrulamamızı sağlar.Eğer false dönerse ArgumentException fırlatılır.

private static bool OnValidateHasTextProperty(object data) 

{    

    return data is bool; 

}

Gördüğünüz gibi dependency property ‘leri kısaca bu şekilde tanımlayabiliriz.Normal .NET property’ler ile arasındaki farka gözattık ve bir dependency property tanımlama konusuna giriş yapmış olduk.Umarım yararlı bir yazı olmuştur.

Kolay gelsin.

WPF-Veri Filtreleme ve Sıralama

Mayıs 03
by Abdurrahman Köken 3. Mayıs 2010 18:28

Bugün WPF’de veri filtrelemenin ve sıralamanın nasıl yapılabileceği hakkında birkaç sınıf göstermek istiyorum.Bildiğiniz gibi WPF çok güçlü bir data binding yapısına sahip.Bu sayede bir koleksiyonu bir görsele bind etmemizi mümkün kılar.Fakat sıralama ve filtreleme için ek işlemler gerekmektedir.Tam da bu noktada devreye  CollectionView sınıfı giriyor.Bu sınıf sayesinde filtreleme, sıralama ve hatta gruplama işlemlerini kolayca yapabiliriz.

Filtreleme

CollectionView nesnemizi filtrelemek için bir callback metod tanımlamalıyız.Bu metodda filtreleme işlemi yapılacaktır.Ayrıca bu metodumuzun geridönüş değeri bool olmalı ve object tipinden de parametre almalıdır.Burada unutulmaması gereken en önemli nokta filtreleme metni değiştiğinde CollectionView nesnemizin Refresh() fonksiyonunun çağırılmasıdır.Eğer çağrılmazsa nesnemiz herhangi bir değişiklik olsa bile yenilenmediği için bu değişiklikten habersiz olacaktır ve filtreleme yapmayacaktır.

IList<Employer> employers;

ICollectionView _employerView;

private string _filterString=string.Empty;

public Window1()

{

   InitializeComponent();

   //çalışanların listesini alıyoruz

   employers = GetCustomers();

   //Koleksiyonumuzu CollectionView nesnemize yüklüyoruz

   _employerView = CollectionViewSource.GetDefaultView(employers);

   //CollectionView nesnemizin filtreleme predicate ini belirtiyoruz

   _employerView.Filter = EmployerFilter;

   this.Loaded += new RoutedEventHandler(Window1_Loaded);

}

   //Callback Metodu

public bool EmployerFilter(object item)

{

   Employer employer = item as Employer;

   return employer.Name.ToLower().StartsWith(_filterString.ToLower());

}

   //Filtreleme metni property miz

public string FilterString

{

   get { return _filterString; }

   set{

    _filterString = value; 

    OnPropertyChanged("FilterString");

    _employerView.Refresh();

 }   

}

Sıralama

CollectionView sınıfı ile sıralama işlemlerini de oldukça rahat yapabilmekteyiz.İlgili nesneyi oluştururken sadece sıralamak istediğimiz property ismini ve sıralama yönünü girmemiz yeterlidir.Örneğin:

_employerView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));

Görüldüğü gibi tek satırla sıralama işlemini yapmış olduk.Bu sıralamayı Employer nesnemizdeki  Name property’sine göre artan bir şekilde yapmasını belirtmiş olduk.Örnek uygulamayı aşağıdaki linkten indirebilirsiniz.

Kolay gelsin.

Demo.zip (34,44 kb)

WPF-Kendi DataSourceProvider Kontrolümüzü Yazalım

Mart 14
by Abdurrahman Köken 14. Mart 2010 15:56

Herkese merhabalar,

Bu aralar bloğumu biraz boş bıraktığımın farkındayım.Son zamanlarda gerçekten yoğun bir tempo içindeydim.Her işin içinden bir iş daha çıkmaya başladıJHer neyse sonuna yazmayı başardım.Bu yazımda sizlere WFP için kendi DataSourceProvider larımızı nasıl oluşturabileceğimizden bahsetmek istiyorum.İşe ilk olarak bir sınıf yaratıp bu sınıfı DataSourceProvider sınıfından kalıtmak olacaktır.Şu an WPF bizlere iki adet DataSourceProvider sunmaktadır.Bunlar,

ObjectDataProvider:Projemizdeki belirli bir sınıfın herhangi bir metodunu çağırmamızı sağlar.Metod ismi ve parametreleri gibi özellikleri bulunmaktadır.

XmlDataProvider:Çeşitli XML kaynaklarından veri sağlamak için kullanılmaktadır.Aslında framework ile gelen bu iki sınıf gerçekten harika fakat kendi veri sağlayıcılarımızı nasıl yazabileceğimizi bilmeliyiz.Üstelik o kadar da çok zor bir olay değil.Hatta üç adımda bunu gerçekleştirebiliriz.

- DataSourceProvider sınıfından kalıtım almış bir sınıf oluşturmak

-BeginQuery metodunu ezmek

-Bazı noktalarda OnQueryFinished metodunu çağırmak

Bunun avantajlarından biri de  arkaplanda yükleyebilme özelliğidir.Bunu XAML  tarafında IsAsync property’sini ayarlayarak yapabilirsiniz.

class TextDataSource:DataSourceProvider   

{

   private bool isAsync = false;

   private string fileName = string.Empty; 

   public bool IsAsync

   {

     get { return isAsync; }

     set { isAsync = value; OnPropertyChanged(new PropertyChangedEventArgs("IsAsync"));}

   }                

   public string FileName

   {

     get { return fileName; }

     set{fileName = value;OnPropertyChanged(new PropertyChangedEventArgs("FileName"));}

   }

   public object ObjectInstance

   {

     get { return Data; }

     set{ OnQueryFinished(value, null, null, null);OnPropertyChanged(new PropertyChangedEventArgs("ObjectInstance"));}

   } 

   protected override void BeginQuery()

   {

      if (IsAsync)

       {

          ThreadPool.QueueUserWorkItem(RunQuery, null);

       }

      else

         RunQuery(null);

    }

    private void RunQuery(object state)

    {

       StringBuilder sb = new StringBuilder();

       base.BeginQuery();

       FileStream fs = new FileStream(FileName,FileMode.Open,FileAccess.Read);

       StreamReader rd = new StreamReader(fs,Encoding.Default);

       while(!rd.EndOfStream)

      {

        sb.Append(rd.ReadLine()+"\n");

      }

       ObjectInstance = sb;

    }

 }

 Gelelim XAML tarafında kontrolümüzü kullanmaya,

<Window.Resources>

<local:TextDataSource x:Key="myProvider" IsAsync="True" FileName="C:\Test.txt"/>

</Window.Resources>

<DockPanel>

<TextBlock Text="{Binding Mode=OneTime,Source={StaticResource myProvider}}" DockPanel.Dock="Top" HorizontalAlignment="Center" Height="30" />

</DockPanel>

Örnek uygulama:DataSourceProvider.rar (33,76 kb)

WPF Gadget Oluşturma

Kasım 15
by Abdurrahman Köken 15. Kasım 2009 03:17

Windows Vista ile hayatımıza giren ve Windows 7 ile de devam eden gadget’ları hemen hemen bilmeyen yoktur.Gadget’lar bazen küçük ama işimizi kolaylaştıran marifetleri ile gönlümüze taht kurmuş durumdalar.Şu an arama motorlarında gadget araması yaptığımızda sayısız tane karşımıza çıkacaktır.Hesap makinasından tutun da  Windows live messenger’a pek çok gadget var.Neyse asıl konumuza geri  dönelim.Bu makalemde kendi gadget’ımızı nasıl yazabileceğimizden bahsedeceğim.Hemen aklınıza sıradan bir gadget gelmesin!Kendi gadget’ımızı WPF ile geliştireceğiz.Nasıl mı? Gadget’ı xaml yada xbap ile hazırladıktan sonra  host etmek için IFrame kullanacağız.Aşağıdaki kod işimizi görür sanırım.

<html> <head>

<style>  body {    

      background:black;

      width:130;

      height:130;

      padding:5; 

         }

</style></head>

<body>

<iframe height="150"  width="125"  src="Clock.xbap"  />

</body> </html>

Hepsi bu kadar.Artık sizde WPF ile gadget geliştirebilirsiniz.Ben genellikle XBAP tercih ediyorum:)Peki  gadget’ınızı nasıl yüklenebilir bir uygulama yapabilirsiniz.En kısa yoldan yüklenebilir bir gadget dosyasını zip ya da winrar ile açın içindeki gadget ile ilgili bilgileri içeren gadget.xml dosyası üzerinde gerekli değişiklikler yaptıktan sonra WPF dosyalarını içeri kopyalayın.İşte size yüklenebilir bir gadget.

Kolay gelsin…

Tags: ,

WPF

WPF 4.0 İle Gelen Yenilikler

Kasım 02
by Abdurrahman Köken 2. Kasım 2009 14:58

Visual Studio 2010 release olduğunda WPF 4.0 ile beraber pek çok yeniliklerle karşı karşıya kalacağız.Bunlardan bazılarına bu yazımda değineceğim.En önemli gelişmelerden birisi Windows 7 entegrasyonu.Bu sayede özellikle multi-touch uygulamalar geliştirirken third party bileşenler kullanmamıza gerek kalmadan framework içine entegre edilmiş metodlarla çok daha rahat bir şekilde uygulamalar geliştirebileceğiz.Bu gelişmenin yanı sıra bir takım yeni kontroller ve grafiksel anlamda da yeni gelişmeler var.

Windows 7 Multitouch Desteği:

WPF 4.0 multi-touch girişi ve manipulasyon işlemlerini desteklemekle kalmayıp Windows 7 deki bir çok özelliği de sağlamaktadır.Yeni özellikler aşağıdaki gibidir:

  • Multi-touch Manipulation, Inertia (Pan, Zoom, Rotate) events on UIElement
  • Raw multi-touch events (Up, Move, Down) on UIElement, UIElement3D and ContentElement
  • Multiple capture supporting multiple active controls
  • ScrollViewer enhancement to support multi-touch panning
  • Touch device extensibility
  • Future Surface SDK compatibility

Windows 7 Shell Entegrasyonu:

WPF 4.0 ile gelen bir diğer yeni özellik ise Shell entegrasyonudur.Bu sayede WPF geliştiricileri uygulamalarında Windows 7 özelliklerini kullanabilirler.Shell özellikleri geliştiricilere daha zengin bir kullanıcı deneyimi sağlamaktadır.Bunlardan bazıları:

  • Jump List fonksiyonelliği
  • Taskbar Özellikleri (Progress bar,Overlay Icon,Thumbnail Buton vs.)

 

Yeni Kontroller:

WPF 4 ile bir çok yeni özelliğin yanı sıra yeni kontroller de gelecek.Bunlardan en çok bekleneni eminim DataGrid’dirJDiğer kontroller  DatePicker ve Calendar kontrolleri.Tabii ki kontroller bununla sınırlı değil.Bu kontrollerin  yanında bir de Bag O’Tricks adında  sekiz tane kontrol içeren bir koleksiyon bulunmaktadır.Bu koleksiyon şu kontrolleri içerir: AnimatingTilePanel, ColorPicker, InfoTextBox, ListPager, NumericUpDown, Reveal, TransitionsPresenter, TreeMapPanel.

Windows 7&Office Ribbon Kontrolü:

Yeni bir WPF kontrolü de Ribbon kontrolüdür.Bu kontrole pek de yabancı değiliz aslında.Windows 7’de Paint açtığınızdaen üstte gördüğünüz zengin bir toolbar göze çarpacaktır.Bu kontrol sayesinde kısa ve kolay bir biçimde işlemler gerçekleştirilebilmektedir.Şu an için WPF Ribbon kontrolü CTP aşamasındadır.Eğer isterseniz kısıtlı özellikleri olan kontrolü buradan edinebilirsiniz.WPF 4.0 release olduğunda bu özelliklerin hepsi olacaktır.Beklemekte fayda var:)

Cached  Composition:

Uygulamalarda gözle görülür bir performans elde etmek istiyorsanız WPF 4 ile gelen Cached Composition özelliğini kullanmanız gerekir.Bu özellik uygulamalara interaktif  kontrolleri,geometrik şekilleri vs. cache’lemize izin verir.Cache Composition ‘ın performansa etkisi büyüktür  çünkü GPU kullanılır.Bu da CPU’nun yükünü oldukça hafifletir.

Pixel Shader 3 Desteği:

.Net Framework 3.5 SP1 ile beraber hayatımıza giren Pixel  Shader efektlerini hepimiz biliyoruz.WPF 4  popüler shader efektlerini kullanmamızın  yanı sıra artık uygulamalarımıza PS 3.0 kullanarak efektler yazmamıza izin vermektedir.

Animation Easing Function:

WPF’ in önceki versiyonlarında da ayrık, lineer ve spline animasyonlar desteklenmekteydi.WPF 4.0 ise uygulama geliştiricilere animasyonları kullanarak akıcı behavior’lar oluşturabilmelerini sağlayan  Easing  Function’lara yeni bir konsep kazandırdı.Bu sayısız şekilde kullanılabilir.Örneğin elastik bir behavior oluşturmak ya da bi animasyona bekleme eklemek için.Tasarım araçlarında dairesel,üstel,elastik gibi easing function’lar bulunmaktadır.Genişletilebilir tasarım ayrıca geliştiricilere kendi easing functionlarını oluşturabilmelerine izin vermektedir.

WPF 4.0 ile gelecek olan yeniliklerden bazılarına değinmiş olduk. Sonraki makalelerimde diğer yeniliklere de göz atıyor olacağız.

 

Tags: ,

WPF

WPF-Design Time Data Oluşturma

Ekim 17
by Abdurrahman Köken 17. Ekim 2009 21:37

Bugün teknik bir yazı ile tekrar karşınızdayım.Biliyorum bu tür yazılar yazmayalı epey oldu:)Malum yazı yazabilmek için önce öğrenmek gerekiyor ve biraz da vakit.Önemli olan sadece yazı yazmış olmak değil gerçekten işe yarar ve ilginç yazılar yazmaktır.Neyse bu kadar geyikten sonra  teknik yazıma geçeyim:)Bugün tasarım aşamasında veri oluşturma işlemini sizlerle paylaşacağım.Makalenin sonunda aşağıdaki  resimdeki gibi bir tablo ile karşılaşacağız.

 

                                                         Tasarım Modu

Önce Visual Studio’muzda WPF projesi oluşturduktan sonra Data isminde bir klasör ekleyelim.Bu klasöre Person adında bir class ekleyelim.Bu sınıfımızın üyeleri aşağıdaki gibi olsun.

namespace DesignTime.Data

{    

 public  class Person  

 {             

      public string Name { get; set; }             

      public string Surname { get; set; }             

      public int Age { get; set; }             

      public string Gender { get; set; }   

 }

}

Person.cs sınıfımızı hazırladıktan sonra DesignTimePeople  isimli yeni bir sınıf daha ekleyelim.Bu sınıfımızı Person sınıfımızın bir listesi olarak türetelim.

namespace DesignTime.Data

{     

 public class DesignTimePeople:List<Person>     

 {

    public DesignTimePeople()             

     {           

            this.Add(new Person { Age = 12, Gender = "M", Name = "Mohinder", Surname = "Suresh" });

            this.Add(new Person { Age = 25, Gender = "M", Name = "Peter", Surname = "Petrelli" });

           this.Add(new Person { Age = 23, Gender = "F", Name = "Tracy", Surname = "Strauss" });

           this.Add(new Person { Age = 28, Gender = "M", Name = "Hiro", Surname = "Nakamura" });             

      }   

  }

}

Son olarak RunTimePeople isimli  ve List<Person> sınıfından türemiş boş bir sınıf ekliyoruz. Projemizin veri kısmını hallettik.Şimdi bu verileri tasarım aşamasında kullanalım.İlk olarak verilerimizi XAML tarafına referans olarak ekleyelim.

xmlns:local="clr-namespace:DesignTime.Data"

Bu ifadeyle Data klasörümüzü XAML tarafına referans olarak eklemiş olduk.Bundan sonra yapacağımız işlem verileri Resource olarak eklememiz gerekmektedir.

<Window.Resources>

 <local:DesignTimePeople x:Key="dtData"/>

</Window.Resources>

Geriye sadece tasarım aşamasındayken görebileceğimiz bir ListBox eklemek kaldı.

<StackPanel>

 <ListBox x:Name="text" ItemsSource="{Binding}" Margin="10"/>

  <ListBox x:Name="listbox" ItemsSource="{StaticResource dtData}">

   <ListBox.ItemTemplate>

      <DataTemplate>

      <Border CornerRadius="4" Margin="5" Padding="10" BorderThickness="2" BorderBrush="DarkOliveGreen">                   

     <StackPanel>

        <TextBlock Text="{Binding Name}"/>         

        <TextBlock Text="{Binding Surname}"/>  

                <TextBlock Text="{Binding Age}"/>                       

                <TextBlock Text="{Binding Gender}"/>

        </StackPanel>

      </Border>

   </DataTemplate>

  </ListBox.ItemTemplate>

 </ListBox>

</StackPanel>

Son olarak  Window1’in Load olayına şunları yazalım.

[Window1.xaml.cs]    

listbox.ItemsSource = new Data.RunTimePeople();

Design kısmına geldiğimizde DesignTimePeople sınıfına eklemiş olduğumuz kişileri ListBox’ta göreceğiz fakat uygulamamızı çalıştırdığımızda hiçbir veri görünmeyecektir.Çünkü ListBox’ımızın ItemSource özelliğine RunTimePeople yani boş bir sınıf atadık.Gördüüğünüz gibi o kadar da zor bişey değilmiş:)Tek yapılması gereken veriler ve bu verileri kullanabilmek için Resource’a eklemek.Bu bizim uygulamamızı tasarlarken gerçekten işimizi kolaylaştıran bir yöntemdir.

DesignTimeDemo.zip (26,31 kb)

Tags:

WPF

WPF-Enum Tiplerin Değerlerini Bağlama

Eylül 11
by Abdurrahman Köken 11. Eylül 2009 02:30

WPF uygulamalarında  mesela bir combobox’a bir enum tipin değerlerini doğrudan bağlayamayız,çünkü enum tipi  tüm değerlerini döndüren bir property’e sahip değil.İsimleri almanın tek yolu GetNames() metodunu çağırmaktır.Peki bunu XAML’da nasıl yapabiliriz derken tam bu sırada ObjectDataProvider imdadımıza yetişiyor.ObjectDataProvider bize metodun ismini ve parametrelerini belirtmemizi ve bu metodu XAML  ile çağırmamızı sağlar.   

 xmlns:sys="clr-namespace:System;assembly=mscorlib"

<Window.Resources>       

 <ObjectDataProvider x:Key="visibilityResource" MethodName="GetNames" ObjectType="{x:Type sys:Enum}">           

  <ObjectDataProvider.MethodParameters>               

   <x:TypeExtension TypeName="Visibility"/>           

  </ObjectDataProvider.MethodParameters>       

 </ObjectDataProvider>   

</Window.Resources>          

<ComboBox Height="30" Width="120" ItemsSource="{Binding Source={StaticResource visibilityResource}}" SelectedIndex="0" />

ObjectDataProvider ile enum tiplerin değerlerini kolayca listeleme kontrollerine bağlayabiliriz.

Teşekkürler.

Tags:

WPF

Abdurrahman Köken-Recent Post