2012-02-08 5 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

+0

@ Джош, если честно Я должен сказать, что еще не пробовал. Я сделаю это. Это может помочь. Но есть ли у вас какие-либо идеи относительно решения без триггеров и стилей? Интересно, как я могу предотвратить появление события на родительских элементах. –

+0

Это просто стандартное поведение WPF, хотя я не уверен, почему. Если вы продолжите эту ссылку StackOverflow и нажмите на ссылку в первом ответе, вы увидите, что вам нужно выполнить немного больше работы, чтобы предотвратить IsMouseOver над несколькими элементами, наблюдая за PART_Header. – Josh

ответ

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; 
    } 
} 

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

 Смежные вопросы

  • Нет связанных вопросов^_^