Как запретить WPF TreeView вызывать MouseEnter для нескольких элементов? - PullRequest
1 голос
/ 08 февраля 2012

У меня есть следующие фрагменты кода, которые должны создать дерево. Каждый элемент этого дерева должен менять свой фон при наведении.

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 Я вижу, что моя проблема очень похожа на проблему, описанную здесь , но я еще не понял, как применить решение.

1 Ответ

4 голосов
/ 18 октября 2012

вы должны проверить состояние e.Handled в вашем обработчике следующим образом:

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

тогда оно будет обработано только один раз.

...