我通过拖放来构建布局管理,以移动和重新排序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?