J'ai trouvé le solution Posté par @Cody gris pour être la plupart du temps ce que je voulais, mais je ne vois pas la nécessité pour qu'il soit si compliqué.
C'est ma simplification, mis en œuvre en dérivant de 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;
}
}
Les API de glisser-déposer sont vraiment destinés à traîner des choses entre des applications distinctes, ou à tout le moins, des contrôles séparés. Les utiliser dans ce cas est exagéré.
Assurez-vous que la réponse de Cody a été également mise en doute si vous faites la mienne, car elle est basée sur la sienne.
Oui, j'ai déjà lié à ce même échantillon dans ma réponse. Il y a plusieurs mois. –