Это довольно просто.
Вы уже подготовили правильную настройку:
<dragablz:TabablzControl DragEnter="TabControl_OnDragEnter" AllowDrop="True">
<TabItem Header="FIRST"/>
<TabItem Header="SECOND"/>
<TabItem Header="THIRD"/>
</dragablz:TabablzControl>
AllowDrop
равно true
, и есть обработчик событий DragEnter
с маршрутизацией.Обратите внимание, что это пузырьковое событие, но вы также можете использовать туннелирование PreviewDragEnter
версии.
Волшебство произойдет в обработчике событий.Нам нужно свойство OriginalSource
.Однако это будет какой-то Visual
, представляющий TabItem
, а не сам TabItem
!Вы должны прочитать о стилях и шаблонах WPF, чтобы получить больше информации об этом.Все, что нам нужно, это перейти от того, что представляет Visual
к фактическому TabItem
.Мы можем сделать это, пройдясь по визуальному дереву, пока не найдем элемент:
private void TabControl_OnDragEnter(object sender, DragEventArgs e)
{
// Just a sanity check - we need a Visual here
if (!(e.OriginalSource is Visual v))
{
return;
}
// DragablzItems will represent our TabItems, so we search for those
var item = GetParentOfType<DragablzItem>(v);
// DragablzItem.Content should contain our original TabItem
if (item != null && item.Content is TabItem ti)
{
ti.IsSelected = true;
}
}
И вспомогательный метод GetParentOfType
может выглядеть следующим образом:
static T GetParentOfType<T>(Visual visual) where T : Visual
{
DependencyObject parent = visual;
do
{
parent = VisualTreeHelper.GetParent(parent);
} while (parent != null && !(parent is T));
return parent as T;
}