Abdurrahman KÖKEN | BLOG

just a developer... | Microsoft Student Partner

WPF-Nümerik TextBox Attached Property Oluşturma

Ağustos 21
by Abdurrahman Köken 21. Ağustos 2010 01:33
Attached property’ler bildiğiniz gibi dependency property’lerin özelleşmiş bir tipidir.Daha önceki makalelerimde attached property ve dependency property’lerden bahsetmiştim.Bugün bu konuyu daha iyi anlamak için örnek bir attached property yazacağız.Property’miz bir TextBox’a sadece rakam girilmesini sağlayacak yani nümerik TextBox özelliği sağlayacak.Burada yapacağımız en önemli iki hamle ilk olarak clipboard da bulunan verinin TextBox’a yapıştırılmasını engellemek.Burada engellememizin amacı o veriyi inceleyip içinde rakamdan başka veriler olma ihtimalidir.Veriyi inceleyip komutun çalışıp çalışmamasını sağlamalıyız.

Son hamlemiz ise TextBox’a her bir  veri girişini yakalayıp rakam olup olmadığını kontrol etmemiz gerekmektedir.Önceki makalelerimde de belirttiğim gibi attached property ler farklı sınıflarda bulunmaktadırlar.Öncelikle NumericTextBox adında bir sınıf oluşturuyorum ve bu sınıfta boolean tipinde IsEnabled adında bir attached property tanımlıyorum. UIPropertyMetadata’sında varsayılan değerini false olarak atayıp değer her değiştiğindeki olayı yakalamak için aşağıdaki gibi OnIsEnabledPropertyChanged adında bir static metot yazıyorum:

public static void OnIsEnabledPropertyChanged(DependencyObject sender,DependencyPropertyChangedEventArgs e)
 {
   TextBoxBase txtBox = sender as TextBoxBase;
   txtBox.PreviewKeyDown -= OnKeyDown;
   DataObject.RemovePastingHandler(txtBox, OnClipboardPaste);
   if ((bool)e.NewValue)
    {
      txtBox.PreviewKeyDown += OnKeyDown;
      DataObject.AddPastingHandler(txtBox, OnClipboardPaste);
    }
  }

 

Burada ilgili TextBox’ın OnKeyDown ve clipboard yapıştırma olay tutucusu siliniyor.Çünkü sadece attached property’miz true olduğu sürece rakam kontrolünü yapması gerekiyor.OnClipboardPaste event handler’ında  clipboard’daki bulunan veriyi alıp içinde tüm verinin rakam olup olmadığını kontrol etmeliyiz.Eğer harf ya da alfanümerik  karakterler varsa komutun çalışmasını engellemeliyiz:

private static void OnClipboardPaste(object sender,DataObjectPastingEventArgs e)
   {
       string text = e.SourceDataObject.GetData(e.FormatToApply) as string;
       if (!string.IsNullOrEmpty(text))
        {
           if (text.Count(p=>!Char.IsNumber(p))==0)
             {
                return;
             }
        }
       e.CancelCommand();
   }

OnKeyDown event handler’ında ise Enter,CTRL ve Shift gibi bazı özel karakterler ve rakamlar haricinde TextBox’a veri girişini e.Handled özelliğini true yaparak engellemeliyiz.Son olarak yazdığımız attached property’i kullanabilmek için sınıfımızı XAML tarafında isim uzayına eklemeliyiz.Daha sonra aşağıdaki gibi property’mizi set edebiliriz.

<TextBox Width="180" local:NumericTextBox.IsEnabled="True"/> 

Uygulamanın kaynak kodlarına aşağıdaki linkten ulaşabilirsiniz.

Teşekkürler. 

Kaynak Kod-NumericTextBox.zip (37,54 kb)

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-Ribbon Kontrolü RTW Versiyonu Yayınlandı

Ağustos 08
by Abdurrahman Köken 8. Ağustos 2010 13:03

Geçtiğimiz günlerde Microsoft Ribbon‘ın Temmuz sürümü yayınlandı.Ribbon kontrolünün yeni sürümü WPF 3.5 SP1 ve WPF 4 ile uyumlu hale getirilmiş.En önemli özelliği ise tamamen WPF implementasyonunun olmasıdır yani bir  wrapper değil.Bu da yeni ribbon kontrolü için WPF’in tüm stil yeteneklerini uygulayabiliriz demek oluyor.Ayrıca Ribbon Installer kurduktan sonra Visual Studio ve Expression Blend için  de “WPF Ribbon Application” adında yeni bir şablon oluşturmaktadır.Ne yazık ki bu proje şablonu Visual Studio’nun Express sürümlerini desteklememektedir.Bu şablon başlangıç için basit bir Ribbon kontrolü içermektedir.Aşağıda Ribbon projesi oluşturulup çalıştırıldığında varsayılan olarak gelen kontrolün ekran görüntüsünü bulabilirsiniz.

 

 

