Kev*_*eus 9 .net c# tabcontrol tabpage winforms
是否可以TabControl在运行时重新排序WinForms 中的选项卡,如IE或Firefox?
像这样的链接并没有给我太多希望.
当然,这是可能的!您最有可能尝试使解决方案过于复杂.基本上,您所要做的就是为标准创建子类,TabControl并为鼠标事件处理程序添加一些逻辑.您只需要检查用户当前拖动的表单,然后在TabPages集合中重新排序.
网上有几个完整的解决方案:
我发现@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的答案,因为它是基于他的.