2012-02-08 66 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; 
    } 
} 

然后将它只有一次处理。

相关问题