Özellik olarak da RibbonButton’ların ICommand  desteklediğini de belirtmek istiyorum.Rahatlıkla MVVM ile geliştirdiğiniz uygulamalarınızda kullanabilirsiniz.Son olarak Visual Studio ve Expression Blend için design-time desteği de bulunmakta.Ücretsiz Ribbon kontrolünü  buradan indirebilirsiniz.Kolay gelsin.

 

WPF Browser Uygulamalarında Referans Site Bulma

Ağustos 04
by Abdurrahman Köken 4. Ağustos 2010 12:40

Bu yazımda kısaca bir WPF Browser uygulamasında o an bulunulan sayfaya hangi sayfadan gelindiğini nasıl öğrenebileceğimizden bahsetmek istiyorum.Özetle yapmamız gerekenler öncelikle uygulamamızdaki ilk sayfadan sonraki sayfaya gitmemiz navigasyon yapmamız gerekiyor.Daha sonra diğer sayfaya yönlenmeden önce  navigasyon yapılan sayfanın adresi alınarak bir property sayesinde enkapsüle edilmiştir.İşte bu property’yi de her sayfadan ulaşabilmek için App.xaml.cs de tanımlamalıyız.Kaynak kodlar ise oldukça basit ve anlaşılırdır:

 

App.xaml.cs   

public partial class App : Application   

{       

private static Uri referrer;

   //Gelinen sayfanın ismini tutan propoperty.       

public static Uri Referrer        

{   

get{return referrer;}       

}        

//Bir adrese navigasyon yapılırkenki durumu yakalayarak adresi alıyoruz.       

protected override void OnNavigating(NavigatingCancelEventArgs e)       

{           

 base.OnNavigating(e);            

 referrer = null;           

 if (e.Navigator is NavigationWindow)           

  {               

      referrer = ((NavigationWindow)e.Navigator).CurrentSource;

  }           

 else if (e.Navigator is Frame)           

  {               

     referrer = ((Frame)e.Navigator).CurrentSource;           

   } }       

protected override void OnNavigationStopped(NavigationEventArgs e)       

{           

  base.OnNavigationStopped(e);           

  referrer = null;       

} 

}

Page2 sayfasına yönlenmek için Page1 sayfamıza bir düğme yerleştirerek Click olayına  tek satırlık bir kod yazmamız gerekli:

Page1.xaml

private void Button_Click(object sender, RoutedEventArgs e)       

{           

   //Navigation servis kullanılarak Page2 isimli sayfaya yönlendiriliyor.           

  this.NavigationService.Navigate(new Uri("Page2.xaml", UriKind.Relative));       

}

Son olarak Page2.xaml sayfamıza bir etiket yerleştirerek hangi  sayfadan yönlendirilidğini yazdırmak için sayfamızın Load olayına:

Page2.xaml

txtRefered.Text = "Gelinilen sayfa:" + App.Referrer.OriginalString;

Kolay gelsin. 

Kaynak kod.zip (35,65 kb)

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-Performans Arttırma Metodları #2

Mart 01
by Abdurrahman Köken 1. Mart 2010 22:25

WFP uygulamalarında performansı arttırma yöntemleri makalemin ikinci kısmından bahsedicem.Uygulama geliştirirken bu önemli noktaları göz önünde bulundurursanız çok daha iyi sonuçlar elde edebilirsiniz.

1.Gereksiz layout geçişlerini azaltın

2.Shape objeleri  yerine Drawing kullanın

3.Geometrik şekiller için PathGeometry’e alternatif olarak StreamGeometry kullanın 

4.Şekil,resim ya da text’leri render etmek için DrawingVisual kullanın

 

5.Bir resmin thumbnail’ine ihtiyacınız varsa ,boyutunu küçülterek kullanın

6.Belleği korumak ve performansı arttırmak için CachingHint’i olabildiğince ayarlayın

7. Brush kullanmak performans için kritik bir durum. ImageBrush ya da SolidColorBrushın yeterli olduğu durumlarda VisualBrush veya  DrawingBrush kullanmayın.Kolay gelsin. 

Kaynak:MSDN

Abdurrahman Köken-Recent Post