public void Drop(IDropInfo dropInfo)
        {
            LauncherCommandInfoViewModel SourceCommandItem       = dropInfo.Data as LauncherCommandInfoViewModel;
            LauncherCommandInfoViewModel TargetCommandItem       = dropInfo.TargetItem as LauncherCommandInfoViewModel;
            MenuTreeNodeViewModel        SourceMenuItem          = dropInfo.Data as MenuTreeNodeViewModel;
            MenuTreeNodeViewModel        TargetMenuItem          = dropInfo.TargetItem as MenuTreeNodeViewModel;
            ObservableCollection <MenuTreeNodeViewModel> Targets = dropInfo.TargetCollection as ObservableCollection <MenuTreeNodeViewModel>;
            List <object> DataList = dropInfo.Data as List <object>;
            List <LauncherCommandInfoViewModel> SourceCommandItems = null;
            List <MenuTreeNodeViewModel>        SourceMenuItems    = null;

            if (DataList != null && DataList.Count > 0)
            {
                if (DataList[0] is LauncherCommandInfoViewModel)
                {
                    SourceCommandItems = new List <LauncherCommandInfoViewModel>(DataList.Select(x => (LauncherCommandInfoViewModel)x));
                }
                if (DataList[0] is MenuTreeNodeViewModel)
                {
                    SourceMenuItems = new List <MenuTreeNodeViewModel>(DataList.Select(x => (MenuTreeNodeViewModel)x));
                }
            }
            else
            {
                if (SourceCommandItem != null)
                {
                    SourceCommandItems = new List <LauncherCommandInfoViewModel>()
                    {
                        SourceCommandItem
                    };
                }
                if (SourceMenuItem != null)
                {
                    SourceMenuItems = new List <MenuTreeNodeViewModel>();
                    if (SelectedMenuNodes.Count > 1)
                    {
                        SourceMenuItems.AddRange(SelectedMenuNodes);
                    }
                    else
                    {
                        SourceMenuItems.Add(SourceMenuItem);
                    }
                }
            }
            if (Targets != null)
            {
                if (SourceCommandItems != null)
                {
                    DropCommandItemsToMenuTree(dropInfo, SourceCommandItems, TargetMenuItem, Targets);
                }
                if (SourceMenuItems != null)
                {
                    DropMenuItemsToMenuTree(dropInfo, SourceMenuItems, TargetMenuItem, Targets);
                }
                SelectedMenuNodes.Clear();
            }
        }
        public void DragOver(IDropInfo dropInfo)
        {
            LauncherCommandInfoViewModel SourceCommandItem       = dropInfo.Data as LauncherCommandInfoViewModel;
            LauncherCommandInfoViewModel TargetCommandItem       = dropInfo.TargetItem as LauncherCommandInfoViewModel;
            MenuTreeNodeViewModel        SourceMenuItem          = dropInfo.Data as MenuTreeNodeViewModel;
            MenuTreeNodeViewModel        TargetMenuItem          = dropInfo.TargetItem as MenuTreeNodeViewModel;
            ObservableCollection <MenuTreeNodeViewModel> Targets = dropInfo.TargetCollection as ObservableCollection <MenuTreeNodeViewModel>;
            List <object> DataList = dropInfo.Data as List <object>;
            List <LauncherCommandInfoViewModel> SourceCommandItems = null;
            List <MenuTreeNodeViewModel>        SourceMenuItems    = null;

            if (DataList != null && DataList.Count > 0)
            {
                if (DataList[0] is LauncherCommandInfoViewModel)
                {
                    SourceCommandItems = new List <LauncherCommandInfoViewModel>(DataList.Select(x => (LauncherCommandInfoViewModel)x));
                }
                else if (DataList[0] is MenuTreeNodeViewModel)
                {
                    SourceMenuItems = new List <MenuTreeNodeViewModel>(DataList.Select(x => (MenuTreeNodeViewModel)x));
                }
            }
            if (Targets != null)
            {
                if (SourceCommandItem != null || SourceCommandItems != null)
                {
                    dropInfo.Effects = DragDropEffects.Copy;
                }
                else if (SourceMenuItem != null || SourceMenuItems != null)
                {
                    dropInfo.Effects = DragDropEffects.Move;
                }
                if (dropInfo.InsertPosition == RelativeInsertPosition.None || dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.TargetItemCenter))
                {
                    dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
                    if (TargetMenuItem != null && TargetMenuItem.HasExecutableNode)
                    {
                        dropInfo.DropTargetAdorner = null;
                        dropInfo.Effects           = DragDropEffects.None;
                    }
                }
                else if (dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.BeforeTargetItem) || dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.AfterTargetItem))
                {
                    dropInfo.DropTargetAdorner = DropTargetAdorners.Insert;
                }
            }
        }