Abdurrahman KÖKEN | BLOG

just a developer... | Microsoft Student Partner

WPF- Performans Arttırma Metodları #1

Şubat 23
by Abdurrahman Köken 23. Şubat 2010 16:53

Bildiğiniz gibi Visual Studio 2010 geliştirilirken Windows Presentation Foundation (WPF)  kullanıldı.Bu aslında Microsoft’un WPF’e verdiği önemi açıkca ortaya koymaktadır.Geçtiğimiz günlerde Visual  Studio 2010 RC yayınlandı.Sistemine yükleyenler Beta sürümünden sonra RC’deki performans artışının farkına varmışlardır.

 

Peki bir WPF uygulaması geliştirirken iyi bir performans istiyorsanız dikkat etmeniz gereken birkaç püf nokta bulunmaktadır:

·Oluşturulan görselliği azaltmak için Template’inizi basitleştirin.

·ItemsPanel olarak VirtualizingStackPanel kullanın.

·VirtualizingStackPanel.IsVirtualizing property’sini True olarak ayarlayın.

·Her seferinde referans olarak alınan kaynakları tekrar yüklemek yerine.

·Tanımlamış olduğunuz bir property’de değişiklik yapmaya gerek yoksa PresentationOptions:Freeze="True" olarak ayarlayın.

·Resource kullanımında da her seferinde tekrar kaynakların yüklenmesini engellemek için Resource Dictionary kullanın.

Snoop-Visual Studio 2010 Algılama Sorunu

Şubat 07
by Abdurrahman Köken 7. Şubat 2010 16:36
Eğer siz de  benim gibi büyük WPF uygulamaların nasıl yapıldığını merak ettiyseniz Visual Studio 2010 Beta 2’nin görsel ağaç yapısını incelemek için Pete Blois tarafından geliştirilen Snoop programını denemişsinizdir.Eğer denediyseniz Snoop’un Visual Studio 2010’nu algılayamadığını da farketmişsinizdir.Bu sorunun tam olarak neden kaynaklandığından emin değildim bu yüzden Snoop programının kaynak kodlarını indirdim ve kodlara biraz göz attım.Algılama sorununa sebep olan satır IsValidProcess property’siydi.

 

Sisteminizde ister VS2008 ister VS2010 çalıştırın farkettiyseniz proseslerde ikisi de devenv  olarak geçmektedir.Biz hangisi olduğunu oradaki açıklama kısmında görüyoruz sadece.Bu yüzden IsValidProcess property’sine devenv geldiğinde otomatikman false olarak atanıyor.Bizim burada yapmamız gereken eğer devenv VS2008 ise false olmasıdır.Property kodlarına şu satırları eklediğimizde artık sorunumuz ortadan kalkacaktır.

if (process.Id == Process.GetCurrentProcess().Id)

  isValid = false;

else if (process.MainWindowHandle == IntPtr.Zero)

  isValid = false;

else if (process.ProcessName.Contains("devenv")&& process.MainModule.FileVersionInfo.FileDescription.Contains("2008")){  isValid = false;} 

else{

 foreach (ProcessModule module in process.Modules){

    if (module.ModuleName.Contains("PresentationFramework.dll") ||module.ModuleName.Contains("PresentationFramework.ni.dll")){

      isValid = true;break;}}}

Yukarıdaki kırmızı ile yazılmış kod satırını yazdıktan sonra eğer çalışan proses VS2008 ise isValid’i false döndrüüyoruz.Uygulamayı çalıştırdığımızda artık Visual Studio 2010’u algıladığını görebilirsiniz.

 

 

 

 

 

 

 

 

İsterseniz uygulamanın benim tarafımdan düzenlenmiş halinin setup dosyasını buradan indirebilirsiniz.Kolay gelsin.

WPF 4.0-LayoutRounding Özelliği

Ocak 02
by Abdurrahman Köken 2. Ocak 2010 15:14

Bugün yeni yılın ilk makalesi olarak sizlerle WPF 4 ile gelen yeni bir property olan LayoutRounding özelliğinden bahsetmek istiyorum.Silverlight ile kod yazanların yakından aşina olduğu bu özelliği aşağıdaki örnek kod üzerinden inceleyelim.

