//--------------------------------------------------------------------------------------------------------- /// <summary> /// Событие возникает, когда данные сбрасываются над объектом-приемником; по умолчанию это происходит /// при отпускании кнопки мыши /// </summary> /// <param name="sender">Источник события</param> /// <param name="args">Аргументы события</param> //--------------------------------------------------------------------------------------------------------- private void OnTreeView_Drop(Object sender, DragEventArgs args) { if (args.Data.GetDataPresent(nameof(ICubeXModel))) { ICubeXModel model = args.Data.GetData(nameof(ICubeXModel)) as ICubeXModel; // Над этим элементом находится перетаскиваемый объект TreeViewItem over_item = ((DependencyObject)args.OriginalSource).FindVisualParent <TreeViewItem>(); if (over_item != null) { if (DropModelOverCollectionModel(model, over_item, args)) { } else { if (DropModelOverModel(model, over_item, args)) { } else { } } } } }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Перемещение курсора мыши /// </summary> /// <param name="sender">Источник события</param> /// <param name="args">Аргументы события</param> //--------------------------------------------------------------------------------------------------------- private void OnTreeView_PreviewMouseMove(Object sender, MouseEventArgs args) { // Получаем позицию курсора Point mouse_pos = args.GetPosition(treeExplorer); Vector diff = mDragLastMouseDown - mouse_pos; // Проверяем смещение if (AllowDrop && args.LeftButton == MouseButtonState.Pressed && (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)) { // Получаем визуальный элемент TreeViewItem drag_tree_view_item = ((DependencyObject)args.OriginalSource).FindVisualParent <TreeViewItem>(); if (drag_tree_view_item == null) { return; } IsDragging = true; // Получаем данные ICubeXModel model = drag_tree_view_item.DataContext as ICubeXModel; DraggedModel = model; // Если модель поддерживает if (model is ICubeXUIModelSupportExplore) { ICubeXUIModelSupportExplore model_support_explore = model as ICubeXUIModelSupportExplore; if (model_support_explore.IsDraggableModel == false) { return; } } var drag_data = new DataObject(nameof(ICubeXModel), model); if (Keyboard.IsKeyDown(Key.LeftCtrl)) { // Копируем DragDrop.DoDragDrop(drag_tree_view_item, drag_data, DragDropEffects.Copy); } else { // Переносим DragDrop.DoDragDrop(drag_tree_view_item, drag_data, DragDropEffects.Move); } } }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Установка свойств по группированию /// </summary> /// <param name="model">Модель</param> /// <param name="over">Другой элемент</param> //--------------------------------------------------------------------------------------------------------- public void SetGroupProperties(ICubeXModel model, ICubeXModel over) { if (mIsGroupHierarchy) { if (over != null) { if (over is ICubeXModelOwned) { if (model is ICubeXModelOwned) { ICubeXModelOwned model_owned = model as ICubeXModelOwned; ICubeXModelOwned over_owned = over as ICubeXModelOwned; model_owned.SetPropertyValueFromGroupingHierarchy(over_owned.GetGroupingFromHierarchyOfOwner()); } } } else { } } }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Бросание модели над коллекцией моделей /// </summary> /// <param name="model">Модель</param> /// <param name="item">Коллекция</param> /// <param name="args">Аргументы события</param> /// <returns>Статус обработки события</returns> //--------------------------------------------------------------------------------------------------------- public Boolean DropModelOverCollectionModel(ICubeXModel model, TreeViewItem item, DragEventArgs args) { ICubeXCollectionModel collection_model = item.DataContext as ICubeXCollectionModel; // Если коллекция поддерживает данную модель if (collection_model != null && collection_model.IsSupportModel(model as ICubeXModelOwned)) { // Проверка на поддержку операции добавления ICubeXCollectionSupportAdd operation_add = item.DataContext as ICubeXCollectionSupportAdd; if (operation_add != null) { if (args.Effects == DragDropEffects.Move) { ICubeXModelOwned model_owned = model as ICubeXModelOwned; SetGroupProperties(model_owned, operation_add.IModels[0] as ICubeXModelOwned); operation_add.AddExistingModel(model_owned); } else { if (args.Effects == DragDropEffects.Copy) { ICubeXModelOwned model_owned = model.Clone() as ICubeXModelOwned; SetGroupProperties(model_owned, operation_add.IModels[0] as ICubeXModelOwned); operation_add.AddExistingModel(model_owned); } } } return(true); } return(false); }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Событие постоянно возникает при перетаскивании данных над объектом-приемником /// </summary> /// <param name="sender">Источник события</param> /// <param name="args">Аргументы события</param> //--------------------------------------------------------------------------------------------------------- private void OnTreeView_DragOver(Object sender, DragEventArgs args) { if (args.Data.GetDataPresent(nameof(ICubeXModel))) { ICubeXModel model = args.Data.GetData(nameof(ICubeXModel)) as ICubeXModel; // Над этим элементом находится перетаскиваемый объект TreeViewItem over_item = ((DependencyObject)args.OriginalSource).FindVisualParent <TreeViewItem>(); if (over_item != null) { ICubeXCollectionModel collection_model = over_item.DataContext as ICubeXCollectionModel; if (collection_model != null && collection_model.IsSupportModel(model as ICubeXModelOwned)) { } else { ICubeXModelOwned model_owned = over_item.DataContext as ICubeXModelOwned; if (model_owned != null) { ICubeXCollectionModel model_owned_collection = model_owned.IOwner; if (model_owned_collection != null && model_owned_collection.IsSupportModel(model as ICubeXModelOwned)) { } else { args.Effects = DragDropEffects.None; } } else { args.Effects = DragDropEffects.None; } } } } }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Отпускания левой кнопки мыши /// </summary> /// <param name="sender">Источник события</param> /// <param name="args">Аргументы события</param> //--------------------------------------------------------------------------------------------------------- private void OnTreeView_PreviewMouseLeftButtonUp(Object sender, MouseButtonEventArgs args) { IsDragging = false; DraggedModel = null; }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Бросание модели над другой моделью /// </summary> /// <param name="model">Модель</param> /// <param name="item">Модель</param> /// <param name="args">Аргументы события</param> /// <returns>Статус обработки события</returns> //--------------------------------------------------------------------------------------------------------- public Boolean DropModelOverModel(ICubeXModel model, TreeViewItem item, DragEventArgs args) { // Элемент находится над моделей ICubeXModelOwned model_over = item.DataContext as ICubeXModelOwned; if (model_over != null) { // Сначала проверяем возможность вставки в конкретное место ICubeXCollectionSupportInsert operation_insert = model_over.IOwner as ICubeXCollectionSupportInsert; if (operation_insert != null && operation_insert.IsSupportModel(model as ICubeXModelOwned)) { if (args.Effects == DragDropEffects.Move) { ICubeXModelOwned model_owned = model as ICubeXModelOwned; SetGroupProperties(model_owned, model_over); operation_insert.InsertAfterModel(model_over, model_owned); } else { if (args.Effects == DragDropEffects.Copy) { ICubeXModelOwned model_owned = model.Clone() as ICubeXModelOwned; SetGroupProperties(model_owned, model_over); operation_insert.InsertAfterModel(model_over, model_owned); } } } else { // Проверяем возможность простого добавления ICubeXCollectionSupportAdd operation_add = model_over.IOwner as ICubeXCollectionSupportAdd; if (operation_add != null && operation_add.IsSupportModel(model as ICubeXModelOwned)) { if (args.Effects == DragDropEffects.Move) { ICubeXModelOwned model_owned = model as ICubeXModelOwned; SetGroupProperties(model_owned, model_over); operation_add.AddExistingModel(model_owned); } else { if (args.Effects == DragDropEffects.Copy) { ICubeXModelOwned model_owned = model.Clone() as ICubeXModelOwned; SetGroupProperties(model_owned, model_over); operation_add.AddExistingModel(model_owned); } } } } } return(false); }