博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XtraTabControl(DEV中选项卡)分页实现拖拽 效果
阅读量:6163 次
发布时间:2019-06-21

本文共 3951 字,大约阅读时间需要 13 分钟。

hot3.png

用到的命名空间是:
using DevExpress.XtraTab;    using DevExpress.XtraTab.ViewInfo;
用到的变量:
private Rectangle rectDragBoxFromMouseDown;    private bool isDragging = false;    private Point dragOffset = Point.Empty;
创建所用到的函数:
private void CalcRectDragBox(int x, int y)    {        // Remember the point where the mouse down occurred. The DragSize indicates        // the size that the mouse can move before a drag event should be started.        Size dragSize = SystemInformation.DragSize;        // Create a rectangle using the DragSize, with the mouse position being        // at the center of the rectangle.        rectDragBoxFromMouseDown = new Rectangle(new Point((int)x - (dragSize.Width / 2), (int)y - (dragSize.Height / 2)), dragSize);    }    private int FindIndex(XtraTabPage page)    {        int i = 0;        while (i < xtcMain.TabPages.Count)        {            if (xtcMain.TabPages[i].Equals(page))            {                return i;            }            i += 1;        }        return -1;    }
在 DragOver 事件中的code:
XtraTabHitInfo hinfo = default(XtraTabHitInfo);    XtraTabPage hoverTab = default(XtraTabPage);    XtraTabPage dragTab = default(XtraTabPage);    XtraTabPage selTab = default(XtraTabPage);    XtraTabPage repTab = default(XtraTabPage);    //    int itemDragIndex = 0;    int dropLocationIndex = 0;    //    // get the tab we are hovering over.    hinfo = xtcMain.CalcHitInfo(xtcMain.PointToClient(new Point(e.X, e.Y)));    //    if ((hinfo.Page != null))    {        hoverTab = hinfo.Page;        //Make sure there is a TabPage being dragged.        if (e.Data.GetDataPresent(typeof(XtraTabPage)))        {            e.Effect = DragDropEffects.Move;            dragTab = (XtraTabPage)e.Data.GetData(typeof(XtraTabPage));            // can't use the TabIndex on the control because it changes            // when we move the tab page.            itemDragIndex = FindIndex(dragTab);            dropLocationIndex = FindIndex(hoverTab);            //Don't do anything if we are hovering over ourself.            if (itemDragIndex != dropLocationIndex)            {                selTab = xtcMain.TabPages[itemDragIndex];                repTab = xtcMain.TabPages[dropLocationIndex];                //                xtcMain.TabPages.Move(dropLocationIndex, selTab);                xtcMain.TabPages.Move(itemDragIndex, repTab);                xtcMain.SelectedTabPage = selTab;            }        }    }    else    {        e.Effect = DragDropEffects.None;    }
在 MouseDown 事件中的code:
CalcRectDragBox(e.X, e.Y);    // Handle Mouse move only if left button is pressed.    if (e.Button == MouseButtons.Left)    {        // If the mouse moves outside the rectangle, start the drag.        if (!rectDragBoxFromMouseDown.Equals(Rectangle.Empty) & !rectDragBoxFromMouseDown.Contains(e.X, e.Y))        {            isDragging = true;            dragOffset = new Point(e.X, e.Y);            Invalidate();            // Proceed with the drag and drop.            DragDropEffects dropEffect = DoDragDrop(xtcMain.SelectedTabPage, DragDropEffects.Move);            // Reset the drag box to avoid reentry of drag.            CalcRectDragBox(e.X, e.Y);            isDragging = false;            dragOffset = Point.Empty;            Invalidate();        }    }
如果你有不同大小的标签,张贴的代码将导致快如闪电的标签之间切换,如果您对重叠的区域的大小不同悬停。 为了防止这种情况,我只是说在dragOver处理一个简单的标志,忽略未来DragOver事件。 在上面的DragOver里面相应的 位置加入这个标志ignoreNextDrag,具体代码如下:
if (itemDragIndex != dropLocationIndex && !ignoreNextDrag)    {        ignoreNextDrag = true;        selTab = tabControlClientModules.TabPages[itemDragIndex];        repTab = tabControlClientModules.TabPages[dropLocationIndex];        //        tabControlClientModules.TabPages.Move(dropLocationIndex, selTab);        tabControlClientModules.TabPages.Move(itemDragIndex, repTab);        tabControlClientModules.SelectedTabPage = selTab;    }    else    {        ignoreNextDrag = false;    }
 

转载于:https://my.oschina.net/cookblack/blog/621430

你可能感兴趣的文章
KubeEdge向左,K3S向右
查看>>
DTCC2013:基于网络监听数据库安全审计
查看>>
CCNA考试要点大搜集(二)
查看>>
ajax查询数据库时数据无法更新的问题
查看>>
Kickstart 无人职守安装,终于搞定了。
查看>>
linux开源万岁
查看>>
linux/CentOS6忘记root密码解决办法
查看>>
25个常用的Linux iptables规则
查看>>
集中管理系统--puppet
查看>>
Exchange 2013 PowerShell配置文件
查看>>
JavaAPI详解系列(1):String类(1)
查看>>
HTML条件注释判断IE<!--[if IE]><!--[if lt IE 9]>
查看>>
发布和逸出-构造过程中使this引用逸出
查看>>
使用SanLock建立简单的HA服务
查看>>
Subversion使用Redmine帐户验证简单应用、高级应用以及优化
查看>>
Javascript Ajax 异步请求
查看>>
DBCP连接池
查看>>
cannot run programing "db2"
查看>>
mysql做主从relay-log问题
查看>>
Docker镜像与容器命令
查看>>