WPF TreeViewItem使用Shift多选删除

在WPF项目开发过程中,节点树默认只能选中一个节点进行删除操作,但在很多情况下,需要实现摁住“Shift”键多选节点并删除,如下图所示:

 ​​​​

 实现上图的Shift多选功能,主要依靠TreeViewItem的SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)事件,该事件提供了新选中Item和上次选中的Item,由此可以获取到两个Item的Index,从而确定Shift多选的区域,并为该区域设置背景色;实现代码如下所示:


        public List<TreeViewItem> SelectedItemList = new List<TreeViewItem>();

        //TODO 单击选择树状节点
        private void ScriptTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            SelectedItem = e.NewValue as TreeViewItem;
            ScriptTree.ContextMenu = ScriptTree.Resources["MenuItemTree"] as ContextMenu;
            SelectedItemList.Clear();
            TreeViewItem container = SelectedItem.Parent as TreeViewItem;
            if (container == null) return;
            if (Keyboard.IsKeyDown(Key.LeftShift))
            {
                TreeViewItem item1 = e.OldValue as TreeViewItem;
                TreeViewItem item2 = e.NewValue as TreeViewItem;
                int StartIndex = 0, EndIndex = 0;
                for (int i = 0; i < container.Items.Count; i++)
                {
                    if (item1 == container.ItemContainerGenerator.ContainerFromIndex(i))
                        StartIndex = i;
                    if (item2 == container.ItemContainerGenerator.ContainerFromIndex(i))
                        EndIndex = i;
                }
                int TempValue = StartIndex;
                StartIndex = Math.Min(StartIndex, EndIndex);
                EndIndex = Math.Max(TempValue, EndIndex) + 1;
                for (int i = StartIndex; i < EndIndex; i++)
                {
                    TreeViewItem TempItem = container.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem;
                    TempItem.Background = Brushes.LightSteelBlue;
                    SelectedItemList.Add(TempItem);
                }
            }
            else
            {
                for (int i = 0; i < container.Items.Count; i++)
                {
                    TreeViewItem TempItem = container.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem;
                    if (TempItem != null) TempItem.Background = Brushes.Transparent;
                }
            }
        }
       
        //TODO 删除
        private void MenuItem_Delete_Click(object sender, RoutedEventArgs e)
        {
            TreeViewItem CurrentItem = ScriptTree.SelectedItem as TreeViewItem;
            TreeViewItem CurrentItemLastNode = (TreeViewItem)CurrentItem.Parent;
            for(int i = 0;i<SelectedItemList.Count;i++)
            {
                if(CurrentItemLastNode.Items.Contains(SelectedItemList[i]))
                {
                    CurrentItemLastNode.Items.Remove(SelectedItemList[i]);
                }
            }
        }

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值