是否有可能使WinForms Tab Control能够像IE或Firefox一样进行选项卡重新排序?

Kev*_*eus 9 .net c# tabcontrol tabpage winforms

是否可以TabControl在运行时重新排序WinForms 中的选项卡,如IE或Firefox?

像这样的链接并没有给我太多希望.

Cod*_*ray 9

当然,这是可能的!您最有可能尝试使解决方案过于复杂.基本上,您所要做的就是为标准创建子类,TabControl并为鼠标事件处理程序添加一些逻辑.您只需要检查用户当前拖动的表单,然后在TabPages集合中重新排序.

网上有几个完整的解决方案:


Jac*_*ley 6

我发现@Cody Gray最初发布的解决方案大部分都是我想要的,但我没有看到它需要如此复杂.

这是我的简化,通过派生TabControl实现:

public class DraggableTabControl : TabControl
{
    private TabPage m_DraggedTab;

    public DraggableTabControl()
    {
        MouseDown += OnMouseDown;
        MouseMove += OnMouseMove;
    }

    private void OnMouseDown(object sender, MouseEventArgs e)
    {
        m_DraggedTab = TabAt(e.Location);
    }

    private void OnMouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button != MouseButtons.Left || m_DraggedTab == null)
        {
            return;
        }

        TabPage tab = TabAt(e.Location);

        if (tab == null || tab == m_DraggedTab)
        {
            return;
        }

        Swap(m_DraggedTab, tab);
        SelectedTab = m_DraggedTab;
    }

    private TabPage TabAt(Point position)
    {
        int count = TabCount;

        for (int i = 0; i < count; i++)
        {
            if (GetTabRect(i).Contains(position))
            {
                return TabPages[i];
            }
        }

        return null;
    }

    private void Swap(TabPage a, TabPage b)
    {
        int i = TabPages.IndexOf(a);
        int j = TabPages.IndexOf(b);
        TabPages[i] = b;
        TabPages[j] = a;
    }
}
Run Code Online (Sandbox Code Playgroud)

拖放API实际上是用于在单独的应用程序之间拖动内容,或者至少是单独的控件.在这种情况下使用它们是过度的.

如果你支持我的话,请确保你也支持Cody的答案,因为它是基于他的.