| File was renamed from Utils/DdDropHandler.cs |
| | |
| | | using GongSolutions.Wpf.DragDrop;
|
| | | using GongSolutions.Wpf.DragDrop.Utilities;
|
| | | using System.Collections.Generic;
|
| | | using System.ComponentModel;
|
| | | using System;
|
| | | using System.Windows;
|
| | | using System.Windows.Controls;
|
| | | using System.Windows.Markup;
|
| | | using System.Linq;
|
| | | using System.Collections;
|
| | | using WPFProject.Models;
|
| | |
|
| | | namespace WPFProject.Utils
|
| | | {
|
| | | public class DdDropHandler : DefaultDropHandler
|
| | | {
|
| | | public bool CanConvert(IDropInfo dropInfo)
|
| | | {
|
| | | bool InterfaceFilter(Type t, object o) => (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable<>));
|
| | | Type[] enumerableInterfaces = dropInfo.TargetCollection.GetType().FindInterfaces(InterfaceFilter, null);
|
| | | var enumerableTypes = from i in enumerableInterfaces
|
| | | select i.GetGenericArguments().Single();
|
| | |
|
| | | if (enumerableTypes.Any())
|
| | | {
|
| | | Type dataType = TypeUtilities.GetCommonBaseClass(ExtractData(dropInfo.Data));
|
| | | return dataType == typeof(FuncModel) && enumerableTypes.Any(t => t==typeof(Step));
|
| | | }
|
| | |
|
| | | return false;
|
| | | }
|
| | |
|
| | | public Step ConvertFunc2Step(FuncModel func) {
|
| | | return new Step
|
| | | {
|
| | | Name = func.Name
|
| | | };
|
| | | }
|
| | |
|
| | |
|
| | |
|
| | | public override void DragOver(IDropInfo dropInfo)
|
| | | {
|
| | | if (CanAcceptData(dropInfo))
|
| | | {
|
| | | base.DragOver(dropInfo);
|
| | | }
|
| | | else if (CanConvert(dropInfo))
|
| | | {
|
| | | // 固定Copy
|
| | | dropInfo.Effects = DragDropEffects.Copy;
|
| | | var isTreeViewItem = dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.TargetItemCenter) && dropInfo.VisualTargetItem is TreeViewItem;
|
| | | dropInfo.DropTargetAdorner = isTreeViewItem ? DropTargetAdorners.Highlight : DropTargetAdorners.Insert;
|
| | | }
|
| | | }
|
| | |
|
| | | public override void Drop(IDropInfo dropInfo)
|
| | | {
|
| | | if (CanAcceptData(dropInfo))
|
| | | {
|
| | | base.Drop(dropInfo);
|
| | | }
|
| | | else if (CanConvert(dropInfo))
|
| | | {
|
| | | int insertIndex = GetInsertIndex(dropInfo);
|
| | | var destinationList = dropInfo.TargetCollection.TryGetList();
|
| | | var data = ExtractData(dropInfo.Data).OfType<object>().ToList();
|
| | |
|
| | | if (destinationList != null)
|
| | | {
|
| | | var objects2Insert = new List<object>();
|
| | |
|
| | | foreach (var o in data)
|
| | | {
|
| | | var obj2Insert = ConvertFunc2Step(o as FuncModel);
|
| | |
|
| | | objects2Insert.Add(obj2Insert);
|
| | |
|
| | | destinationList.Insert(insertIndex++, obj2Insert);
|
| | | // 下方对象如果实现了 IDragItemSource 接口,会在这里调用 ItemDropped 方法,算是后置处理
|
| | | if (obj2Insert is IDragItemSource dragItemSource)
|
| | | {
|
| | | dragItemSource.ItemDropped(dropInfo);
|
| | | }
|
| | | }
|
| | |
|
| | | SelectDroppedItems(dropInfo, objects2Insert);
|
| | | }
|
| | | }
|
| | | |
| | | }
|
| | |
|
| | | }
|
| | | }
|
| | | using GongSolutions.Wpf.DragDrop; |
| | | using GongSolutions.Wpf.DragDrop.Utilities; |
| | | using System.Collections.Generic; |
| | | using System.ComponentModel; |
| | | using System; |
| | | using System.Windows; |
| | | using System.Windows.Controls; |
| | | using System.Windows.Markup; |
| | | using System.Linq; |
| | | using System.Collections; |
| | | using WPFProject.Models; |
| | | |
| | | namespace WPFProject.Utils |
| | | { |
| | | public class DdDropHandler : DefaultDropHandler |
| | | { |
| | | public bool CanConvert(IDropInfo dropInfo) |
| | | { |
| | | bool InterfaceFilter(Type t, object o) => (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable<>)); |
| | | Type[] enumerableInterfaces = dropInfo.TargetCollection.GetType().FindInterfaces(InterfaceFilter, null); |
| | | var enumerableTypes = from i in enumerableInterfaces |
| | | select i.GetGenericArguments().Single(); |
| | | |
| | | if (enumerableTypes.Any()) |
| | | { |
| | | Type dataType = TypeUtilities.GetCommonBaseClass(ExtractData(dropInfo.Data)); |
| | | return dataType == typeof(FuncModel) && enumerableTypes.Any(t => t==typeof(Step)); |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | | public Step ConvertFunc2Step(FuncModel func) { |
| | | return new Step |
| | | { |
| | | Name = func.Name |
| | | }; |
| | | } |
| | | |
| | | |
| | | |
| | | public override void DragOver(IDropInfo dropInfo) |
| | | { |
| | | if (CanAcceptData(dropInfo)) |
| | | { |
| | | base.DragOver(dropInfo); |
| | | } |
| | | else if (CanConvert(dropInfo)) |
| | | { |
| | | // 固定Copy |
| | | dropInfo.Effects = DragDropEffects.Copy; |
| | | var isTreeViewItem = dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.TargetItemCenter) && dropInfo.VisualTargetItem is TreeViewItem; |
| | | dropInfo.DropTargetAdorner = isTreeViewItem ? DropTargetAdorners.Highlight : DropTargetAdorners.Insert; |
| | | } |
| | | } |
| | | |
| | | public override void Drop(IDropInfo dropInfo) |
| | | { |
| | | if (CanAcceptData(dropInfo)) |
| | | { |
| | | base.Drop(dropInfo); |
| | | } |
| | | else if (CanConvert(dropInfo)) |
| | | { |
| | | int insertIndex = GetInsertIndex(dropInfo); |
| | | var destinationList = dropInfo.TargetCollection.TryGetList(); |
| | | var data = ExtractData(dropInfo.Data).OfType<object>().ToList(); |
| | | |
| | | if (destinationList != null) |
| | | { |
| | | var objects2Insert = new List<object>(); |
| | | |
| | | foreach (var o in data) |
| | | { |
| | | var obj2Insert = ConvertFunc2Step(o as FuncModel); |
| | | |
| | | objects2Insert.Add(obj2Insert); |
| | | |
| | | destinationList.Insert(insertIndex++, obj2Insert); |
| | | // 下方对象如果实现了 IDragItemSource 接口,会在这里调用 ItemDropped 方法,算是后置处理 |
| | | if (obj2Insert is IDragItemSource dragItemSource) |
| | | { |
| | | dragItemSource.ItemDropped(dropInfo); |
| | | } |
| | | } |
| | | |
| | | SelectDroppedItems(dropInfo, objects2Insert); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | } |