是否可以在wpf中重新排列选项卡控件中的选项卡项?

Fir*_*nov 11 wpf wpftoolkit wpf-controls

是否可以在运行时重新排列选项卡控件中的选项卡项?例如,我有3个关于汽车的标签项目和关于房子的4个标签.我希望能够使用拖放重新排列它们.它有可能还是它太棒了?

我有Tab Control这里是XAML.

<TabControl x:Name="tc" Visibility="Collapsed" GotFocus="Focus" AllowDrop="True" >
            </TabControl>
Run Code Online (Sandbox Code Playgroud)

选项卡项将在运行时添加.谢谢你的帮助!

cst*_*ler 23

在MSDN论坛上找到了解决方案.

链接在这里:

DragDrop TabItem

这是解决方案:

C#解决方案

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>
Run Code Online (Sandbox Code Playgroud)

C#代码背后:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案!其他建议:如果要重新排序而不切换选项卡,请取消注释最后两行。另外,如果您实现了关闭按钮,请检查`!(e.OriginalSource是Button)`。 (2认同)