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

どのように私はこの問題を解決することができますか?私は私の問題は、問題に非常によく似ていることがわかり

UPD1hereを説明したが、私は解決策を適用する方法をまだ理解していません。

+0

本質的に、TreeViewItemのIsMouseOverスタイルトリガーが必要です。ここにリンクがあります:http://stackoverflow.com/questions/1131161/how-can-i-make-wpf-trigger-for-ismouseover-on-treeviewitem-not-affect-all-parent – Josh

+0

@Josh、正直に言うと私はまだそれを試していないと言わなければならない。私はします。それは助けるかもしれません。 しかし、トリガーやスタイリングのないソリューションについてご存知ですか?親アイテムでイベントを発生させないようにするにはどうすればいいのですか? –

+0

理由はわかりませんが、WPFの標準的な動作です。そのStackOverflowリンクをさらにフォローし、最初の回答のリンクをクリックすると、PART_Headerを見て、複数のアイテムにまたがるIsMouseOverを防止するためにもう少し作業をしなければならないことがわかります。 – 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; 
    } 
} 

それは一度だけ処理されます。

関連する問題