MultiThread birden fazla işlemi beraber yürütme işlemine denebilir. Multithreadin önemi şurda doğar, işlemlerimiz yürürken programımız bize o işlemi hisettirmesin (programızı işleten ana iş parcacığından farklı bir iş parcacığı bu işlemi yürütsün) istiyorsak multithread işlemlere ihtiyacımız olacaktır.

WPF elemanları bir thread tarafından oluşturulur (ana threadimzi olur bu ) ve bu thread tarafından sahiplenilir. Diğer threadler bu elemanlara ulaşamaz.(Ekranda gördüğümüz elemanlar ). wpf elemanlarının “Dispatcher” propertysi ile sahibi olan Thread’e ulaşıp ona Invoke metodunu kullanarak iş yaptırabiliyoruz. ilk önce Dispatcherin kök sınıftan geldiğini söylemeliyim ki her elemanda Disparchera ulaşabileceğimizi bilelim. Hiyerarşide  bunu göreibliyoruz.

Not : Abstract Classların köşeleri oval olarak eklenmiştir.

Dispatcherobjelerin Dispatcher propertsi bizi threade ulaştırabiliyor. threadler için aracı fonksiyonlar oluşturmak da gayet basit oldğuna göre. bir threade ulaşıp ona yaptırmak istediğimiz işlemi delegate ile verebilirz.

Örnek bir Thread yazıp bu Threadin bir listboxa eleman eklemesini sağlamaya çalışalım

0
1
2
3
4
5
6
private void ListBoxDoldur(){
for (int i = 0; i < 500; i++)
                {
                    listBox1.Items.Add(String.Format("{0} Nolu Elaman", i));
                    Thread.Sleep(100);
                }
}

bu metodu çağırırsak işlem bitene kadar programımız bize yanıt vermeyecektir. şimdi bu metodu yeni bir thread ile çağıralım.

0
   new Thread(ListBoxDoldur).Start();

bu işlem eleman eklerken bize şoyle bir hata verdirecektir.
“Başka bir iş parçacığına ait olduğundan çağıran iş parçacığı bu nesneye erişemiyor.”

Eleman eklemeye çalışan iş parcacığı ListBox’un sahini olmadığından bu işlemi gerçekleştiremeyecektir.

delegate Orneği ;

0
1
2
3
4
5
6
7
8
9
10
private void ListBoxDoldur(){
for (int i = 0; i < 500; i++)
                {
                    listBox1.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                    (ThreadStart)delegate()
                {
                    listBox1.Items.Add(currentUser.Name);
                });
                    Thread.Sleep(100);
                }
}

listBox1 elemanının threadini alıp ona isimsiz bir fonksiyon gonderdik ve o işi yapmasını soyledik. şimdi hatasız bir şeilde 500 elemanı programımızı dondurmadan ekleyebildik.

bir sonraki örneğimiz multithread bir chat server olacaktır. iyi çalışmalar.

WPF ‘e has bu şahane çekirdek object  DependencyObject.  DoubleAnimation iile etkilenebilen propertyler içerir bunlar da DependencyProperty örnek olarak OpacityProperty  için Window  objesinde çalışmıştım. şimdi  DependencyProperty sınıfındaki staticler arasında bulamadığımız propertyleri kendimiz register edip kullanıcaz.  

DependencyProperty  winColor = DependencyProperty.Register(“winColor”, this.Width.GetType(), this.GetType(), new PropertyMetadata(new PropertyChangedCallback(callit)));   

 

a winColor adında bir DependencyProperty oluşturduk. adını . tipini property iyesinin tipini ve bu  değeri uygulayacak callbacki belirttik. şimdi callit fonksiyonuyumuxu tanımlayalım. 

privatevoid callit(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
Array BrushArray = Enum.GetValues(typeof(Brushes));
int brushOrder=(int)Math.Floor((double)e.NewValue) % (BrushArray.Length-1);
(Window)sender).Background = (Brush)BrushArray.GetValue(brushOrder);

 

bu fonksiyonumuza DependencyObject ve DependencyPropertyChangedEventArgs referansları geliyor event değişkenimizde  newValue ve oldValue değerleri duruyor bunlar üzerine de bir çalışma yapmak istersek işimize yarayacaktır. şimdilik sadece newValu  atamak olacak  işimiz. 

değiştiren callbackimiz de musaitse artık bu property için anmiation tanımayabilirz.

DoubleAnimation animeBack = new DoubleAnimation(0,100,new Duration(TimeSpan.FromMilliseconds(10000)));
animeBack.RepeatBehavior =
RepeatBehavior.Forever;
this.BeginAnimation(winColor,animeBack);
 

dependencyproperty kütüphanesi hazırlıyorum yararlı olacak inş şimdilik bu kadar yeter.iyi çalışmalar…

