2010-11-01 31 views
1

我正在使用MPF創建一個新的項目類型。如何製作使用MPF的虛擬節點?

我想創建一個類型的節點,該節點的支持實際上並不存在於任何地方。爲了簡單起見,我只想在飛行中生成字幕。

我已經從HierarchyNode創建了一個新的節點子類,因爲它最終會有子節點。我已將子節點FolderNode子文件夾,以便我可以確定哪些文件夾將這些虛擬節點作爲子節點。我使用Get/SetMetadata來做到這一點,它工作正常。我覆蓋了MyFolderNode中的GetProperty,以便如果文件夾類型是「普通」文件夾,它只是路由到基地。否則,它返回FirstChild的VirtualNode。 VirtualNodes創建他們的下一個兄弟併爲其設置NextSibling。 TL; DR:代碼如下。

我的問題是它不工作。具體來說,當我點擊「展開此文件夾」圖標時,它會變成藍色(因此點擊正在註冊),但它保持藍色並且節點未展開。調試表明試圖展開文件夾確實會打到請求FirstChild的GetProperty,並且它確實返回了第一個孩子的ID。之後,VirtualNode被查詢兩次以查看它是否可擴展。然後查詢標題。然後是圖標。然後沒有。

這裏是代碼爲我FolderNode子類:

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代碼:

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

明白了! (注意:我以前從來沒有回答過我自己的問題。)

問題似乎是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); 
    }