删除节点比新增节点简单很多,主要是判断要删除的节点有没有兄弟节点,如果有,就直接删除要删除的节点,如果没有,将父节点也一起删除。
首先定义一个右键菜单
XAML:
<!--定义一个右键菜单控件-->
<UserControl.Resources>
<ContextMenu x:Key="cmButton">
<MenuItem Name="remove" Header="删除" Click="RemoveNodes"/>
</ContextMenu>
</UserControl.Resources>
定义一个树形控件:
<TreeView Name="portionFunctions" HorizontalAlignment="Left" Height="250" Margin="33,75,0,0" VerticalAlignment="Top" Width="250" MouseRightButtonDown="treeView_MouseRightButtonDown"/>
CS:
/// <summary>
/// 要删除的节点信息
/// </summary>
TreeViewItem _target;
/// <summary>
/// 鼠标右键点击事件
/// </summary>
private void treeView_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
//判断是否选中节点
TreeViewItem TargetItem = GetNearestContainer(e.OriginalSource as UIElement);
if (TargetItem != null)
{
//实例化菜单
ContextMenu cm = this.FindResource("cmButton") as ContextMenu;
//目标
cm.PlacementTarget = sender as TreeViewItem;
//位置
cm.Placement = PlacementMode.MousePoint;
//显示菜单
cm.IsOpen = true;
FindParent(TargetItem);
}
}
/// <summary>
/// 获取节点信息
/// </summary>
private TreeViewItem GetNearestContainer(UIElement element)
{
// 沿着元素树向上走到最近的树视图项。
TreeViewItem container = element as TreeViewItem;
while ((container == null) && (element != null))
{
element = VisualTreeHelper.GetParent(element) as UIElement;
container = element as TreeViewItem;
}
return container;
}
/// <summary>
/// 查找父节点
/// </summary>
/// <param name="treeView"></param>
private void FindParent(TreeViewItem treeView)
{
_target = new TreeViewItem();
TreeViewItem parentTree = treeView.Parent as TreeViewItem;
//存在其他兄弟节点,不需要删除父节点
if (parentTree != null && parentTree.Items.Count > 1)
{
_target = treeView;
}
//没有其他兄弟节点,删除父节点
else if (parentTree != null && parentTree.Items.Count == 1)
{
_target = parentTree;
FindParent(parentTree);
}
//没有父节点
else
{
_target = treeView;
}
}
/// <summary>
/// 删除按钮点击事件
/// </summary>
private void RemoveNodes(object sender, RoutedEventArgs e)
{
if (!string.IsNullOrWhiteSpace(_target.Uid))
{
foreach (TreeViewItem item in this.portionFunctions.Items)
{
if (item.Uid == _target.Uid)
{
this.portionFunctions.Items.Remove(_target);
break;
}
TraverseNodeInfo(item, _target);
}
}
}
/// <summary>
/// 遍历子节点(删除)
/// </summary>
/// <param name="viewItem"></param>
/// <param name="tree">需要删除的节点</param>
private void TraverseNodeInfo(TreeViewItem viewItem, TreeViewItem tree)
{
foreach (TreeViewItem item in viewItem.Items)
{
if (item.Uid == tree.Uid)
{
viewItem.Items.Remove(tree);
return;
}
TraverseNodeInfo(item, _target);
}
}
上个图