首页 新闻 会员 周边 捐助

WPF TreeView 鼠标移动到节点,该节点背景色变,如何实现?

0
悬赏园豆:10 [已解决问题] 解决于 2016-09-08 18:04
 <TreeView>
                    <TreeViewItem Header="1111">
                        <TreeViewItem Header="11111111"></TreeViewItem>
                        <TreeViewItem Header="11111111"></TreeViewItem>
                        <TreeViewItem Header="11111111"></TreeViewItem>
                    </TreeViewItem>
                    <TreeViewItem Header="2222"></TreeViewItem>
                    <TreeViewItem Header="3333"></TreeViewItem>
                </TreeView>

请问如何实现?   百度也搜不到啊。最好通过样式,不用写后台代码。

WPF
Eysa的主页 Eysa | 初学一级 | 园豆:62
提问于:2016-08-23 16:25
< >
分享
最佳答案
0

都没分...

用触发器

 1  <TreeView >
 2     <TreeView.Resources>
 3         <Style TargetType="TreeViewItem">
 4             <Style.Triggers>
 5                 <Trigger Property="IsMouseOver" Value="True">
 6                     <Setter Property="Background" Value="LawnGreen">
 7                     </Setter>
 8                 </Trigger>
 9             </Style.Triggers>
10         </Style>
11     </TreeView.Resources>
12     <TreeViewItem Header="1111">
13         <TreeViewItem Header="11111111"></TreeViewItem>
14         <TreeViewItem Header="11111111"></TreeViewItem>
15         <TreeViewItem Header="11111111"></TreeViewItem>
16     </TreeViewItem>
17     <TreeViewItem Header="2222"></TreeViewItem>
18     <TreeViewItem Header="3333"></TreeViewItem>
19 </TreeView>

 

 

收获园豆:10
皓月空 | 小虾三级 |园豆:726 | 2016-08-25 11:11

 嗯嗯,我实在是没分了,穷死啦。

 有所改变,但是鼠标移动到子节点后,父节点也变色了。。。 

 我只要子节点变色

Eysa | 园豆:62 (初学一级) | 2016-08-25 12:25

 兄台,我给分了,麻烦示教一下,不胜感激。

Eysa | 园豆:62 (初学一级) | 2016-08-25 18:17

@Eysa:分是开玩笑的、、、

简单试了下,没找到现有的属性,可能要改模板,就麻烦了

要不你还是用代码吧,我xaml是半吊子,大都用代码解决 - -

皓月空 | 园豆:726 (小虾三级) | 2016-08-26 13:23

@浴子风:  好的谢谢。

Eysa | 园豆:62 (初学一级) | 2016-08-26 13:58

@Eysa: 既然是给分了,还是给你弄详细点

加一个类

public class TreeViewItemHelper
{
    public static bool GetShowBackground(DependencyObject obj)
    {
        return (bool)obj.GetValue(ShowBackgroundProperty);
    }

    public static void SetShowBackground(DependencyObject obj, bool value)
    {
        obj.SetValue(ShowBackgroundProperty, value);
    }
    public static readonly DependencyProperty ShowBackgroundProperty = DependencyProperty.RegisterAttached(
        "ShowBackground",
        typeof(bool),
        typeof(TreeViewItemHelper),
        new PropertyMetadata(OnShowBackground)
    );

    private static void OnShowBackground(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var item = d as TreeViewItem;
        if (item != null && item.Items.Count > 0)
        {
            item.Background = new SolidColorBrush(Colors.Transparent);
        }
    }
}

界面再加一句话

<TreeView>
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter Property="Background" Value="LawnGreen"></Setter>
                    <Setter Property="local:TreeViewItemHelper.ShowBackground" Value="true" />
                </Trigger>
            </Style.Triggers>
            <Style.Resources>
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="RoyalBlue" Opacity="1"></SolidColorBrush>
            </Style.Resources>
        </Style>
    </TreeView.Resources>
    <TreeViewItem Header="1111" >
        <TreeViewItem Header="11111111"></TreeViewItem>
        <TreeViewItem Header="11111111"></TreeViewItem>
        <TreeViewItem Header="11111111"></TreeViewItem>
    </TreeViewItem>
    <TreeViewItem Header="2222"></TreeViewItem>
    <TreeViewItem Header="3333"></TreeViewItem>
</TreeView>
皓月空 | 园豆:726 (小虾三级) | 2016-08-26 14:42

@浴子风: 又近了一步,但是现在是在最底层鼠标一上去会变色,鼠标在父节点上就不会变了。。。。

Eysa | 园豆:62 (初学一级) | 2016-08-26 19:52

@Eysa: 你说的只要子节点变色啊、、、

皓月空 | 园豆:726 (小虾三级) | 2016-08-29 14:34

@浴子风: 他是希望  如果鼠标单独放在父节点时候,父节点自己也变色。你的附加属性是让有子元素的节点透明了。  是不是可以用截断事件冒泡的方式试试

Darren.Dai | 园豆:329 (菜鸟二级) | 2016-08-29 15:09

@浴子风: 抱歉,我没描述清楚,应该是移动到该节点,该节点就变色,就是说移到哪哪就变色。嘿嘿,谢谢啦。WPF菜鸟,正在学习。

Eysa | 园豆:62 (初学一级) | 2016-08-29 16:16

@Eysa: 这两天比较忙,不知道你弄好了没。 编程就是一种思想,逻辑通了代码也就出来了。这个问题跟TreeView设计的初衷不符,最好的方法是修改模板。

我WPF是业余的,通过代码调整了一下,核心思想是将子项的父节点背景色不改变,但要注意父级点平滑移动到子节点或子节点平滑移动到父级点状态是不会改变的。

界面调整

1 <Style.Triggers>
2     <Trigger Property="IsMouseOver" Value="true">
3         <!--<Setter Property="Background" Value="LawnGreen"></Setter>-->
4         <Setter Property="local:TreeViewItemHelper.ShowBackground" Value="true" />
5     </Trigger>
6     <Trigger Property="IsMouseOver" Value="false">
7         <Setter Property="local:TreeViewItemHelper.ShowBackground" Value="False" />
8     </Trigger>
9 </Style.Triggers>

触发事件调整:

 1 static List<TreeViewItem> _LastItems = new List<TreeViewItem>();
 2 private static void OnShowBackground(DependencyObject d, DependencyPropertyChangedEventArgs e)
 3 {
 4     var item = d as TreeViewItem;
 5 
 6     if (item == null || e.NewValue is bool == false || item.Background is SolidColorBrush == false) return;
 7 
 8     if ((bool)e.NewValue == true)
 9     {
10 
11         if (_LastItems.Count == 0)
12         {
13             item.Background = new SolidColorBrush(Colors.LawnGreen);
14         }
15         else
16         {
17             if (_LastItems.Last().Parent != item && item != _LastItems[0])
18             {
19                 _LastItems[0].Background = new SolidColorBrush(Colors.Transparent);
20 
21                 item.Background = new SolidColorBrush(Colors.LawnGreen);
22                 _LastItems.Insert(0, item);
23             }
24         }
25         if (_LastItems.Contains(item) == false)
26         {
27             _LastItems.Add(item);
28         }
29     }
30     else
31     {
32         if (_LastItems.FirstOrDefault() == item)
33         {
34             item.Background = new SolidColorBrush(Colors.Transparent);
35             _LastItems.Remove(item);
36             if (_LastItems.Count > 0)
37             {
38                 _LastItems[0].Background = new SolidColorBrush(Colors.LawnGreen);
39             }
40         }
41     }
42 }
皓月空 | 园豆:726 (小虾三级) | 2016-08-30 17:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册