如何:向服务器资源管理器添加自定义 SharePoint 节点

您可以在**“服务器资源管理器”中的“SharePoint 连接”节点下添加自定义节点。 当您希望显示“服务器资源管理器”**中默认情况下未显示的其他 SharePoint 组件时,这样做很有用。 有关更多信息,请参见扩展服务器资源管理器中的“SharePoint 连接”节点

若要添加自定义节点,请先创建一个定义新节点的类。 然后,创建一个用于将新节点添加为现有节点的子级的扩展。

定义新节点

  1. 创建一个类库项目。

  2. 添加对下列程序集的引用:

    • Microsoft.VisualStudio.SharePoint

    • Microsoft.VisualStudio.SharePoint.Explorer.Extensions

    • System.ComponentModel.Composition

    • System.Drawing

  3. 创建实现 IExplorerNodeTypeProvider 接口的类。

  4. 向该类添加下列特性:

  5. IExplorerNodeTypeProvider.InitializeType 方法的实现中,使用 typeDefinition 参数的成员来配置新节点的行为。 此参数是一个 IExplorerNodeTypeDefinition 对象,它提供对 IExplorerNodeEvents 接口中定义的事件的访问。

    下面的代码示例演示如何定义新的节点。 此示例假定项目将一个名为 CustomChildNodeIcon 的图标包含为嵌入资源。

    <Export(GetType(IExplorerNodeTypeProvider))> _
    <ExplorerNodeType(ExampleNodeTypeProvider.NodeTypeId)> _
    Friend Class ExampleNodeTypeProvider
        Implements IExplorerNodeTypeProvider
        Friend Const NodeTypeId As String = "Contoso.ServerExplorerNodeExample"
    
        Private Sub InitializeType(ByVal typeDefinition As IExplorerNodeTypeDefinition) _
            Implements IExplorerNodeTypeProvider.InitializeType
            typeDefinition.DefaultIcon = _
                My.Resources.CustomChildNodeIcon.ToBitmap()
            typeDefinition.IsAlwaysLeaf = True
        End Sub
    End Class
    
    [Export(typeof(IExplorerNodeTypeProvider))]
    [ExplorerNodeType(ExampleNodeTypeProvider.NodeTypeId)]
    internal class ExampleNodeTypeProvider : IExplorerNodeTypeProvider
    {
        internal const string NodeTypeId = "Contoso.ServerExplorerNodeExample";
    
        public void InitializeType(IExplorerNodeTypeDefinition typeDefinition)
        {
            typeDefinition.DefaultIcon =
                Properties.Resources.CustomChildNodeIcon.ToBitmap();
            typeDefinition.IsAlwaysLeaf = true;
        }
    }
    

将新节点添加为现有节点的子级

  1. 在与节点定义相同的项目中,创建一个实现 IExplorerNodeTypeExtension 接口的类。

  2. 给类添加 System.ComponentModel.Composition.ExportAttribute 特性。 此特性使 Visual Studio 能够发现并加载您的 IExplorerNodeTypeExtension 实现。 将 IExplorerNodeTypeExtension 类型传递给特性构造函数。

  3. 给类添加 ExplorerNodeTypeAttribute 特性。 在节点扩展中,此特性指定要扩展的节点类型的字符串标识符。

    若要指定 Visual Studio 提供的内置节点类型,请将以下枚举值之一传递给特性构造函数:

    • ExplorerNodeTypes:使用这些值可在**“服务器资源管理器”**中指定网站连接节点(即显示网站 URL 的节点)、网站节点或所有其他父节点。

    • ExtensionNodeTypes:使用这些值可指定表示 SharePoint 网站上的单个组件的内置节点之一,如表示列表、字段或内容类型的节点。

  4. Initialize 方法的实现中,处理 IExplorerNodeType 参数的 NodeChildrenRequested 事件。

  5. NodeChildrenRequested 事件处理程序中,将新节点添加到由事件实参参数公开的 Node 对象的子节点集合中。

    下面的代码示例演示如何在**“服务器资源管理器”**中将新节点添加为 SharePoint 网站节点的子级。

    <Export(GetType(IExplorerNodeTypeExtension))> _
    <ExplorerNodeType(ExplorerNodeTypes.SiteNode)> _
    Friend Class SiteNodeExtension
        Implements IExplorerNodeTypeExtension
    
        Private Sub Initialize(ByVal nodeType As IExplorerNodeType) _
            Implements IExplorerNodeTypeExtension.Initialize
            AddHandler nodeType.NodeChildrenRequested, AddressOf NodeChildrenRequested
        End Sub
    
        Private Sub NodeChildrenRequested(ByVal Sender As Object, ByVal e As ExplorerNodeEventArgs)
            e.Node.ChildNodes.Add(ExampleNodeTypeProvider.NodeTypeId, _
                "Custom Node", Nothing)
        End Sub
    End Class
    
    [Export(typeof(IExplorerNodeTypeExtension))]
    [ExplorerNodeType(ExplorerNodeTypes.SiteNode)]
    internal class SiteNodeExtension : IExplorerNodeTypeExtension
    {
        public void Initialize(IExplorerNodeType nodeType)
        {
            nodeType.NodeChildrenRequested += NodeChildrenRequested;
        }
    
        private void NodeChildrenRequested(object sender, ExplorerNodeEventArgs e)
        {
            e.Node.ChildNodes.Add(ExampleNodeTypeProvider.NodeTypeId,
                "Custom Node", null);
        }
    }
    