<Border Width="150" Height="120" BorderThickness="10" BorderBrush="Red"/>

<Border Width="110" Height="80" BorderThickness="10" BorderBrush="Green"/>

<Border Width="70" Height="40" BorderThickness="10" BorderBrush="Blue"/>

 <Border Width="150" Height="120" BorderThickness="10" BorderBrush="Red" UseLayoutRounding="True"/>

<Border Width="110" Height="80" BorderThickness="10" BorderBrush="Green" UseLayoutRounding="True"/>

<Border Width="70" Height="40" BorderThickness="10" BorderBrush="Blue" UseLayoutRounding="True"/> 

Yukarıdaki kod parçası ile içiçe geçmiş dikdörtgenlerden oluşan border lar bulunmaktadır.Tek fark ikincisinde UseLayoutRounding property’sidir.Bu property’i true olarak atayıp uygulamamızı çalıştırdığımızda ilk border’ın biraz blur şekilde göründüğünü ikincisinin ise daha keskin çizgilere sahip olduğunu farkedeceksiniz.Varsayılan olarak bu özellik false gelmektedir.Uygulamayı çalıştırdığımızdaki ekran görüntüsü şu şekilde olacaktır.

 

WPF 4.0-SelectionBrush ve CaretBrush Özellikleri

Aralık 14
by Abdurrahman Köken 14. Aralık 2009 23:05

Bugün WPF 4’ün yeniliklerinden biri olan caret ve selection renginin nasıl değiştirilebildiğinden bahsetmek istiyorum.WPF 4  ile bunları sağlamak için iki tane özellik gelmektedir.

·  SelectionBrush

·  CaretBrush

Bu özelliklerin kullanımını bir örnekte görelim

<StackPanel Orientation="Horizontal">

  <TextBox SelectionBrush="Yellow" SelectionOpacity="0.5" Text="SelectionBrush Color Yellow" CaretBrush="Blue"/>

  <TextBox SelectionBrush="Red" SelectionOpacity="0.5" Text="SelectionBrush Color Red" CaretBrush="DarkMagenta"/>

</StackPanel>

 

Uygulamayı çalıştırıp yazılı metni seçtiğimizde aşağıdaki gibi bir görüntüyle karşılaşırız.

 

Örnekte iki property’nin de nasıl kullanıldığı gösterilmektedir.Bu iki property’lerin yanı sıra bir de SelectionOpacity isimli  bir property’miz bulunmaktadır.Bu da seçim renginin saydamlığını ayarlamak için kullanılmaktadır.(Varsayılan olarak değeri 0.6’dır).Bu propertyleri sadece selection ve caret a izin veren kontrollerde kullanılabilmektedir.

Tags:

WPF

WPF 4.0-Text Formatting Mode Özelliği

Aralık 09
by Abdurrahman Köken 9. Aralık 2009 02:39

WPF 3.0 çıktığından beri göze çarpan ve WPF 4.0 ile düzeltilen bir sorundan bahsetmek istiyorum.WPF’in önceki versiyonlarında  text’lerin font büyüklüğünü küçülttüğümüzde güzel bir şekilde render edilemediğini farketmişsinizdir.WPF 4.0 ile bu sorun da giderilmiş.Bunun için TextFormattingMode adında yeni bir Property eklenmiş.Varsayılan olarak bu özellik “Ideal “ olarak gelmektedir.Eğer küçük font kullanıyorsanız bu özelliği “Display” olarak değiştirin ve farkı görün. 

<StackPanel>

 <TextBox TextOptions.TextFormattingMode="Ideal" FontSize="12">DENEME</TextBox>   

 <TextBox TextOptions.TextFormattingMode="Display" FontSize="12">DENEME</TextBox>   

 <Label TextOptions.TextFormattingMode="Ideal" FontSize="15">DENEME</Label>   

 <Label TextOptions.TextFormattingMode="Display" FontSize="15">DENEME</Label> 

</StackPanel> 

Tags:

