2012-02-08 33 views
1

我有以下幾段代碼應該創建一棵樹。當它被徘徊時,該樹的每個項目都應該改變它的背景。如何防止WPF TreeView在多個項目上引發MouseEnter?

XAML:

<TreeView Name="treeView"> 
    <TreeViewItem Header="Item 1" IsExpanded="True"> 
     <TreeViewItem Header="Item 1.1" IsExpanded="True"> 
      <TreeViewItem Header="Item 1.1.1"/> 
      <TreeViewItem Header="Item 1.1.1"/> 
     </TreeViewItem> 
     <TreeViewItem Header="Item 1.2"/> 
    </TreeViewItem> 
</TreeView> 

C#代碼隱藏:

class MainWindow : Window 
{ 
    // ... 

    private void SetEventHandlersOn(ItemCollection items) 
    { 
     foreach (TreeViewItem item in items) 
     { 
      item.MouseEnter += ItemMouseEnter; 
      item.MouseLeave += ItemMouseLeave; 
      SetEventHandlersOn(item.Items); 
     } 
    } 

    private void ItemMouseEnter(object sender, MouseEventArgs e) 
    { 
     var treeViewItem = sender as TreeViewItem; 
     treeViewItem.Background = Brushes.LimeGreen; 
     e.Handled = true; 
    } 

    private void ItemMouseLeave(object sender, MouseEventArgs e) 
    { 
     var treeViewItem = sender as TreeViewItem; 
     treeViewItem.Background = Brushes.White; 
     e.Handled = true; 
    } 
} 

而不是做什麼,我需要的樹似乎有所不同。 當我懸停一個項目時,它變得突出顯示,但其父項也出於某種原因突出顯示。

enter image description here

我該如何解決這個問題呢?

UPD1我看到,我的問題是非常相似的問題描述here,但我還沒有明白如何應用的解決方案。

+0

實質上,您需要爲TreeViewItem提供IsMouseOver樣式的觸發器。這裏有一個鏈接:http://stackoverflow.com/questions/1131161/how-can-i-make-wpf-trigger-for-ismouseover-on-treeviewitem-not-affect-all-parent – Josh 2012-02-08 18:35:32

+0

@Josh,說實話我應該說我還沒有嘗試過。我會做的。它可能有幫助。 但是你有沒有關於沒有觸發器和樣式的解決方案的想法?有趣的是,我怎樣才能防止事件發生在父項上。 – 2012-02-08 18:36:53

+0

這只是WPF的標準行爲,雖然我不知道爲什麼。如果您進一步關注該StackOverflow鏈接並點擊第一個答案中的鏈接,您將看到您必須通過觀看PART_Header來執行更多的工作來防止多個項目上的IsMouseOver。 – Josh 2012-02-08 18:40:32

回答

4

你應該檢查e.Handled狀態在您的處理程序是這樣的:

private void ItemMouseEnter(object sender, MouseEventArgs e) 
{ 
    if (!e.Handled) 
    { 
     var treeViewItem = sender as TreeViewItem; 
     treeViewItem.Background = Brushes.LimeGreen; 
     e.Handled = true; 
    } 
} 

然後將它只有一次處理。