private static DragDropInfo GetDragDropInfo(UIElement target, DragEventArgs e, PokemonDragDropData data) { var dragDropInfo = new DragDropInfo(); dragDropInfo.Action = DragDropActions.None; int folderIndex = DragDropState.GetDraggingOverIndex(target); var collection = (target as FrameworkElement).DataContext as CollectionViewModel; if (collection != null && folderIndex != -1) { dragDropInfo.TargetFolder = collection.Folders[folderIndex]; if (dragDropInfo.TargetFolder.CanAddPokemon) { if (e.KeyStates.HasFlag(DragDropKeyStates.ControlKey)) { dragDropInfo.Action = DragDropActions.CopyTo; } else if (dragDropInfo.TargetFolder != data.SourceFolder) { dragDropInfo.Action = DragDropActions.MoveTo; } } } return dragDropInfo; }
private static DragDropActions GetDragDropAction(UIElement target, PokemonDragDropData data) { if ((target as FrameworkElement).DataContext != data.SourceFolder) { return DragDropActions.MoveTo; } else { return DragDropActions.None; } }
private static DragDropInfo GetDragDropInfo(UIElement target, DragEventArgs e, PokemonDragDropData data) { var dragDropInfo = new DragDropInfo(); dragDropInfo.Action = DragDropActions.None; dragDropInfo.Folder = (target as FrameworkElement).DataContext as IFolderViewModel; if (dragDropInfo.Folder == null) return dragDropInfo; dragDropInfo.InsertIndex = DragDropState.GetInsertionIndex(target); dragDropInfo.PokemonIndex = DragDropState.GetDraggingOverIndex(target); if (dragDropInfo.PokemonIndex != -1) { if (data.SourceFolder != dragDropInfo.Folder || data.PokemonIndexInFolder != dragDropInfo.PokemonIndex) { if (e.KeyStates.HasFlag(DragDropKeyStates.ControlKey)) { dragDropInfo.Action = DragDropActions.Replace; } else { dragDropInfo.Action = DragDropActions.SwapWith; } } } else if (dragDropInfo.InsertIndex != -1) { if (e.KeyStates.HasFlag(DragDropKeyStates.ControlKey)) { if (dragDropInfo.Folder.CanAddPokemon) dragDropInfo.Action = DragDropActions.CopyTo; } else if (data.SourceFolder != dragDropInfo.Folder)//movement between folders { if (dragDropInfo.Folder.CanAddPokemon) dragDropInfo.Action = DragDropActions.MoveTo; } else//movement within folder { if (IsValidMovement(data.PokemonIndexInFolder, dragDropInfo.InsertIndex)) dragDropInfo.Action = DragDropActions.MoveTo; } } return dragDropInfo; }
public void HandleMouseMove(UIElement sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Released) return; var selector = sender as Selector; if (selector == null || selector.SelectedItem == null) return; //find the visual item hit var itemContainer = selector.ItemContainerGenerator. ContainerFromIndex(selector.SelectedIndex) as FrameworkElement; if (!FolderDragDropSource.HitElement(e.GetPosition(itemContainer), itemContainer)) return; var selectedItem = selector.SelectedItem as PokemonViewModel; IFolderViewModel folder = selectedItem.Folder; int selectedIndex = selector.SelectedIndex; var data = new PokemonDragDropData(selectedItem, DragDropActions.All, folder, selectedIndex); var dataObj = new DataObject(typeof(IDragDropData), data); DragDrop.DoDragDrop(selector, dataObj, DragDropEffects.All); }
private static void CopyItemTo(IFolderViewModel folder, int destIndex, PokemonDragDropData data) { folder.InsertPokemon(destIndex, data.Pokemon.Clone()); }
private static void SwapItem(IFolderViewModel folder, int swapIndex, PokemonDragDropData data) { PokemonViewModel pokemon = data.Pokemon; int originalIndex = data.PokemonIndexInFolder; PokemonViewModel swapPokemon = folder.Pokemons[swapIndex]; folder.RemovePokemon(swapPokemon); data.SourceFolder.RemovePokemon(pokemon); if (data.SourceFolder == folder && swapIndex < originalIndex)//swap within a folder { folder.InsertPokemon(swapIndex, pokemon); folder.InsertPokemon(originalIndex, swapPokemon); /* if (swapIndex < originalIndex) { } else { folder.InsertPokemon(originalIndex, swapPokemon); folder.InsertPokemon(swapIndex, pokemon); } */ } else//swap between folders { data.SourceFolder.InsertPokemon(originalIndex, swapPokemon); folder.InsertPokemon(swapIndex, pokemon); } }
private static void SubstitueItem(IFolderViewModel folder, int destIndex, PokemonDragDropData data) { folder.Pokemons[destIndex].RemoveSelf(); folder.InsertPokemon(destIndex, data.Pokemon.Clone()); }
private static void MoveItemTo(IFolderViewModel folder, int destIndex, PokemonDragDropData data) { //remove the origin item to prevent exceeding the size data.SourceFolder.RemovePokemon(data.Pokemon); //adjust index if it is movement within a folder if (folder == data.SourceFolder && destIndex > data.PokemonIndexInFolder) destIndex--; folder.InsertPokemon(destIndex, data.Pokemon); }