2016-03-29 17 views
0

böyle tanımlanan bir WPF TreeView denetimi vardır: ByDaraltılmış olay harekete TreeViewItem

private List<object> SamplesExpandedTags = new List<object>(); 

private void stag_Collapsed(object sender, RoutedEventArgs e) 
{ 
    object tag = (sender as TreeViewItem).Tag; 
    if (SamplesExpandedTags.Contains(tag)) 
     SamplesExpandedTags.Remove(tag); 
} 

private void stag_Expanded(object sender, RoutedEventArgs e) 
{ 
    object tag = (sender as TreeViewItem).Tag; 
    if (!SamplesExpandedTags.Contains(tag)) 
     SamplesExpandedTags.Add(tag); 
} 

... 

// Items are created in code behind, not using binding to DataSource 
TreeViewItem item = new TreeViewItem(); 
item.Header = tv.NazevTypuVyrobku; 
item.Tag = string.Format("TV{0}",tv.TypVyrobkuID); 
item.Expanded += new RoutedEventHandler(stag_Expanded); 
item.Collapsed += new RoutedEventHandler(stag_Collapsed); 

:

<TreeView x:Name="samplesTree" MouseDoubleClick="samplesTree_MouseDoubleClick" 
      KeyUp="samplesTree_KeyUp" 
      SelectedItemChanged="samplesTree_SelectedItemChanged" 
      IsVisibleChanged="treeView_IsVisibleChanged"> 
</TreeView> 

Ben düğümler bu kodu kullanarak genişletilmiş veya daraltılmış edilmiş olanların izlemek Hata ayıklama, çocuk düğümünde daraltılırken, ayrıca ana düğüm yangınlarının da Collapsed olayı, yani gerçekte daraltılmış düğümün üst öğelerinin tüm zinciri için stag_Collapsed çalıştırılması olduğunu buldum.

Ben stag_Collapsed yöntemin başında bu kodu ekledik:

if ((sender as TreeViewItem).IsExpanded) return; 

Şimdi kod olması gerektiği gibi çalışır, ama neden tüm üst TreeViewItems ve aslında TreeViewItem üzerinde sadece Daraltılmış olay yangınları çöktü? IsExpanded özelliğinin göndericiden false olduğunu umuyorum.


önerilen çözüm ayarlamak için:

e.Handled = true; 

kurşun geçirmez değildir, bu kodun başlangıcı:

subitem.Expanded += new RoutedEventHandler(sampleOperation_Expanded); 
subitem.Expanded += new RoutedEventHandler(stag_Expanded); 
subitem.Collapsed += new RoutedEventHandler(stag_Collapsed); 

:

subitem.Expanded += new RoutedEventHandler(stag_Expanded); 
subitem.Expanded += new RoutedEventHandler(sampleOperation_Expanded); 
subitem.Collapsed += new RoutedEventHandler(stag_Collapsed); 

sonra farklı bu kodu çalışıyor İlk durumda sampleOperation_Expanded, e.Handled = true; komutuyla çalıştırılmıyor. that order of event handler execution'un akla uygun olmadığını düşündüm?

cevap

3

Belki de e.Handled değerini stag_Collapsed() yönteminizde true olarak ayarlamayı deneyin. MSDN uyarınca, "Ele alınan olayın işaretlenmesi, yönlendirilen olayın görünürlüğünü olay yolu boyunca dinleyicilere sınırlandıracaktır".

private void stag_Collapsed(object sender, RoutedEventArgs e) 
{ 
    object tag = (sender as TreeViewItem).Tag; 
    if (SamplesExpandedTags.Contains(tag)) 
     SamplesExpandedTags.Remove(tag); 
    e.Handled = true; 
} 
+0

Bu bir [Yönlendirilmiş Etkinlik] (https://msdn.microsoft.com/en-us/library/ms742806 (v = vs.100) .aspx) (yöntem imzası dolayısıyla 'RoutedEventArgs'). Bu, çalışma zamanında yapmak için ihtiyacınız olan her şey, yanlış bir bağlamda başka bir şey yapar ve farklı yanlış bağlamlarda birkaç kez daha yapar. –

+0

@EdPlunkett belgelenmiş bir yerde mi? –

+1

@ VojtěchDohnal Yukarıda bağladığım [MSDN Yönlendirilmiş Olaylara Genel Bakış] (https://msdn.microsoft.com/en-us/library/ms742806 (v = vs.100) .aspx) var. Özel sorunuzun en önemli noktası iCode'un cevabıdır: Olay elemanın üzerine, sonra ebeveyne, sonra ebeveyne, yani görsel ağacın köküne, yani UNTIL'in birisine "e.Handled = true" yazacaktır. Sonra durur. Böylece işleyicinizin 'e.Handled = true' ayarlanması gerekiyor. –

İlgili konular