Как предотвратить событие DragOver родительского элемента - PullRequest
0 голосов
/ 19 октября 2018

Я создаю управление макетом с помощью Drag & Drop для перемещения и изменения порядка TabItems.

XAML Пример:

<Canvas PreviewDragOver="Canvas_PreviewDragOver">
  <TabControl>
    <TabItem PreviewMouseMove="TabItem_PreviewMouseMove" PreviewDragOver="TabItem_PreviewDragOver"/>
    <TabItem PreviewMouseMove="TabItem_PreviewMouseMove" PreviewDragOver="TabItem_PreviewDragOver"/>
  </TabControl>
</Canvas>

При щелчке мышью я активирую dragInProgress и сохраняю нажатый TabItemв tiSource.После завершения перетаскивания снова устанавливается значение false.

TabItem_PreviewMouseMove

private void TabItem_PreviewMouseMove(object sender, MouseEventArgs e)
    {
      if (dragInProgress)
      {
        if (tiSource != null)
          DragDrop.DoDragDrop(tiSource, tiSource, DragDropEffects.Move);

        dragInProgress = false;
      }
    }

При перетаскивании элемента TabItem я вставляю перетаскиваемый элемент TabItem в целевой элемент TabControl.Я хочу вставить его до или позади, в соответствии с положением мыши.

TabItem_PreviewDragOver

private void TabItem_PreviewDragOver(object sender, DragEventArgs e)
    {
      ...
      int insertIndex;
      double tiWidth = tiTarget.RenderSize.Width;
      Point p = e.GetPosition(tiTarget);

      if (p.X < tiWidth / 2) insertIndex = targetIndex; //before target TabItem
      if (p.X > tiWidth / 2) insertIndex = targetIndex + 1; //behind target TabItem

      tcTarget.Items.Insert(insertIndex, tiSource);
      tcTarget.SelectedIndex = insertIndex;
    }

Если я перетаскиваю TabItem из TabControl поверх Canvas, онсоздает новый TabControl и вставляет его туда, чтобы я мог расположить вкладку снаружи.

Canvas_PreviewDragOver

private void Canvas_PreviewDragOver(object sender, DragEventArgs e)
    {
      ...
          if (tcSource.Items.Count == 1) //If TabControl has only one TabItem, move the TabControl
          {
            Canvas.SetLeft(tcSource, e.GetPosition(canvas).X);
            Canvas.SetTop(tcSource, e.GetPosition(canvas).Y);
          }
          else //If there are more TabItems, release the dragged TabItem and add to new TabControl
          {
            TabControl tcNew = new TabControl();

            tcSource.Items.Remove(tiSource);
            tcNew.Items.Add(tiSource);
            canvas.Children.Add(tcNew);
            tcSource = tcNew;
          }
        }
      }
    }

Если я перетаскиваю TabItem на правой половинедругой TabItem, он вставляет его позади него правильно.Если я перетаскиваю его в левую половину, он перемещает TabItems вправо и вставляет его перед целевым TabItem.

Проблема: Но если он перемещает TabItems вправо,мышь больше не находится над целевым элементом, и DragOver of Canvas запускается, чтобы создать новый TabControl.Так что я могу вставлять только TabItems за целью, но не раньше.

Я пытался установить e.handled = true в TabControl, но затем перетаскивание TabItem больше не срабатывает.

Есть ли способ предотвратить Canvas_PreviewDragOver при вставке TabItem с более низким индексом, чем целевой TabItem?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...