merhaba arkadaşlar bugün wpf ile yazmaya devam ettiğim programıma kapanış penceresi ekledim  klasik   “kapatmak istediğinizden emin misinz ?”  diyaloglarından farklı birşey olmasını istedim. ilk önce görüntüsünü sonra da geri sayan kodları vermek istiyorum. 2 tane animasyon türeticez biri Opaklık için diğeri boyut için bunları isterseniz tek storyboard içine toplayabilirsiniz ama sadece 2 tane olduğu için ben tek tek yazıyorum

DoubleAnimations

0
1
 goster = new DoubleAnimation(0, 1, new Duration(new TimeSpan(0, 0, 0, 0, 500))); 
 buyut = new DoubleAnimation(1, 150, new Duration(new TimeSpan(0, 0, 0, 0, 500)));

Timer

0
1
2
3
4
5
private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            closeTimer.Tick += closeTimer_Tick;
            closeTimer.Interval = 1000;
            closeTimer.Enabled = true;
        }

Timer Tick

0
1
2
3
4
5
6
7
8
9
10
11
label1.BeginAnimation(System.Windows.Controls.Label.OpacityProperty, goster);
            label1.BeginAnimation(System.Windows.Controls.Label.FontSizeProperty, buyut);
            if (Convert.ToInt32(label1.Content) > 0)
            {
                label1.Content = (Convert.ToInt32(label1.Content) - 1).ToString();
                closeTimer.Enabled = true;
            }
            else
            {
                anaForm.CloseClosed = true;
                Close();
            }

bir grid için en çok ihtiyacımız olacak şeylerden biri template özelliği. cell ve header template dışında pek kullanmadım – ki bunlar her işinizi de görmeye yetiyor. xaml en güzel yani tüm elemanları iç içe yazıp değerlerini birbirine bind edebilmemizdir. ver oluşan eleman için kendisine özel eventlar yazabilmemizdir. bu özellikleri kullanarak template özelliğini kullanmaya çalışıcaz. 

ilk önce style tanımlamayı da gösterbilmek için stylelerle yapacağım.  header stilimizi için 

<Window.Resources>
<Style x:Key=”headerStyle” TargetType=”{x:Type TextBlock}”>
<Setter Property=”FontFamily” Value=”Trebuchet MS” />
<Setter Property=”FontSize” Value=”25″ />
<Setter Property=”FontWeight” Value=”Bold” />
<Setter Property=”Foreground” Value=”#FFFFFF” />
<Setter Property=”Height” Value=”30″/>
</Style>
</Window.Resources> 

template için genelde TextBlock kullanıyorum aradığım bir cok ozelliğe sahip. tek kötü yanı direk Font türünden bir değer alamaması, ama bu sadece cs tarafında tempalte oluştururken sıkıntı yaratır xaml tarafında herşe tozpembe (: 

stilimizden de anlaşılacağı gibi 24 px büyüklüğünde yazı Kalın beyaz renkli ve Trubecthes MS  tipinde . kendi yüksekliği de 30 px . genişliği vermediğimiz sürece yazının , uzunluk ve wordwrap değerlerine göre genişlik alabiliyor. yine yükseklik de boyle. işte bunun için Textblock tercih ediyorum. 

gridimizi 1 tane gridColumn elemanı ile göstermek istiyorum. 

<dxg:GridColumn FieldName=”HASTA_ADI” Width=”300″>
<dxg:GridColumn.HeaderTemplate>
 <DataTemplate>
 <TextBlock Style=”{StaticResource headerStyle}” Text=”Hasta Ad” FontSize=”15″ FontWeight=”Bold” />
 </DataTemplate>
 </dxg:GridColumn.HeaderTemplate>
 <dxg:GridColumn.CellTemplate>
 <DataTemplate>
 <TextBlock Text=”{Binding Path=Value}” Padding=”5″ FontSize=”25″ FontWeight=”700″ VerticalAlignment=”Center” FontFamily=”Tahoma” Foreground=”Black” />
 </DataTemplate>
 </dxg:GridColumn.CellTemplate>
 </dxg:GridColumn>

 her template propertysi Data template alır biz de datatempalte oluştuup iine textblock attık ve style olarak  resourcelarımız arasından headerStyle seçtik.  bununla beraber aynı sütuna bir de CellTemplate attık celltemplate de gridin içeriği için geçerli olan görüntü kalıbıdır. bunu style dan değil de  tek sutun için elle propertyleri kullanarak yazdırdım.  bizde sütun değeri her zaman Value değeriyle gelir. biliyorsunuz C#ta setter fonksiyonlarda Value bir sabittir.  Text=”{Binding Path=Value}”   Text propertysi için Value alanını bind ettik. ee her hücereye ayrı tempalte istiyorsak ya da duruma göre template istiyorsak napıcaz ? işte orda da imdadımıza eventlar koşuyor (: initialize eventi ile sender i TextBlock türüyle cast edip istediğimiz fonksiyonlarıyla oynayabilirz. iyi çalışmalar

© 2012 Tufan Suffusion theme by Sayontan Sinha