Compartir a través de


Cómo: Agregar una propiedad a proyectos de SharePoint

Puede usar una extensión de proyecto para agregar una propiedad a cualquier proyecto de SharePoint. La propiedad aparece en la ventana Propiedades cuando se selecciona el proyecto en el Explorador de soluciones.

En los siguientes pasos se presupone que ya ha creado una extensión de proyecto. Para obtener más información, vea Cómo: Crear una extensión de proyecto de SharePoint.

Para agregar una propiedad a un proyecto de SharePoint

  1. Defina una clase con una propiedad pública que represente la propiedad que va a agregar a los proyectos de SharePoint. Si desea agregar varias propiedades, puede definirlas todas en la misma clase o en clases diferentes.

  2. En el método Initialize de la implementación ISharePointProjectExtension, controle el evento ProjectPropertiesRequested del parámetro projectService.

  3. En el controlador de eventos del evento ProjectPropertiesRequested, agregue una instancia de la clase de propiedades a la colección PropertySources del parámetro de argumentos del evento.

Ejemplo

En el ejemplo de código siguiente se muestra cómo agregar dos propiedades a los proyectos de SharePoint. Una propiedad conserva los datos en el archivo de opciones de usuario del proyecto (el archivo .csproj.user o .vbproj.user). La otra propiedad conserva los datos en el archivo de proyecto (archivo .csproj o .vbproj).

Imports System
Imports System.ComponentModel
Imports System.ComponentModel.Composition
Imports Microsoft.VisualStudio
Imports Microsoft.VisualStudio.SharePoint
Imports Microsoft.VisualStudio.Shell.Interop

Namespace CustomSharePointProperty

    <Export(GetType(ISharePointProjectExtension))> _
    Partial Friend Class ProjectExtensionWithProperty
        Implements ISharePointProjectExtension

        Public Sub Initialize(ByVal projectService As ISharePointProjectService) _
            Implements ISharePointProjectExtension.Initialize
            AddHandler projectService.ProjectPropertiesRequested, _
                AddressOf ProjectPropertiesRequested
        End Sub

        Private Sub ProjectPropertiesRequested(ByVal sender As Object, _
            ByVal e As SharePointProjectPropertiesRequestedEventArgs)

            Dim propertiesObject As CustomProjectProperties = Nothing

            ' If the properties object already exists, get it from the project's annotations.
            If False = e.Project.Annotations.TryGetValue(propertiesObject) Then
                ' Otherwise, create a new properties object and add it to the annotations.
                propertiesObject = New CustomProjectProperties(e.Project)
                e.Project.Annotations.Add(propertiesObject)
            End If

            e.PropertySources.Add(propertiesObject)
        End Sub
    End Class

    Public Class CustomProjectProperties
        Private sharePointProject As ISharePointProject
        Private projectStorage As IVsBuildPropertyStorage
        Private Const ProjectFilePropertyId As String = "ContosoCustomProjectFileProperty"
        Private Const ProjectFilePropertyDefaultValue As String = "Default"

        Public Sub New(ByVal myProject As ISharePointProject)
            sharePointProject = myProject
            projectStorage = sharePointProject.ProjectService.Convert(Of ISharePointProject, IVsBuildPropertyStorage)(sharePointProject)
        End Sub

        <DisplayName("Custom Project File Property")> _
        <DescriptionAttribute("This property is saved to the .csproj/.vbproj file.")> _
        <DefaultValue(ProjectFilePropertyDefaultValue)> _
        Public Property CustomProjectFileProperty As String
            Get
                Dim propertyValue As String = String.Empty
                Dim hr As Integer = projectStorage.GetPropertyValue(ProjectFilePropertyId, String.Empty, _
                    CUInt(_PersistStorageType.PST_PROJECT_FILE), propertyValue)

                ' Try to get the current value from the project file; if it does not yet exist, return a default value.
                If Not ErrorHandler.Succeeded(hr) Or String.IsNullOrEmpty(propertyValue) Then
                    propertyValue = ProjectFilePropertyDefaultValue
                End If
                Return propertyValue
            End Get
            Set(ByVal value As String)
                ' Do not save the default value.
                If value <> ProjectFilePropertyDefaultValue Then
                    projectStorage.SetPropertyValue(ProjectFilePropertyId, String.Empty, _
                        CUInt(_PersistStorageType.PST_PROJECT_FILE), value)
                End If
            End Set
        End Property

        Private Const UserFilePropertyId As String = "ContosoCustomUserFileProperty"
        Private Const UserFilePropertyDefaultValue As String = "Default"

        <DisplayName("Custom Project User File Property")> _
        <DescriptionAttribute("This property is saved to the .user file.")> _
        <DefaultValue(UserFilePropertyDefaultValue)> _
        Public Property CustomUserFileProperty As String
            Get
                Dim propertyValue As String = String.Empty
                ' Try to get the current value from the .user file; if it does not yet exist, return a default value.
                If Not sharePointProject.ProjectUserFileData.TryGetValue(UserFilePropertyId, propertyValue) Then
                    propertyValue = UserFilePropertyDefaultValue
                End If
                Return propertyValue
            End Get
            Set(ByVal value As String)
                ' Do not save the default value.
                If value <> UserFilePropertyDefaultValue Then
                    sharePointProject.ProjectUserFileData(UserFilePropertyId) = value
                End If
            End Set
        End Property
    End Class
End Namespace
using System;
using System.ComponentModel;
using System.ComponentModel.Composition;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.SharePoint;
using Microsoft.VisualStudio.Shell.Interop;

namespace CustomSharePointProperty
{
    [Export(typeof(ISharePointProjectExtension))]
    public class ProjectExtensionWithProperty : ISharePointProjectExtension
    {
        public void Initialize(ISharePointProjectService projectService)
        {
            projectService.ProjectPropertiesRequested += projectService_ProjectPropertiesRequested;           
        }

