代码之家  ›  专栏  ›  技术社区  ›  Jere.Jones

如何使用MPF创建虚拟节点?

  •  1
  • Jere.Jones  · 技术社区  · 15 年前

    我想创建一种类型的节点,该节点的支持实际上不存在于任何地方。为了简单起见,我只想动态生成标题。

    我的问题是它不起作用。具体地说,当我点击“展开这个文件夹”图标时,它会变成蓝色(所以点击正在注册),但它会保持蓝色并且节点不会展开。调试显示,尝试展开文件夹时,确实会碰到GetProperty请求first child,并且会返回第一个子文件夹的id。之后,将查询VirtualNode两次,以查看它是否可展开。然后查询标题。然后是图标。那就没什么了。

    public class AndroidFolderNode : FolderNode
    {
        public enum FolderType
        {
            Normal,
            JavaSource
        }
    
        public string[] VirtualNodes = new[]
                                        {
                                            "Virtual Node One",
                                            "Virtual Node Two",
                                            "Virtual Node Three"
                                        };
    
        private FolderType mFolderType;
        public FolderType Type
        {
            get
            {
                return mFolderType;
            }
            set
            {
                if (mFolderType != value)
                {
                    mFolderType = value;
                    OnInvalidateItems(this);
                }
            }
        }
    
        private HierarchyNode mVirtualChild;
    
        public AndroidFolderNode(ProjectNode root, string relativePath, ProjectElement element)
            : base(root, relativePath, element)
        {
            var t = element.GetMetadata("Type");
            if (string.IsNullOrWhiteSpace(t))
            {
                Type = FolderType.Normal;
            }
            else
            {
                FolderType tempType;
                if (Enum.TryParse(t, true, out tempType))
                {
                    Type = tempType;
                }
            }
        }
    
        protected override NodeProperties CreatePropertiesObject()
        {
            return new AndroidFolderNodeProperties(this);
        }
    
    
        public override object GetProperty(int propId)
        {
            object result = null;
            switch ((__VSHPROPID) propId)
            {
                case __VSHPROPID.VSHPROPID_FirstChild:
                    goto case __VSHPROPID.VSHPROPID_FirstVisibleChild;
    
                case __VSHPROPID.VSHPROPID_FirstVisibleChild:
                    if (Type == FolderType.Normal)
                    {
                        result = (int)((this.FirstChild != null) ? this.FirstChild.ID : VSConstants.VSITEMID_NIL);
                    }
                    else
                    {
                        if (mVirtualChild == null)
                        {
                            mVirtualChild = new VirtualFolderNode(this, 0);
                        }
                        result = mVirtualChild.ID;
                    }
                    break;
                default:
                    result = base.GetProperty(propId);
                    break;
            }
            return result;
        }
    }
    

    这是我的虚拟代码:

    class VirtualFolderNode : HierarchyNode
    {
        private static Guid _guid = new Guid("DD264E51-2E66-4BCC-A8A6-DE3BDE890DED");
    
        private int mIdx;
        private AndroidFolderNode mParent;
        private VirtualFolderNode mSibling;
    
        public VirtualFolderNode(AndroidFolderNode parent, int idx)
            : base(parent.ProjectMgr)
        {
            mParent = parent;
            mIdx = idx;
            Parent = parent;
    
            if (idx < parent.VirtualNodes.Length)
            {
                mSibling = new VirtualFolderNode(parent, idx + 1);
                NextSibling = mSibling;
            }
        }
    
        public override string Url
        {
            get { return Parent.Url + "\\VNode" + mIdx; }
        }
    
        public override string Caption
        {
            get { return mParent.VirtualNodes[mIdx]; }
        }
    
        public override Guid ItemTypeGuid
        {
            get { return _guid; }
        }
    }
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Jere.Jones    15 年前

    知道了!(旁注:我以前从未回答过自己的问题。)

    问题在于HierarchyNode.GetIconHandle(bool open)只返回null。在VirtualNode中重写GetIconHandle允许它按预期显示。所以我把这个添加到了VirtualNode和bada bing,bada boom:

        public override object GetIconHandle(bool open)
        {
            return ProjectMgr.ImageHandler.GetIconHandle(open ? (int)ProjectNode.ImageName.OpenFolder : (int)ProjectNode.ImageName.Folder);
        }