Gewusst wie: Hinzufügen einer Eigenschaft zu SharePoint-Projekten

Mit einer Projekterweiterung können Sie SharePoint-Projekten eine Eigenschaft hinzufügen. Diese Eigenschaft wird im Eigenschaftenfenster angezeigt, wenn Sie das Projekt im Projektmappen-Explorer auswählen.

Im Folgenden wird vorausgesetzt, dass bereits eine Projekterweiterung erstellt wurde. Weitere Informationen finden Sie unter Gewusst wie: Erstellen einer SharePoint-Projekterweiterung.

So fügen Sie einem SharePoint-Projekt eine Eigenschaft hinzu

  1. Definieren Sie eine Klasse mit einer öffentlichen Eigenschaft, die die SharePoint-Projekten hinzuzufügende Eigenschaft darstellt. Wenn Sie mehrere Eigenschaften hinzufügen möchten, können Sie alle Eigenschaften in der gleichen Klasse oder in unterschiedlichen Klassen definieren.

  2. Behandeln Sie in der Initialize-Methode der ISharePointProjectExtension-Implementierung das ProjectPropertiesRequested-Ereignis des projectService-Parameters.

  3. Fügen Sie im Ereignishandler für das ProjectPropertiesRequested-Ereignis der PropertySources-Auflistung des Ereignisargumentparameters eine Instanz der Eigenschaftenklasse hinzu.

Beispiel

Im folgenden Codebeispiel wird veranschaulicht, wie SharePoint-Projekten zwei Eigenschaften hinzugefügt werden. Bei der einen Eigenschaft werden die Daten in der Benutzeroptionsdatei für Projekte beibehalten (.vbproj.user-Datei oder .csproj.user-Datei). Bei der anderen Eigenschaft werden die Daten in der Projektdatei beibehalten (CSPROJ-Datei oder VBPROJ-Datei).

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;
                }
            }
        }                
    }
}

Grundlegendes zum Code

Damit stets die gleiche Instanz der CustomProjectProperties-Klasse beim ProjectPropertiesRequested-Ereignis verwendet wird, wird im folgenden Codebeispiel das Eigenschaftenobjekt in der Annotations-Eigenschaft des Projekts gespeichert, sobald das Ereignis zum ersten Mal auftritt. Vom Code wird dann jedes Mal, wenn das Ereignis auftritt, dieses Objekt abgerufen. Weitere Informationen zur Verwendung der Annotations-Eigenschaft zum Zuordnen von Daten zu Projekten finden Sie unter Zuordnen von benutzerdefinierten Daten zu SharePoint-Tools-Erweiterungen.

Um Änderungen an Eigenschaftswerten beizubehalten, verwenden die set-Accessoren für die Eigenschaften folgende APIs:

Weitere Informationen zum Beibehalten von Daten in diesen Dateien finden Sie unter Speichern von Daten in Erweiterungen des SharePoint-Projektsystems.

Angeben des Verhaltens benutzerdefinierter Eigenschaften

Sie können definieren, wie eine benutzerdefinierte Eigenschaft angezeigt wird und sich im Eigenschaftenfenster verhält, indem Sie Attribute aus dem System.ComponentModel-Namespace auf die Eigenschaftendefinition anwenden. Die folgenden Attribute sind in vielen Szenarien hilfreich:

  • DisplayNameAttribute: Gibt den Namen der Eigenschaft an, die im Eigenschaftenfenster angezeigt wird.

  • DescriptionAttribute: Gibt die Beschreibungszeichenfolge an, die bei Auswahl der Eigenschaft unten im Eigenschaftenfenster angezeigt wird.

  • DefaultValueAttribute: Gibt den Standardwert für die Eigenschaft an.

  • TypeConverterAttribute: Gibt eine benutzerdefinierte Konvertierung zwischen der Zeichenfolge, die im Eigenschaftenfenster angezeigt wird, und einem Eigenschaftswert an, der keine Zeichenfolge ist.

  • EditorAttribute: Gibt einen benutzerdefinierten Editor zum Ändern der Eigenschaft an.

Kompilieren des Codes

Für dieses Beispiel sind Verweise auf die folgenden Assemblys erforderlich:

  • Microsoft.VisualStudio.SharePoint

  • Microsoft.VisualStudio.Shell

  • Microsoft.VisualStudio.Shell.Interop

  • Microsoft.VisualStudio.Shell.Interop.8.0

  • System.ComponentModel.Composition

Bereitstellen der Erweiterung

Erstellen Sie ein Visual Studio-Erweiterungspaket (VSIX) für die Assembly und alle weiteren Dateien, die Sie mit der Erweiterung verteilen möchten, um die Erweiterung bereitzustellen. Weitere Informationen finden Sie unter Bereitstellen von Erweiterungen für die SharePoint-Tools in Visual Studio.

Siehe auch

Aufgaben

Gewusst wie: Erstellen einer SharePoint-Projekterweiterung

Konzepte

Erweitern des SharePoint-Projektsystems

Weitere Ressourcen

Erweitern von SharePoint-Projekten

Gewusst wie: Hinzufügen eines Kontextmenüelements zu SharePoint-Projekten