设为首页 收藏本站
查看: 933|回复: 0

No.8948 实现Windows 7样式Aero TreeView控件(二):实现整行选中

[复制链接]

尚未签到

发表于 2015-5-11 12:18:18 | 显示全部楼层 |阅读模式
  
   DSC0000.png
  记得原来做Winfrom通过Item的Bounds可以获得整行的区域,但是在WPF中进行了几个布局方式都没能成功!      
VS中的解决方案效果布局如下:

   DSC0001.png
  
  这样在第一行第二列方式Border控件,此为选中区域。而如果要实现右侧系统的效果,必须要在选中区域的时候补齐第二行第一列的宽度,但是如果在TreeViewItem的Template不设置子节点列表缩进的话,将无法定位子节点列表缩进!      
对比了Winform的TreeNode类型有两个关键的属性:FullPath和Level。只要知道一个就可以根据Indent算出相应的缩进宽度,从这样的思路上,这个Item布局结构就要更改如下了:      
DSC0002.png   
代码结构如下:

  
             

     
             
                    
                          
                          
                    
                            

                    
             
     
     
  
    
  可是此时的子节点列表没有缩进怎么办?      
做几个预备动作,在TreeViewItem里面有一个TreeNode的特殊特性,叫做Level,获得节点所在的层级,在这里我做了个Extensions类:

  
     public static class TreeViewItemExtensions      
   {      
       public static int GetDepth(this TreeViewItem item)      
       {      
           FrameworkElement elem = item;      
           while (elem.Parent != null)      
           {      
               var tvi = elem.Parent as TreeViewItem;      
               if (null != tvi)      
                   return tvi.GetDepth() + 1;      
               elem = elem.Parent as FrameworkElement;      
           }      
           return 0;      
       }      
   }      

    用来获得TreeViewItem在TreeView里面的层级深度。然后就是怎么将缩进的绑定到它该在的地方了!
  在上面那段TreeViewItem的Template代码里面的itemBorder就是节点项的整体范围了,如果我们想让选中边框始终保持Aero样式中满行选中的状态就只能在itemBorder中的Grid上做手脚了,上面扩展了TreeViewItem对象,可以获取的到层级深度,而缩进值则等于节点层级和缩进值的乘积,而应用缩进值需要实现一个缩进的转换类型方法:
  
     public class IndentConverter:IValueConverter      
    {      
        public double Indent{ get; set; }
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)      
        {      
            var item = value as TreeViewItem;      
            if (null == item)      
                return new Thickness(0);      
            return new Thickness(Indent* item.GetDepth(), 0, 0, 0);      
        }
  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)      
        {      
            throw new NotImplementedException();      
        }      
    }
  

    然后就是改造上一段模板内容。完整代码如下:
  
           
              
              
                  
                     
                          
                              
                          
                          
                              
                                   
                                      
                                          
                                          
                                      
                                      
                                      
                                 
                              
                              
                  
  
  Trigger something…      
                       
                  
               
           

  
    
  
  indentConverter对象承担了获取深度以及转换边距的任务。由此我们就完成了实现整行选中TreeViewItem的任务,至于Aero样式的效果细节,后面放出。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-65830-1-1.html 上篇帖子: Windows Phone 7常用的资(转自jiangyongtao) 下篇帖子: 在windows 7 下安装MySQL 提示: 1045 access denied for user
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表