首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonoDevelop.Components.Docking -选项卡DockGroupType问题

MonoDevelop.Components.Docking -选项卡DockGroupType问题
EN

Stack Overflow用户
提问于 2011-06-22 17:25:29
回答 1查看 630关注 0票数 0

我们的应用程序在我们的MonoDevelop.Components.Docking应用程序中使用了框架。我们上次更新最新版本是在2010年11月。在以下情况下,我遇到了一些有趣的行为:

在折叠面板上按下ParentGroup

  • Hold鼠标中第一个面板的自动隐藏按钮,直到将

  • 拖动面板扩展到选项卡式组的中心(回到原始位置),并将

放到

此时,面板调整到蓝色矩形的大小,该矩形显示面板将被丢弃的位置,然后从主窗口中卸载,以该大小浮动。这种情况只发生在选项卡组的第一项上。我在DockGroupItem.cs中找到了一个注释掉的代码部分(第112行,GetDockTarget(.))这似乎可以解决这个问题。但是,它引用未定义的DockPosition类型CenterAfter。该方法如下所示,注释掉的部分以粗体表示:

代码语言:javascript
复制
public bool GetDockTarget (DockItem item, int px, int py, Gdk.Rectangle rect, out DockDelegate dockDelegate, out Gdk.Rectangle outrect)
{

 dockDelegate = null;                

 if (item != this.item && this.item.Visible && rect.Contains (px,py)) {

      int xdockMargin = (int) ((double)rect.Width * (1.0 - DockFrame.ItemDockCenterArea)) / 2;

      int ydockMargin = (int) ((double)rect.Height * (1.0 - DockFrame.ItemDockCenterArea)) / 2;

      DockPosition pos;                   

/*    if (ParentGroup.Type == DockGroupType.Tabbed) {

            rect = new Gdk.Rectangle (rect.X + xdockMargin, rect.Y + ydockMargin,rect.Width - xdockMargin*2, rect.Height - ydockMargin*2);

            pos = DockPosition.CenterAfter;

      }

*/    if (px <= rect.X + xdockMargin && ParentGroup.Type != DockGroupType.Horizontal) {

            outrect = new Gdk.Rectangle (rect.X, rect.Y, xdockMargin, rect.Height);

            pos = DockPosition.Left;

      }

      else if (px >= rect.Right - xdockMargin && ParentGroup.Type != DockGroupType.Horizontal) {

            outrect = new Gdk.Rectangle (rect.Right - xdockMargin, rect.Y, xdockMargin, rect.Height);

            pos = DockPosition.Right;

      }

      else if (py <= rect.Y + ydockMargin && ParentGroup.Type != DockGroupType.Vertical) {

            outrect = new Gdk.Rectangle (rect.X, rect.Y, rect.Width, ydockMargin);

            pos = DockPosition.Top;

      }

      else if (py >= rect.Bottom - ydockMargin && ParentGroup.Type != DockGroupType.Vertical) {

            outrect = new Gdk.Rectangle (rect.X, rect.Bottom - ydockMargin, rect.Width, ydockMargin);

            pos = DockPosition.Bottom;

      }

      else {

            outrect = new Gdk.Rectangle (rect.X + xdockMargin, rect.Y + ydockMargin, rect.Width - xdockMargin*2, rect.Height - ydockMargin*2);

            pos = DockPosition.Center;
      }          

      dockDelegate = delegate (DockItem dit) {

            DockGroupItem it = ParentGroup.AddObject (dit, pos, Id);

            it.SetVisible (true);

            ParentGroup.FocusItem (it);

      };

      return true;
 }

 outrect = Gdk.Rectangle.Zero;
 return false;
}

我尝试过一些小事情,但到目前为止还没有影响到行为。有什么想法,我可以编辑,以使这个工作正常?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-24 16:31:04

为了解决上面的问题,我添加了一个检查,以查看被停靠的项是否与制表符组中的第一个项相同,如果是,则适当地修改插入索引,因为尝试在组中自身之前插入项会导致浮点问题。因为它的状态是"AutoHide“,所以它在技术上仍然是可见的,所以被保存在选项卡组的可见对象列表中。变化在下面。

DockGroup.cs (第122行)-注释掉索引增加:

代码语言:javascript
复制
public DockGroupItem AddObject (DockItem obj, DockPosition pos, string relItemId)
{
...
else if (pos == DockPosition.CenterBefore || pos == DockPosition.Center) {
                if (type != DockGroupType.Tabbed)
                    gitem = Split (DockGroupType.Tabbed, pos == DockPosition.CenterBefore, obj, npos);
                else {
                    //if (pos == DockPosition.Center) // removed to fix issue with drag/docking the 1st tab item after autohiding 
                        //npos++;
                    gitem = new DockGroupItem (Frame, obj);
                    dockObjects.Insert (npos, gitem);
                    gitem.ParentGroup = this;
                }
            }
            ResetVisibleGroups ();
            return gitem;
}

DockGroup.cs (第912行)-添加了对同一项的检查

代码语言:javascript
复制
internal override bool GetDockTarget (DockItem item, int px, int py, out DockDelegate dockDelegate, out Gdk.Rectangle rect)
        {
            if (!Allocation.Contains (px, py) || VisibleObjects.Count == 0) {
                dockDelegate = null;
                rect = Gdk.Rectangle.Zero;
                return false;
            }

            if (type == DockGroupType.Tabbed) {
                // this is a fix for issue with drag/docking the 1st tab item after autohiding it
                int pos = 0;
                if (item.Id == ((DockGroupItem)VisibleObjects[0]).Id)
                {
                    pos++;
                }

                // Tabs can only contain DockGroupItems
                return ((DockGroupItem)VisibleObjects[pos]).GetDockTarget (item, px, py, Allocation, out dockDelegate, out rect);
            }
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6443976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档