如何防止父元素的DragOver事件

时间:2018-10-19 10:25:24

标签: c# wpf xaml

我通过拖放来构建布局管理,以移动和重新排序TabItem。

XAML示例:

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

在mouseclick上,我激活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的DragOver上,我将拖动的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并将其插入在那里,因此我可以将Tab放在外面。

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向右移动,则鼠标不再位于目标Item上方,并且Canvas的DragOver会触发以创建新的TabControl。因此,我只能在目标后面插入TabItems,而不能在目标后面。

我尝试在TabControl中设置 e.handled = true ,但是TabItem的DragOver不再触发。

在插入具有比目标TabItem索引低的TabItem时,是否可以防止Canvas_PreviewDragOver?

0 个答案:

没有答案