分享基于silverlight的一个“树形结构图”控件

传统的树形菜单只适用于展示,本控件提供了一个可视化的组织图展示,并实现了一个对树形图的CRUD拖拽操作,可用于OA的人员维护或是部门关系图

 

1. 使用此控件只需要定义根节点的模板:

< localControls:BranchNode  Grid.Column ="0"  x:Name ="unAllocateBranchNode"  Margin ="30" >
             < localControls:BranchNode.Template >
                 < ControlTemplate  TargetType ="localControls:BranchNode" >
                     < Grid  x:Name ="rootPanel"  VerticalAlignment ="Top"  Height =" {TemplateBinding Height} " >
                         < StackPanel  Orientation ="Vertical"  HorizontalAlignment ="Stretch"  DataContext =" {TemplateBinding Branch} " >
                             < Border  x:Name ="titlePanel"  HorizontalAlignment ="Stretch"   Background =" {TemplateBinding Background} "  BorderBrush =" {TemplateBinding BorderBrush} "  CornerRadius ="3"  BorderThickness ="1" >
                                 < Border.Resources >
                                     < SolidColorBrush  x:Key ="normalBorder"  Color ="#9fa8b7" />
                                     < SolidColorBrush  x:Key ="hightlightBorder"  Color ="Red" />
                                 </ Border.Resources >
                                 < StackPanel >
                                     < StackPanel  Orientation ="Horizontal" >
                                         < ContentPresenter  Content =" {Binding Name} "  VerticalAlignment ="Center"  Margin ="5" />                        
                                     </ StackPanel >

                                     < ItemsControl  ItemsSource =" {Binding Embranchment} " >
                                         < ItemsControl.ItemsPanel >
                                             < ItemsPanelTemplate >
                                                 < StackPanel />
                                             </ ItemsPanelTemplate >
                                         </ ItemsControl.ItemsPanel >
                                         < ItemsControl.ItemTemplate >
                                             < DataTemplate >
                                                 < localControls:BranchNode  Branch =" {Binding} "  Margin ="3" />
                                             </ DataTemplate >
                                         </ ItemsControl.ItemTemplate >
                                     </ ItemsControl >

                                 </ StackPanel >

                             </ Border >
                         </ StackPanel >
                     </ Grid >
                 </ ControlTemplate >
             </ localControls:BranchNode.Template >
         </ localControls:BranchNode >

 

2. 然后绑定数据源

            Branch branch =  new Branch();
            branch.Name =  " 财务部 ";

            branch.Embranchment =  new ObservableCollection<Branch>()
            {
                 new Branch(){Name= " 财务部1 "},
                 new Branch(){Name= " 财务部2 "},
                 new Branch(){Name= " 财务部3 "}
            };

            
            branch.AppendBranch +=  new Action<Branch>(branch_AppendBranch);
             this.unAllocateBranchNode.Branch = branch;

 

3. 核心使用了通用的推拽原型

        private  void BindDragEvent()
        {
             bool isDragging =  false;
            Point lastPosition =  new Point( 00);

            Popup rootPopup =  new Popup();
            BranchNode ghostContainer =  null;

            Branch parentBranch =  null;
            Border lastTitlePanel =  null;

            ...
             this.titlePanel.MouseLeftButtonDown += (source, eventArgs) =>
            {
                 this.IsHitTestVisible =  false;

                isDragging =  true;
                lastPosition = eventArgs.GetPosition( null);
                ...
                ghostContainer.MouseLeftButtonUp += (s, e) =>
                {   
                    rootPopup.Child =  null;
                    ...
                    isDragging =  false;
                     this.ReleaseMouseCapture();
                     this.IsHitTestVisible =  true;
                };

                ghostContainer.MouseMove += (s, e) =>
                {
                     if (!isDragging)
                         return;

                    ...
                    MatrixTransform mt =  new MatrixTransform();
                    mt.Matrix = rt.Value;

                    ghostContainer.RenderTransform = mt;

                };
            };
        }

 

 4. 源代码下载

 https://199.47.216.171/u/10032723/EasyOA.rar

 

5. 预览

 

http://rapidsl2.guozili.25u.com/  (admin/admin  点左边菜单 控件展示 - 组织树形图)

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/guozili/archive/2012/07/08/2581422.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值