WPF

WPF Uygulamalarına Jumplist Ekleme

Kasım 20
by Abdurrahman Köken 20. Kasım 2009 00:56

Windows 7 ile gelen bir özellik olan Jumlist’i hepiniz duymuşsunuzdur.Gerçekten işimizi kolaylaştırmayı hedefleyen hoş bir özellik aslına bakarsanız benim favorilerim arasında:)Mesele Media Player ikonuna sağ tıkladığımızda en son dinlediğimiz şarkıları göstermesi,aynı ikonun üzerine gelince play/pause butonlarının olması ya da Visual Studio’da sağ tıkladığımızda en son yaptığımız projelerin listesini Jumplist sayesinde görmekteyiz.

   

Ben de bugün WPF uygulamalarına nasıl jumplist özelliği eklenebildiğinden bahsedeceğim.Tabii bu uygulamayı yapabilmek için en başta Windows 7 yüklü bir sistem ve .NET Framework 4.0 gerekmektedir.Bunların sistemde yüklü olduğunu varsayarak demoya başlıyorum.Kısaca yapacağımız demodan bahsedeyim.Uygulamamızı çalıştırdığımızda taskbarda çıkan ikona sağ tıkladığımızda notepad ve MSN Messenger programlarımızı açabileceğimiz iki tane task koyacağız.Ön izleme alanında ise uygulamamızdaki TextBox’ta seçili alanı kopyalayan bir task oluşturacağız.

     JumpList jumplist = new JumpList(); 

         JumpList.SetJumpList(Application.Current,jumplist);

         JumpTask task = new JumpTask(); 

         task.Title = "NotePad";

         task.CustomCategory = "Programlar";

         task.ApplicationPath = "notepad.exe";

         task.IconResourcePath = AppDomain.CurrentDomain.BaseDirectory + "Images\\Icon.ico"; 

Uygulamamızın Load olduğunda önce bir JumpList oluşturuyoruz ve uygulamamıza entegre olması için SetJumpList metodunu kullanıyoruz.Ardından bir JumpTask yaratarak task tanımlıyoruz ve bu task ile ilgili bilgileri atıyoruz.ApplicationPath özelliği bizim çalıştırmak istediğimiz uygulamanın yoludur.CustomCategory  de eğer farklı işlemler gerçekleştiren taskler varsa bunları gruplar halinde gösterir.Şimdi bu jumplisti uygulamamız gerekmektedir.Bunu da aşağıdaki gibi yapabiliriz.

       jumplist.JumpItems.Add(task);

       jumplist.Apply();

Ön izleme kısmını ise XAML tarafında yapmaktayız.Formumuza bir textbox ekledikten sonra taskbar şu şekilde oluşturulmaktadır.

<Window.TaskbarItemInfo>

 <TaskbarItemInfo Overlay="Images/win7.jpg"> 

  <TaskbarItemInfo.ThumbButtonInfos>

   <ThumbButtonInfo Command="Copy"   CommandTarget="{Binding ElementName=textbox1}"  Description="Textbox'daki seçili alanı kopyalar"   DismissWhenClicked="False"                        ImageSource="Images/copy.png" />

  </TaskbarItemInfo.ThumbButtonInfos>

 </TaskbarItemInfo>

</Window.TaskbarItemInfo> 

Overlay ikon uygulama çalıştığında uygulamamızın taskbarda görünen ikonunun sağ tarafında görünen resimdir.Ön izleme de çıkan butonları da <TaskbarItemInfo.ThumbButtonInfos/> tagını kullanarak oluşturmaktayız.DismissWhenClicked property’si ise ön izleme alanındaki butona tıklandığında ön izleme ekranının kapanıp kapanmamasını ayarlamamızı sağlar.Uygulamayı çalıştırdığımızda aşağıdaki gibi bir screenshot ile karşılaşacağız. 

Artık WPF uygulamalarımıza API’leri kullanarak kolayca jumplist özelliği ekleyebilirsiniz.Demo uygulamayı aşağıdan indirebilirsiniz.

JumpListApp.zip (2,96 mb)

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