完整的示例

下面的代码示例提供了完整代码,用于定义一个简单节点并在**“服务器资源管理器”**中将该节点添加为 SharePoint 网站节点的子级。

Imports System.ComponentModel.Composition
Imports Microsoft.VisualStudio.SharePoint
Imports Microsoft.VisualStudio.SharePoint.Explorer

Namespace Contoso.ServerExplorerExtension

    <Export(GetType(IExplorerNodeTypeProvider))> _
    <ExplorerNodeType(ExampleNodeTypeProvider.NodeTypeId)> _
    Friend Class ExampleNodeTypeProvider
        Implements IExplorerNodeTypeProvider
        Friend Const NodeTypeId As String = "Contoso.ServerExplorerNodeExample"

        Private Sub InitializeType(ByVal typeDefinition As IExplorerNodeTypeDefinition) _
            Implements IExplorerNodeTypeProvider.InitializeType
            typeDefinition.DefaultIcon = _
                My.Resources.CustomChildNodeIcon.ToBitmap()
            typeDefinition.IsAlwaysLeaf = True
        End Sub
    End Class

    <Export(GetType(IExplorerNodeTypeExtension))> _
    <ExplorerNodeType(ExplorerNodeTypes.SiteNode)> _
    Friend Class SiteNodeExtension
        Implements IExplorerNodeTypeExtension

        Private Sub Initialize(ByVal nodeType As IExplorerNodeType) _
            Implements IExplorerNodeTypeExtension.Initialize
            AddHandler nodeType.NodeChildrenRequested, AddressOf NodeChildrenRequested
        End Sub

        Private Sub NodeChildrenRequested(ByVal Sender As Object, ByVal e As ExplorerNodeEventArgs)
            e.Node.ChildNodes.Add(ExampleNodeTypeProvider.NodeTypeId, _
                "Custom Node", Nothing)
        End Sub
    End Class
End Namespace
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.SharePoint;
using Microsoft.VisualStudio.SharePoint.Explorer;

namespace Contoso.ServerExplorerExtension
{
    [Export(typeof(IExplorerNodeTypeProvider))]
    [ExplorerNodeType(ExampleNodeTypeProvider.NodeTypeId)]
    internal class ExampleNodeTypeProvider : IExplorerNodeTypeProvider
    {
        internal const string NodeTypeId = "Contoso.ServerExplorerNodeExample";

        public void InitializeType(IExplorerNodeTypeDefinition typeDefinition)
        {
            typeDefinition.DefaultIcon =
                Properties.Resources.CustomChildNodeIcon.ToBitmap();
            typeDefinition.IsAlwaysLeaf = true;
        }
    }

    [Export(typeof(IExplorerNodeTypeExtension))]
    [ExplorerNodeType(ExplorerNodeTypes.SiteNode)]
    internal class SiteNodeExtension : IExplorerNodeTypeExtension
    {
        public void Initialize(IExplorerNodeType nodeType)
        {
            nodeType.NodeChildrenRequested += NodeChildrenRequested;
        }

        private void NodeChildrenRequested(object sender, ExplorerNodeEventArgs e)
        {
            e.Node.ChildNodes.Add(ExampleNodeTypeProvider.NodeTypeId,
                "Custom Node", null);
        }
    }
}

编译代码

此示例假定项目将一个名为 CustomChildNodeIcon 的图标包含为嵌入资源。 此示例还需要对以下程序集的引用:

  • Microsoft.VisualStudio.SharePoint

  • System.ComponentModel.Composition

  • System.Drawing

部署扩展

若要部署**“服务器资源管理器”**扩展,请为要利用此扩展分发的程序集和任何其他文件创建 Visual Studio 扩展 (VSIX) 包。 有关更多信息,请参见在 Visual Studio 中部署 SharePoint 工具扩展

请参见

任务

演练:扩展服务器资源管理器以显示 Web 部件

其他资源

扩展服务器资源管理器中的“SharePoint 连接”节点

如何:扩展服务器资源管理器中的 SharePoint 节点