重新排序WPF TabControl中的选项卡

tom*_*om7 14 .net wpf drag-and-drop tabcontrol wpf-controls

有没有一种简单的方法来自定义WPF TabControl,以便它支持TabItem拖放 - 类似于IE和Firefox所做的.

rmo*_*ore 21

您可以使用或开始使用Bea Stollnitz现有的用于在项目控件中拖放的帮助程序.她提到它确实有一些限制,但它是一个很好的起点,并且可能会像你需要的大多数功能一样工作.

导入DragDropHelper和Adorner类之后,将它们与TabControl一起使用非常简单(因为它是ItemsControl的后代).

设置一个简单的拖动模板,以及TabControl上的属性都是我们需要的.由于解决方案设置为处理数据绑定项的拖动,如果您的选项卡在XAML中静态声明而不是使用TabControl.ItemsSource,那么您可以将它们的DataContext绑定到自己.

<Window x:Class="Samples.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:dd="clr-namespace:DragDropListBox"
    Title="Dragging TabItems"
    Height="300"
    Width="300">

<Window.Resources>
    <DataTemplate x:Key="Local_TabItemDragTemplate">
        <Border CornerRadius="5"
                BorderBrush="Black"
                BorderThickness="2"
                Background="DodgerBlue">
            <TextBlock Margin="5"
                       Text="{Binding Path=Header}" />
        </Border>
    </DataTemplate>
</Window.Resources>

<StackPanel>
    <TabControl dd:DragDropHelper.IsDragSource="true"
                dd:DragDropHelper.IsDropTarget="true"
                dd:DragDropHelper.DragDropTemplate="{StaticResource Local_TabItemDragTemplate}">
        <TabControl.ItemContainerStyle>
            <Style TargetType="{x:Type TabItem}">
                <Setter Property="DataContext"
                        Value="{Binding RelativeSource={RelativeSource Self}}" />
            </Style>
        </TabControl.ItemContainerStyle>
        <TabItem Header="Tab 1" />
        <TabItem Header="Tab 2" />
        <TabItem Header="Tab 3" />
        <TabItem Header="Tab 4" />
    </TabControl>
    <TabControl dd:DragDropHelper.IsDragSource="true"
                dd:DragDropHelper.IsDropTarget="true"
                dd:DragDropHelper.DragDropTemplate="{StaticResource Local_TabItemDragTemplate}">
        <TabControl.ItemContainerStyle>
            <Style TargetType="{x:Type TabItem}">
                <Setter Property="DataContext"
                        Value="{Binding RelativeSource={RelativeSource Self}}" />
            </Style>
        </TabControl.ItemContainerStyle>
        <TabItem Header="Tab 5" />
        <TabItem Header="Tab 6" />
        <TabItem Header="Tab 7" />
        <TabItem Header="Tab 8" />
    </TabControl>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

alt text http://i27.tinypic.com/xc7okg.png