在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]);
}
}
}