如何防止WPF TreeView在多个项目上引发MouseEnter?

时间:2012-02-08 18:07:30

标签: c# wpf treeview mouseenter routed-events

我有以下代码片段,应该创建一个树。该树的每个项目都应该在悬停时改变其背景。

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描述的问题非常相似,但我还没有理解如何应用解决方案。

1 个答案:

答案 0 :(得分: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;
    }
}

然后它只会被处理一次。