我正在使用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; }
}
}