首页 > 投稿

WPF 保姆级教程怎么实现一个树形菜单

投稿会员昵称: 印修关注投稿量:粉丝量:关注量:   2025-03-04 00:02:01A+A-

先看一下效果吧:

WPF 保姆级教程怎么实现一个树形菜单(pic1)    

我们直接通过改造一下原版的TreeView来实现上面这个效果

我们先创建一个普通的TreeView

代码很简单:

WPF 保姆级教程怎么实现一个树形菜单(pic2)
        
            
            
                
                
            
            
        
WPF 保姆级教程怎么实现一个树形菜单(pic2)

实现的效果如下:

WPF 保姆级教程怎么实现一个树形菜单(pic4)

如果把这个当成是项目的菜单栏,应该会被领导骂死,一个是不够灵活,数据是写死的;二是样式不好看,只有点文字部分才会展开。

创建一下模板

WPF 保姆级教程怎么实现一个树形菜单(pic5)

直接在设计器中右键我们的item,编辑副本,点击确定,我们会得到下面一段代码

WPF 保姆级教程怎么实现一个树形菜单(pic6)

里面有一个叫Bd的border,我们把这个border的背景色去掉,然后我们自己去创建两个新的border

WPF 保姆级教程怎么实现一个树形菜单(pic2)

    
        
    
    
WPF 保姆级教程怎么实现一个树形菜单(pic2)

上面红色部分是我们新增的两个border,原本的叫Bd的border,我们只保留紫色部分的属性.

原本的代码里面有两个关于Bd的trigger

WPF 保姆级教程怎么实现一个树形菜单(pic9)

我们取名为bd1的border,最开始的Visibility设置的是Hidden,我们替换一下关于Bd的trigger,让它变成当IsSelected是true的情况下,让bd1的Visibility变成Visible.

WPF 保姆级教程怎么实现一个树形菜单(pic2)
    
    
    
        
        
        
    
    
WPF 保姆级教程怎么实现一个树形菜单(pic2)

再运行一下,看一下效果

WPF 保姆级教程怎么实现一个树形菜单(pic12)

基本上已经算是成功一半了,但是这个时候,我们的菜单只有一个有效果,其他的还是原来的样式,那是因为我们只有一个TreeViewItem使用了我们写的效果

WPF 保姆级教程怎么实现一个树形菜单(pic13)

如果我们每一个TreeViewItem都复制一下这句Style="{DynamicResource TreeViewItemStyle1}" ,是不是显得很呆,而且这只是在我们的菜单很少的情况下,如果菜单很多,这个方法就不可行。

所以这里我们用一个TreeView的ItemContainerStyle来操作一下

        

我们创建一个类型是TreeView的style,把它的ItemContainerStyle设置成我们之前添加的那个style,然后我们把这个style放到我们的TreeView上

WPF 保姆级教程怎么实现一个树形菜单(pic14)

这个时候我们再运行就会发现首级菜单的样式都实现我们想要的效果了,但是子集菜单还是原来的样式

我们在代码里面添加下面一个方法

WPF 保姆级教程怎么实现一个树形菜单(pic2)
        private void ApplyItemContainerStyle(ItemsControl itemsControl)
        {            foreach (var item in itemsControl.Items)
            {                var treeViewItem = item as TreeViewItem;                if (treeViewItem != null)
                {
                    treeViewItem.Style = treeview1.ItemContainerStyle;
                    ApplyItemContainerStyle(treeViewItem);
                }
            }
        }
WPF 保姆级教程怎么实现一个树形菜单(pic2)

然后我们在构造函数里面把我们的TreeView当做是参数传进去

这个方法就是把所有的item和item的子项都设置成treeview的ItemContainerStyle;

WPF 保姆级教程怎么实现一个树形菜单(pic17)

我们再启动一下项目,就会发现效果是我们想要的效果了

到这里其实大部分效果都实现了,基本上也可以向领导交差了;

但是还缺少一个数据可拓展性和一个图标的功能,我们先看一下数据可拓展性

在平时的项目里面,一般都会有很多个不同的项目,每个项目可能都有好多个菜单,有的项目还想隐藏某一些菜单,我们总不能所有项目都通过visible属性来设置吧

特别是报表功能可能会有几十个,所以我们需要用到一个东西叫数据模板:HierarchicalDataTemplate;

我们先创建一个类

    public class TreeViewModel
    {        public string Header { get; set; }        public ObservableCollection Children { get; set; }
    }

然后回到设计器里面,把我们的代码改成下面的代码

WPF 保姆级教程怎么实现一个树形菜单(pic2)

    
        
            
                
            
        
    
WPF 保姆级教程怎么实现一个树形菜单(pic2)

对比一下红色部分的绑定,和类的属性,就能知道这个数据模板怎么用了.

再到构造函数里面去添加数据

WPF 保姆级教程怎么实现一个树形菜单(pic2)
public ObservableCollection MenuCollection { get; set; }public MainWindow()
{
    InitializeComponent();    MenuCollection = new ObservableCollection()
    {
        new TreeViewModel
        {
            Header = "人事部"
        },
        new TreeViewModel
        {
            Header = "技术部",
            Children = new ObservableCollection
            {
                new TreeViewModel { Header = "技术部-1"},
                new TreeViewModel { Header = "技术部-2"},
            }
        },
        new TreeViewModel
        {
            Header = "财务部",
        },
    };

    treeview1.ItemsSource = MenuCollection;}
