首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MPF创建虚拟节点?

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

Stack Overflow用户
提问于 2010-11-01 22:00:05
回答 1查看 341关注 0票数 1

我正在使用MPF创建一个新的项目类型。

我想创建一种类型的节点,其中该节点的支持实际上并不存在。为了简单起见,我只想即时生成字幕。

我已经从HierarchyNode创建了一个新的节点子类,因为它最终将具有子类。我已经划分了FolderNode的子类,这样我就可以确定哪些文件夹将把这些虚拟节点作为子节点。我正在使用Get/SetMetadata来做这件事,它工作得很好。我覆盖了MyFolderNode中的GetProperty,所以如果文件夹类型是“普通”文件夹,它只会路由到基本文件夹。否则,它将返回FirstChild的VirtualNode。VirtualNodes创建它们下一个同级并将NextSibling设置为它。TL;DR:代码如下。

我的问题是它不工作。具体地说,当我点击“展开这个文件夹”图标时,它变成了蓝色(所以点击是注册的),但它仍然是蓝色的,节点也没有展开。调试表明,试图展开该文件夹确实会遇到请求FirstChild的GetProperty,并且它确实会返回第一个子文件夹的id。在此之后,将查询VirtualNode两次以查看它是否可扩展。然后向其查询标题。然后是图标。然后就什么都没有了。

下面是我的FolderNode子类的代码:

代码语言:javascript
复制
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;
    }
}

下面是我的VirtualNode的代码:

代码语言:javascript
复制
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; }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-02 00:12:22

明白了!(附注:我以前从来没有回答过自己的问题。)

问题似乎在于HierarchyNode.GetIconHandle(bool open)只是返回null。在VirtualNode中覆盖GetIconHandle可使其按预期显示。所以我把这个添加到VirtualNode和bada bing,bada boom中:

代码语言:javascript
复制
    public override object GetIconHandle(bool open)
    {
        return ProjectMgr.ImageHandler.GetIconHandle(open ? (int)ProjectNode.ImageName.OpenFolder : (int)ProjectNode.ImageName.Folder);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4069533

复制
相关文章

相似问题

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