        void projectService_ProjectPropertiesRequested(object sender, SharePointProjectPropertiesRequestedEventArgs e)
        {
            CustomProjectProperties propertiesObject;

            // If the properties object already exists, get it from the project's annotations.
            if (!e.Project.Annotations.TryGetValue(out propertiesObject))
            {
                // Otherwise, create a new properties object and add it to the annotations.
                propertiesObject = new CustomProjectProperties(e.Project);
                e.Project.Annotations.Add(propertiesObject);
            }

            e.PropertySources.Add(propertiesObject);
        }
    }

    public class CustomProjectProperties
    {
        private ISharePointProject sharePointProject;
        private IVsBuildPropertyStorage projectStorage;
        private const string ProjectFilePropertyId = "ContosoCustomProjectFileProperty";
        private const string ProjectFilePropertyDefaultValue = "Default";

        public CustomProjectProperties(ISharePointProject myProject)
        {
            sharePointProject = myProject;
            projectStorage = sharePointProject.ProjectService.Convert<ISharePointProject, IVsBuildPropertyStorage>(sharePointProject);
        }

        [DisplayName("Custom Project File Property")]
        [DescriptionAttribute("This property is saved to the .csproj/.vbproj file.")]
        [DefaultValue(ProjectFilePropertyDefaultValue)]
        public string CustomProjectFileProperty
        {
            get
            {
                string propertyValue;
                int hr = projectStorage.GetPropertyValue(ProjectFilePropertyId, string.Empty, 
                    (uint)_PersistStorageType.PST_PROJECT_FILE, out propertyValue);

                // Try to get the current value from the project file; if it does not yet exist, return a default value.
                if (!ErrorHandler.Succeeded(hr) || String.IsNullOrEmpty(propertyValue))
                {
                    propertyValue = ProjectFilePropertyDefaultValue;
                }

                return propertyValue;
            }

            set
            {
                // Do not save the default value.
                if (value != ProjectFilePropertyDefaultValue)
                {
                    projectStorage.SetPropertyValue(ProjectFilePropertyId, string.Empty, 
                        (uint)_PersistStorageType.PST_PROJECT_FILE, value);
                }
            }
        }

        private const string UserFilePropertyId = "ContosoCustomUserFileProperty";
        private const string UserFilePropertyDefaultValue = "Default";

        [DisplayName("Custom Project User File Property")]
        [DescriptionAttribute("This property is saved to the .user file.")]
        [DefaultValue(UserFilePropertyDefaultValue)]
        public string CustomUserFileProperty
        {
            get
            {
                string propertyValue = string.Empty;

                // Try to get the current value from the .user file; if it does not yet exist, return a default value.
                if (!sharePointProject.ProjectUserFileData.TryGetValue(UserFilePropertyId, out propertyValue))
                {
                    propertyValue = UserFilePropertyDefaultValue; 
                }

                return propertyValue; 
            }

            set
            {
                // Do not save the default value.
                if (value != UserFilePropertyDefaultValue)
                {
                    sharePointProject.ProjectUserFileData[UserFilePropertyId] = value;
                }
            }
        }                
    }
}

Introducción al código

Para garantizar que se usa la misma instancia de la clase CustomProjectProperties cada vez que se genera el evento ProjectPropertiesRequested, el ejemplo de código agrega el objeto de propiedades a la propiedad Annotations del proyecto la primera vez que se genera este evento. El código recupera este objeto cada vez que el evento se genera. Para obtener más información sobre el uso de la propiedad Annotations para asociar los datos con los proyectos, vea Asociar datos personalizados con extensiones de herramientas de SharePoint.

Para conservar los cambios a los valores de propiedad, los descriptores de acceso set de las propiedades usan las API siguientes:

Para obtener más información sobre la persistencia de datos en estos archivos, vea Guardar datos asociados en extensiones del sistema de proyectos de SharePoint.

Especificar el comportamiento de las propiedades personalizadas

Puede definir el aspecto y comportamiento de una propiedad personalizada en la ventana Propiedades aplicando los atributos del espacio de nombres System.ComponentModel a la definición de la propiedad. Los siguientes atributos son útiles en muchos escenarios:

  • DisplayNameAttribute: especifica el nombre de la propiedad que aparece en la ventana Propiedades.

  • DescriptionAttribute: especifica la cadena descriptiva que aparece en la parte inferior de la ventana Propiedades cuando la propiedad está seleccionada.

  • DefaultValueAttribute especifica el valor predeterminado de la propiedad.

  • TypeConverterAttribute: especifica una conversión personalizada entre la cadena que se muestra en la ventana Propiedades y un valor de propiedad que no es de cadena.

  • EditorAttribute: especifica un editor personalizado para modificar la propiedad.

Compilar el código

En este ejemplo se requieren referencias a los siguientes ensamblados:

  • Microsoft.VisualStudio.SharePoint

  • Microsoft.VisualStudio.Shell

  • Microsoft.VisualStudio.Shell.Interop

  • Microsoft.VisualStudio.Shell.Interop.8.0

  • System.ComponentModel.Composition

Implementar la extensión

Para implementar la extensión, cree un paquete de extensión (VSIX) de Visual Studio para el ensamblado y el resto de archivos que desee distribuir con la extensión. Para obtener más información, vea Extensiones de implementación para las Herramientas de SharePoint en Visual Studio.

Vea también

Tareas

Cómo: Crear una extensión de proyecto de SharePoint

Conceptos

Extender el sistema de proyectos de SharePoint

Otros recursos

Extender los proyectos de SharePoint

Cómo: Agregar un elemento de menú contextual a los proyectos de SharePoint