传统的树形菜单只适用于展示,本控件提供了一个可视化的组织图展示,并实现了一个对树形图的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 >
< 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;
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( 0, 0);
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;
};
};
}
{
bool isDragging = false;
Point lastPosition = new Point( 0, 0);
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 点左边菜单 控件展示 - 组织树形图)
![]()
![]()