WPF 保姆级教程怎么实现一个树形菜单(pic2)

注意这两段标红的代码,我们用一个集合MenuCollection模拟一下我们从数据库或者其他地方查询出来的菜单集合,然后把它做为数据源给treeview就可以了

再运行一下项目,它就差不多实现我们想要的效果了,现在再去找领导交差,领导还会夸你做的不错,只是还差一个图标了,这个就是锦上添花的东西了.

我们百度搜索一下  阿里ICON,去到官网里面,创建一个自己的账号,然后搜索一些自己喜欢的图标

WPF 保姆级教程怎么实现一个树形菜单(pic22)

 把自己喜欢的图标添加到自己的项目中去,这里的项目名很重要,我取的是  FatSheep

WPF 保姆级教程怎么实现一个树形菜单(pic23)

WPF 保姆级教程怎么实现一个树形菜单(pic24)

WPF 保姆级教程怎么实现一个树形菜单(pic25)

 在到我的项目里面去把这个资源文件下载到自己的项目中

WPF 保姆级教程怎么实现一个树形菜单(pic26)

 下载下来的文件,我们把ttf后缀的文件添加到我们的项目里面去

WPF 保姆级教程怎么实现一个树形菜单(pic27)

把它作为资源引入到代码里面

WPF 保姆级教程怎么实现一个树形菜单(pic28)

pack:application:,,,/自己项目的名字;component/Resources/iconfont.ttf#FatSheep

记得修改一下自己的项目名字,我取的是TreeViewDemo,改成自己的项目名就好了,最后的结尾,是FatSheep,记得改成自己的ICON项目名称

接着我们在TreeViewModel里面添加一个Icon属性

WPF 保姆级教程怎么实现一个树形菜单(pic2)
    public class TreeViewModel
    {        public string Header { get; set; }        public string Icon { get; set; }        public ObservableCollection Children { get; set; }
    }
WPF 保姆级教程怎么实现一个树形菜单(pic2)

然后我们在数据源里面添加一下数据

WPF 保姆级教程怎么实现一个树形菜单(pic2)
MenuCollection = new ObservableCollection()
{    new TreeViewModel
    {
        Header = "人事部",        Icon = "\ue71c"
    },    new TreeViewModel
    {
        Header = "技术部",        Icon = "\ue71c",
        Children = new ObservableCollection
        {            new TreeViewModel { Header = "技术部-1", Icon="\ue71c"},            new TreeViewModel { Header = "技术部-2" , Icon="\ue71c"},
        }
    },    new TreeViewModel
    {
        Header = "财务部",        Icon = "\ue71c"
    },
};
WPF 保姆级教程怎么实现一个树形菜单(pic2)

设计器里面添加一下显示部分的代码

WPF 保姆级教程怎么实现一个树形菜单(pic2)

    
        
                            
                
            
        
    
WPF 保姆级教程怎么实现一个树形菜单(pic2)

再启动项目,功能就完成了

WPF 保姆级教程怎么实现一个树形菜单(pic35)

这个笑脸是怎么来的了

那是因为我自己的项目里面添加了一个笑脸

WPF 保姆级教程怎么实现一个树形菜单(pic36)

我们复制一下这个代码,     我们把它改成 \ue71c,这是一个转义字符,就这样我们就能添加如何自己喜欢的图标了。


提示:在享受本文内容的同时,请注意版权归属 徐州鑫坤机电设备有限公司https://www.xzxkjd.com如果您觉得有价值欢迎分享但请务必注明出处,感谢您的理解,谢谢

以下部分内容需要登录查看 立即登录

点击这里复制本文地址 以上内容由用户上传和网络在徐州鑫坤机电设备有限公司整理呈现,如有侵权请联系站长:xzxkjd@qq.com !

1. 本网站可能包含第三方链接,请注意甄别,我们不对其内容负责。

2. 请遵守网络法律法规,在浏览网站时,不传播违法、不良信息,共同维护网络健康。否则后果自负!

3. 本网站内容受版权保护,未经许可,严禁转载!

4. 长时间浏览网站请注意适时休息,保护眼睛,保持身心健康。

5. 在浏览网站过程中,如有任何疑问或需要帮助,请随时联系我们的客服团队。

6. 如有好的内容可投稿申请发布我们收到会第一时间审核发布。

7. 请注意系统即将进行维护可能会影响部分功能的正常使用请提前规划好您的浏览时间,感谢您的理解,享受每一次在线体验

相关内容

加载中~

Copyright ©2012-2024徐州鑫坤机电设备有限公司版权所有
苏ICP备2023032739号-1ICP备2023032739号-2苏ICP备2023032739号-3X
苏公网安备 32038202000884号增值电信业务经营许可证:合字B1-20235517
开发中| 关键词| 网站地图| 网站地图| 网站地图| TAG集合

今日IP人数0今日浏览量(PV)0昨日IP人数0昨日浏览量(PV)07天IP人数07天浏览量(PV)0

网站已运行:

在线客服
服务热线

服务热线

0516-86596070

联系邮箱

服务热线

xzxkjd.@qq.com

微信咨询
我的网站名称
我的网站名称
交流群
返回顶部
X我的网站名称

截屏,微信识别二维码

微信号:xkyinxiu

(点击微信号复制,添加好友)

  打开微信

微信号已复制,请打开微信添加咨询详情!