How to make TabPages draggable?

前端 未结 3 1773
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-13 07:42

I\'d like to enable user to rearrange TabPages order by dragging and dropping. Moreover it\'d be cool to enable user to drag TabPages from one TabControl to another. Both th

3条回答
  •  花落未央
    2021-01-13 08:38

    reordering TabPages with drag and drop - by Ludwig B.
    inspired by http://dotnetrix.co.uk/tabcontrol.htm#tip7

            private void tc_MouseDown(object sender, MouseEventArgs e)
            {
                // store clicked tab
                TabControl tc = (TabControl)sender;
                int hover_index = this.getHoverTabIndex(tc);
                if (hover_index >= 0) { tc.Tag = tc.TabPages[hover_index]; }
            }
            private void tc_MouseUp(object sender, MouseEventArgs e)
            {
                // clear stored tab
                TabControl tc = (TabControl)sender;
                tc.Tag = null;
            }
            private void tc_MouseMove(object sender, MouseEventArgs e)
            {           
                // mouse button down? tab was clicked?
                TabControl tc = (TabControl)sender;
                if ((e.Button != MouseButtons.Left) || (tc.Tag == null)) return;
                TabPage clickedTab = (TabPage)tc.Tag;
                int clicked_index = tc.TabPages.IndexOf(clickedTab);
    
                // start drag n drop
                tc.DoDragDrop(clickedTab, DragDropEffects.All);
            }
            private void tc_DragOver(object sender, DragEventArgs e)
            {
                TabControl tc = (TabControl)sender;
    
                // a tab is draged?
                if (e.Data.GetData(typeof(TabPage)) == null) return;
                TabPage dragTab = (TabPage)e.Data.GetData(typeof(TabPage));
                int dragTab_index = tc.TabPages.IndexOf(dragTab);
    
                // hover over a tab?
                int hoverTab_index = this.getHoverTabIndex(tc);
                if (hoverTab_index < 0) { e.Effect = DragDropEffects.None; return; }
                TabPage hoverTab = tc.TabPages[hoverTab_index];
                e.Effect = DragDropEffects.Move;
    
                // start of drag?
                if (dragTab == hoverTab) return;
    
                // swap dragTab & hoverTab - avoids toggeling
                Rectangle dragTabRect = tc.GetTabRect(dragTab_index);
                Rectangle hoverTabRect = tc.GetTabRect(hoverTab_index);
    
                if (dragTabRect.Width < hoverTabRect.Width)
                {
                    Point tcLocation = tc.PointToScreen(tc.Location);
    
                    if (dragTab_index < hoverTab_index)
                    {
                        if ((e.X - tcLocation.X) > ((hoverTabRect.X + hoverTabRect.Width) - dragTabRect.Width))
                            this.swapTabPages(tc, dragTab, hoverTab);
                    }
                    else if (dragTab_index > hoverTab_index)
                    {
                        if ((e.X - tcLocation.X) < (hoverTabRect.X + dragTabRect.Width))
                            this.swapTabPages(tc, dragTab, hoverTab);
                    }
                }
                else this.swapTabPages(tc, dragTab, hoverTab);
    
                // select new pos of dragTab
                tc.SelectedIndex = tc.TabPages.IndexOf(dragTab);
            }
    
            private int getHoverTabIndex(TabControl tc)
            {
                for (int i = 0; i < tc.TabPages.Count; i++)
                {
                    if (tc.GetTabRect(i).Contains(tc.PointToClient(Cursor.Position)))
                        return i;
                }
    
                return -1;
            }
    
            private void swapTabPages(TabControl tc, TabPage src, TabPage dst)
            {
                int index_src = tc.TabPages.IndexOf(src);
                int index_dst = tc.TabPages.IndexOf(dst);
                tc.TabPages[index_dst] = src;
                tc.TabPages[index_src] = dst;
                tc.Refresh();
            }
    

提交回复
热议问题