Возможно ли переупорядочить элементы табуляции в элементе управления вкладками в wpf?
Возможно ли переупорядочить элементы табуляции в элементе управления вкладками во время выполнения? Например, у меня есть 3 вкладки, которые касаются автомобилей и 4 вкладки о доме. Я хочу иметь возможность переупорядочивать их с помощью перетаскивания. Возможно ли это или это что-то фантастическое?
У меня есть Tab Control здесь XAML.
<TabControl x:Name="tc" Visibility="Collapsed" GotFocus="Focus" AllowDrop="True" >
</TabControl>
Элементы табуляции будут добавлены во время выполнения.
Спасибо, что помогли мне!
Ответы
Ответ 1
нашел решение на форуме MSDN.
Вот ссылка:
DragTrop TabItem
Вот решение:
Решение С#
Код WPF:
<TabControl>
<TabControl.Resources>
<Style TargetType="TabItem">
<Setter Property="AllowDrop" Value="True"/>
<EventSetter Event="PreviewMouseMove" Handler="TabItem_PreviewMouseMove"/>
<EventSetter Event="Drop" Handler="TabItem_Drop"/>
</Style>
</TabControl.Resources>
<TabItem Header="Tabitem 1"/>
<TabItem Header="Tabitem 2"/>
<TabItem Header="Tabitem 3"/>
<TabItem Header="Tabitem 4"/>
<TabItem Header="Tabitem 5"/>
</TabControl>
Код С# позади:
private void TabItem_PreviewMouseMove(object sender, MouseEventArgs e)
{
var tabItem = e.Source as TabItem;
if (tabItem == null)
return;
if (Mouse.PrimaryDevice.LeftButton == MouseButtonState.Pressed)
{
DragDrop.DoDragDrop(tabItem, tabItem, DragDropEffects.All);
}
}
private void TabItem_Drop(object sender, DragEventArgs e)
{
var tabItemTarget = e.Source as TabItem;
var tabItemSource = e.Data.GetData(typeof(TabItem)) as TabItem;
if (!tabItemTarget.Equals(tabItemSource))
{
var tabControl = tabItemTarget.Parent as TabControl;
int sourceIndex = tabControl.Items.IndexOf(tabItemSource);
int targetIndex = tabControl.Items.IndexOf(tabItemTarget);
tabControl.Items.Remove(tabItemSource);
tabControl.Items.Insert(targetIndex, tabItemSource);
tabControl.Items.Remove(tabItemTarget);
tabControl.Items.Insert(sourceIndex, tabItemTarget);
}
}
Ответ 2
Когда я попытался реализовать это решение, событие drop срабатывало дважды (перемещая вкладки, но они немедленно перемещали их назад). Мне пришлось добавить целое число, чтобы отслеживать целевой индекс последней вкладки. Мое решение в VB.NET
'additional variable
Dim lastTabTargetIndex As Integer = Nothing
Private Sub tc1_PreviewMouseMove(sender As Object, e As MouseEventArgs) Handles tc1.PreviewMouseMove
Dim Tabi = TryCast(e.Source, TabItem)
If Tabi Is Nothing Then
Exit Sub
Else
If Mouse.PrimaryDevice.LeftButton = MouseButtonState.Pressed Then
DragDrop.DoDragDrop(Tabi, Tabi, DragDropEffects.All)
End If
End If
End Sub
Private Sub tc1_Drop(sender As Object, e As DragEventArgs) Handles tc1.Drop
Dim tabItemTarget = TryCast(e.Source, TabItem)
Dim tabItemSource = TryCast(e.Data.GetData(GetType(TabItem)), TabItem)
If Not tabItemTarget.Equals(tabItemSource) Then
Dim tabControl = TryCast(tabItemTarget.Parent, TabControl)
Dim sourceIndex As Integer = tabControl.Items.IndexOf(tabItemSource)
Dim targetIndex As Integer = tabControl.Items.IndexOf(tabItemTarget)
'had to use this extra statement
If sourceIndex <> lastTabTargetIndex Then
'assign lastTabTargetIndex here
lastTabTargetIndex = targetIndex
tabControl.Items.Remove(tabItemSource)
tabControl.Items.Insert(targetIndex, tabItemSource)
tabControl.Items.Remove(tabItemTarget)
tabControl.Items.Insert(sourceIndex, tabItemTarget)
End If
End If
End Sub