Я создаю управление макетом с помощью 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?