Is it possible to rearrange tab items in tab control in wpf?

后端 未结 2 1026
情书的邮戳
情书的邮戳 2021-02-04 09:39

Is it possible to rearrange tab items in tab control in run time? For example I have 3 tab items which are about cars and 4 tabs about house. I want to be able to rearrange them

相关标签:
2条回答
  • 2021-02-04 10:08

    When I tried to implement this solution, the drop event was firing twice (moving the tabs but them immediately moving them back). I had to add an integer to keep track of the last tab target index. My solution is in 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
    
    0 讨论(0)
  • 2021-02-04 10:09

    found a solution in the MSDN forum.

    Here is the link:

    DragDrop TabItem

    Here is the solution:

    C# solution

    WPF code:

    <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>
    

    C# code behind:

    private void TabItem_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        if (!(e.Source is TabItem tabItem))
        {
            return;
        }
    
        if (Mouse.PrimaryDevice.LeftButton == MouseButtonState.Pressed)
        {
            DragDrop.DoDragDrop(tabItem, tabItem, DragDropEffects.All);
        }
    }
    
    private void TabItem_Drop(object sender, DragEventArgs e)
    {
        if (e.Source is TabItem tabItemTarget &&
            e.Data.GetData(typeof(TabItem)) is TabItem tabItemSource &&
            !tabItemTarget.Equals(tabItemSource) &&
            tabItemTarget.Parent is TabControl tabControl)
        {
            int targetIndex = tabControl.Items.IndexOf(tabItemTarget);
    
            tabControl.Items.Remove(tabItemSource);
            tabControl.Items.Insert(targetIndex, tabItemSource);
            tabItemSource.IsSelected = true;
        }
    }
    
    0 讨论(0)
提交回复
热议问题