当前位置: 首页 > 编程语言 > C#

是否可以使WinForms选项卡控件能够像IE或Firefox一样进行选项卡重新排序?Share

时间:2023-04-11 02:53:37 C#

是否可以使WinForms选项卡控件能够像IE或Firefox一样重新排序选项卡?是否可以在运行时对WinFormsTabControl中的选项卡进行重新排序,如IE或Firefox?像这样的链接不会给我太大希望。当然有可能!您很可能试图使解决方案过于复杂。基本上,您所要做的就是继承标准TabControl并为鼠标事件处理程序添加一些逻辑。您只需要检查用户当前正在拖动哪个表单并在TabPages集合中重新排序。网上有几个完整的解决方案:我发现@CodyGray最初发布的解决方案大部分是我想要的,但我没有看到它需要这么复杂。这是我的简化,通过派生TabControl实现:publicclassDraggableTabControl:TabControl{privateTabPagem_DraggedTab;publicDraggableTabControl(){MouseDown+=OnMouseDown;鼠标移动+=OnMouseMove;}privatevoidOnMouseDown(objectsender,MouseEventArgse){m_DraggedTab=TabAt(e.Location);}privatevoidOnMouseMove(objectsender,MouseEventArgse){if(e.Button!=MouseButtons.Left||m_DraggedTab==null){返回;}TabPagetab=TabAt(e.Location);如果(tab==null||tab==m_DraggedTab){返回;}交换(m_DraggedTab,选项卡);SelectedTab=m_DraggedTab;}privateTabPageTabAt(Pointposition){intcount=TabCount;for(inti=0;i拖放API实际上是用于在单独的应用程序之间拖动内容,或者至少是单独的控件。在这种情况下使用它们是矫枉过正的。如果你支持我,请确保你支持Cody的回答,因为它是基于他的。通过拖动重新排序TabPages–由LudwigB.灵魂来自http://dotnetrix.co.uk/tabcontrol.htm#tip7privatevoidtc_MouseDown(objectsender,MouseEventArgse){//storeclickedtabTabControltc=(TabControl)发件人;inthover_index=this.getHoverTabIndex(tc);如果(hover_index>=0){tc.Tag=tc.TabPages[hover_index];}}privatevoidtc_MouseUp(objectsender,MouseEventArgse){//清除存储的标签TabControltc=(TabControl)sender;tc.Tag=null;}privatevoidtc_MouseMove(objectsender,MouseEventArgse){//按下鼠标按钮?标签被点击?TabControltc=(TabControl)发送者;如果((e.Button!=MouseButtons.Left)||(tc.Tag==null))返回;TabPageclickedTab=(TabPage)tc.Tag;intclicked_index=tc.TabPages.IndexOf(clickedTab);//开始拖放tc.DoDragDrop(clickedTab,DragDropEffects.All);}privatevoidtc_DragOver(objectsender,DragEventArgse){TabControltc=(TabControl)sender;//一个选项卡被拖动了吗?如果(e.Data.GetData(类型(TabPage))==空)返回;TabPagedragTab=(TabPage)e.Data.GetData(typeof(TabPage));intdragTab_index=tc.TabPages.IndexOf(dragTab);//将鼠标悬停在选项卡上?inthoverTab_index=this.getHoverTabIndex(tc);如果(hoverTab_index((hoverTabRect.X+hoverTabRect.Width)-dragTabRect.Width))this.swapTabPages(tc,dragTab,hoverTab);}elseif(dragTab_index>hoverTab_index){if((eX-tcLocation.X)我已经扩展了JacobStanley的答案,这样交换就不会经常发生。这对于不同大小的选项卡特别有用,以前的解决方案拖动时经常交换。UX的不同之处在于您必须进一步拖动才能实际移动选项卡。但这类似于浏览器中的选项卡重新排序。我还添加了一个手形光标并在拖动时启用了双缓冲。C#学习教程就是这些:是否可以使WinForms选项卡控件能够像IE或Firefox一样进行选项卡重新排序?如果分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注---usingSystem;使用系统绘图;使用System.Windows.Forms;命名空间控件{publicclassDraggableTabControl:TabControl{privateTabPagedraggedTab;publicDraggableTabControl(){this.MouseDown+=OnMouseDown;this.MouseMove+=OnMouseMove;this.Leave+=newSystem.EventHandler(this.DraggableTabControl_Leave);AllPaintingInWmPaint,真);}privatevoidOnMouseDown(objectsender,MouseEventArgse){draggedTab=TabAt(e.Location);}privatevoidOnMouseMove(objectsender,MouseEventArgse){if(e.Button!=MouseButtons.Left||draggedTab==null){this.Cursor=this.DefaultCursor;draggedTab=null;返回;}intindex=TabPages.IndexOf(draggedTab);intnextIndex=索引+1;intprevIndex=索引-1;intminXForNext=int.最大值;intmaxXForPrev=int.Min价值;vartabRect=GetTabRect(索引);如果(nextIndex=0){varprevTabRect=GetTabRect(prevIndex);maxXForPrev=prevTabRect.Left+tabRect.Width;}this.Cursor=Cursors.Hand;if(e.Location.X>maxXForPrev&&e.Location.X本文采集自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:

最新推荐
猜你喜欢