Udostępnij za pośrednictwem


Instruktaż: Tworzenie elementu projektu kolumny witryny z szablonu projektu, część 2

Po zdefiniowaniu niestandardowy typ element projektu programu SharePoint i skojarzyć ją z szablonu projektu w programie Visual Studio, możesz również dostarczyć Kreatora szablonu.Kreatora można używać do zbierania informacji od użytkowników korzystających z szablonu do tworzenia nowego projektu, który zawiera element projektu.Informacje zbierane, można zainicjować elementu projektu.

W tym instruktażu Kreator będzie dodać do szablonu projektu kolumny witryny, który jest wykazana w Instruktaż: Tworzenie elementu projektu kolumny witryny z szablonu projektu, część 1.Gdy użytkownik tworzy projektu kolumny witryny, Kreator zbiera informacje o kolumnie witryny (na przykład typu podstawowego i grupy) i dodaje te informacje do pliku Elements.xml w nowym projekcie.

W tym instruktażu przedstawiono następujące zadania:

  • Tworzenie niestandardowego typu do elementu projektu programu SharePoint, który jest skojarzony z szablonem projektu kreatora.

  • Definiowanie niestandardowej Kreator interfejsu użytkownika, podobne do wbudowanych kreatorów dla projektów programu SharePoint w programie Visual Studio.

  • Tworzenie dwóch poleceń SharePoint , używane do wywołania do lokalnej witryny programu SharePoint podczas działania kreatora.Polecenia programu SharePoint są metody, które można za pomocą rozszerzeń w Visual Studio do wywołania funkcji API w modelu obiektów programu SharePoint server.Aby uzyskać więcej informacji, zobacz Wywołanie do modeli obiektów programu SharePoint.

  • Za pomocą parametrów zastępowalnych do zainicjowania programu SharePoint projektu plików z danymi, które należy zebrać w kreatorze.

  • Tworzenie nowego pliku .snk w każdej nowej instancji projektu kolumny witryny.Ten plik jest używany do podpisywania projektu wyjście tak, że zgromadzenie rozwiązanie programu SharePoint może zostać wdrożony na globalna pamięć podręczna zestawów.

  • Debugowanie i testowania kreatora.

[!UWAGA]

Pobrać próbkę zawierającą zakończonych projektów, kod i inne pliki w tym instruktażu z następującej lokalizacji: https://go.microsoft.com/fwlink/?LinkId=191369.

Wymagania wstępne

Do wykonania tej procedury, należy najpierw utworzyć rozwiązanie SiteColumnProjectItem wypełniając Instruktaż: Tworzenie elementu projektu kolumny witryny z szablonu projektu, część 1.

Ponadto na komputerze deweloperskim do przeprowadzenia tego instruktażu następujące składniki:

Znajomość następujące pojęcia jest przydatne, ale nie jest to wymagane, aby ukończyć Instruktaż:

Opis składników Kreatora

Kreator, który zostanie wykazane, w tym instruktażu zawiera kilka składników.W poniższej tabeli opisano te składniki.

Składnik

Opis

Kreator wdrażania

Jest to klasa, o nazwie SiteColumnProjectWizard, który implementuje IWizard interfejsu.Ten interfejs definiuje metody, które wywołuje Visual Studio, gdy Kreator rozpoczyna i kończy i w określonym czasie, podczas gdy Kreator jest uruchamiany.

Kreator interfejsu użytkownika

Jest oparty na platformie WPF okno, o nazwie WizardWindow.To okno zawiera dwie kontrolki użytkownika, o nazwie Page1 i Page2.Te formanty użytkownika stanowią dwie strony kreatora.

W tym instruktażu RunStarted metoda wdrażania Kreator wyświetla interfejs użytkownika kreatora.

Kreator danych modelu

Jest to pośredniczące klasę o nazwie SiteColumnWizardModel, który zapewnia warstwy interfejsu użytkownika kreatora i Kreatora wdrażania.W przykładzie użyto tej klasy, aby pomóc streszczenie wykonania kreatora i Kreatora interfejsu użytkownika od siebie; Ta klasa nie jest wymaganym składnikiem wszystkich kreatorów.

W tym instruktażu przechodzi Kreator wdrażania SiteColumnWizardModel obiektu w oknie Kreator wyświetla interfejs użytkownika kreatora.Kreator interfejsu użytkownika używa metod tego obiektu do zapisania wartości formantów w interfejsie użytkownika i wykonywać zadania jak weryfikacji poprawności adresu URL witryny wejściowych.Po zakończeniu pracy kreatora użytkownik używa Kreatora wdrażania SiteColumnWizardModel obiekt, aby określić stan końcowy interfejsu użytkownika.

Podpisujący menedżera projektu

Jest to klasa, o nazwie ProjectSigningManager, stosowanego w realizacji kreatora do utworzenia nowego pliku key.snk w każdej nowej instancji projektu.

Polecenia programu SharePoint

Są to metody, które są używane przez model dane kreatora do wywołania do lokalnej witryny programu SharePoint podczas działania kreatora.Ponieważ polecenia programu SharePoint musi być ukierunkowana na.NET Framework 3.5, polecenia te są implementowane w zestaw inny niż reszta kodu kreatora.

Tworzenie projektów

Do przeprowadzenia tego instruktażu, musisz dodać kilka projektów do roztworu SiteColumnProjectItem, utworzony w Instruktaż: Tworzenie elementu projektu kolumny witryny z szablonu projektu, część 1:

  • Projekt programu WPF.Będzie wykonywał IWizard interfejs i zdefiniować Kreatora interfejsu użytkownika w tym projekcie.

  • Projektu biblioteki klas, które definiują polecenia programu SharePoint.Ten projekt musi być ukierunkowana na platformy.NET Framework 3.5.

Instruktaż należy rozpocząć od utworzenia projektów.

Aby utworzyć projekt WPF

  1. W Visual Studio, otwórz rozwiązanie SiteColumnProjectItem.

  2. W Solution Explorer, otwórz menu skrótów dla SiteColumnProjectItem rozwiązanie węzła, wybierz Dodaj, a następnie wybierz polecenie Nowy projekt.

    [!UWAGA]

    W projektach programu Visual Basic, węzeł rozwiązanie pojawia się tylko wtedy, gdy Zawsze pokazuj rozwiązanie pole wyboru jest zaznaczone w General, Projects and Solutions, Options Dialog Box.

  3. W górnej części Dodać nowy projekt okno dialogowe pole, upewnij się, że 4.5.NET Framework jest wybrany na liście wersje.NET Framework.

  4. Rozwiń węzeł Visual C# węzła lub programu Visual Basic węzła i wybierz polecenie Windows węzła.

  5. Na liście szablonów projektu, wybierz opcję Biblioteka formantów użytkownika WPF, nazwa projektu ProjectTemplateWizard, a następnie wybierz polecenie OK przycisk.

    Visual Studiododaje ProjectTemplateWizard projektu do rozwiązania i otwiera domyślny plik UserControl1.xaml.

  6. Usuń plik UserControl1.xaml z projektu.

Tworzenie projektu poleceń programu SharePoint

  1. W Solution Explorer, otwórz menu skrótów dla węzła rozwiązanie SiteColumnProjectItem, wybierz Dodaj, a następnie wybierz polecenie Nowy projekt.

  2. W górnej części Dodać nowy projekt okno dialogowe Wybierz 3.5.NET Framework na liście wersje.NET Framework.

  3. Rozwiń Visual C# węzła lub języka Visual Basic węzła, a następnie wybierz polecenie Windows węzła.

  4. Wybierz Biblioteka klas projektu szablonu, nazwa projektu SharePointCommands, a następnie wybierz polecenie OK przycisk.

    Visual Studiododaje SharePointCommands projektu do rozwiązania i otwiera plik domyślny kod Class1.

  5. Usuń plik Class1 kodu z projektu.

Konfigurowanie projektów

Aby utworzyć kreatora, należy dodać kilka plików z kodem i odwołania do zestawów projektów.

Aby skonfigurować projekt Kreatora

  1. W Solution Explorer, otwórz menu skrótów dla ProjectTemplateWizard projektu węzła, a następnie wybierz Właściwości.

  2. W Project Designer, wybierz aplikacji kartę dla projektu programu Visual C# lub kompilacji kartę dla projektu Visual Basic.

  3. Upewnij się, ramy docelowej jest równa 4,5.NET Framework, nie.NET Framework 4.5 profil klienta.

    Aby uzyskać więcej informacji, zobacz Jak: wersja docelowa.NET Framework.

  4. Otwórz menu skrótów dla ProjectTemplateWizard projektu, wybierz opcję Dodaj, a następnie wybierz polecenie Nowy element.

  5. Wybierz Window ((WPF)) przedmiotu, nazwa elementu WizardWindow, a następnie wybierz polecenie Dodaj przycisk.

  6. Dodać dwie Formantu użytkownika (WPF) elementów w projekcie i nazwij je Strona1 i Strona2.

  7. Dodać cztery pliki kodu do projektu i nadać im następujące nazwy:

    • SiteColumnProjectWizard

    • SiteColumnWizardModel

    • ProjectSigningManager

    • CommandIds

  8. Otwórz menu skrótów dla ProjectTemplateWizard projektu węzła, a następnie wybierz Dodaj odwołanie.

  9. Rozwiń węzeł zespoły węzeł, wybierz rozszerzenia węzła, a następnie zaznacz pola wyboru obok następujących zestawów:

    • EnvDTE

    • Microsoft.VisualStudio.OLE.Interop

    • Microsoft.VisualStudio.SharePoint

    • Microsoft.VisualStudio.Shell.11.0

    • Microsoft.VisualStudio.Shell.Interop.10.0

    • Microsoft.VisualStudio.Shell.Interop.11.0

    • Microsoft.VisualStudio.TemplateWizardInterface

  10. Wybierz OK przycisk, aby dodać zestawy do projektu.

  11. W Solution Explorerpod odwołania folder dla ProjectTemplateWizard projektu, wybierz opcję EnvDTE.

    [!UWAGA]

    W projektach programu Visual Basic odwołania folder pojawi się tylko wtedy, gdy Zawsze pokazuj rozwiązanie pole wyboru jest zaznaczone w General, Projects and Solutions, Options Dialog Box.

  12. W Właściwości okna, zmień wartość Osadzić typy współdziałania z modelem właściwość, aby False.

  13. Jeoli projekt programu Visual Basic, należy zaimportować ProjectTemplateWizard obszaru nazw do projektu za pomocą Project Designer.

    Aby uzyskać więcej informacji, zobacz Jak: Dodawanie lub usuwanie importowane obszary nazw (Visual Basic).

Aby skonfigurować projektu SharePointCommands

  1. W Solution Explorer, wybierz opcję SharePointCommands węzła projektu.

  2. Na pasku menu wybierz Projekt, Dodaj istniejący element.

  3. W Dodaj istniejący element okno dialogowe, przejdź do folderu zawierającego pliki kodu do projektu ProjectTemplateWizard, a następnie wybierz CommandIds kod pliku.

  4. Wybierz strzałkę znajdującą się obok Dodaj przycisk, a następnie wybierz Łącze Dodaj jako opcji w wyświetlonym menu.

    Visual Studiododaje plik kodu do SharePointCommands projektu jako łącze.Plik kod znajduje się w ProjectTemplateWizard również skompilowana projektu, ale kod w pliku SharePointCommands projektu.

  5. W SharePointCommands projektu, dodać inny kod pliku o nazwie polecenia.

  6. Wybrać projekt SharePointCommands, a następnie na pasku menu wybierz Projekt, Dodaj odwołanie.

  7. Rozwiń węzeł zespoły węzeł, wybierz rozszerzenia węzła, a następnie zaznacz pola wyboru obok następujących zestawów:

    • Microsoft.SharePoint

    • Microsoft.VisualStudio.SharePoint.Commands

  8. Wybierz OK przycisk, aby dodać zestawy do projektu.

Tworzenie modelu kreatora, podpisywanie Manager i identyfikatory poleceń programu SharePoint

Dodaj kod do projektu ProjectTemplateWizard do realizacji następujących składników w próbce:

  • Identyfikatory poleceń programu SharePoint.Łańcuchy te identyfikują poleceń programu SharePoint, które używa Kreatora.Później w tym instruktażu dodasz kod do projektu SharePointCommands do wykonania polecenia.

  • Kreator modelu danych.

  • Menedżer projektu podpisywania.

Aby uzyskać więcej informacji na temat tych składników, zobacz Opis składników Kreatora.

Zdefiniowanie IDs polecenia programu SharePoint

  • Projektu, ProjectTemplateWizard Otwórz plik CommandIds kod, a następnie zastąpić całą zawartość tego pliku poniższy kod.

    Namespace Contoso.SharePoint.Commands
        Public Class CommandIds
            Public Const GetFieldTypes As String = "Contoso.Commands.GetFieldTypes"
            Public Const ValidateSite As String = "Contoso.Commands.ValidateSite"
        End Class
    End Namespace
    
    namespace Contoso.SharePoint.Commands
    {
        public static class CommandIds
        {
            public const string GetFieldTypes = "Contoso.Commands.GetFieldTypes";
            public const string ValidateSite = "Contoso.Commands.ValidateSite";
        }
    }
    

Aby utworzyć model Kreatora

  • Otwórz plik SiteColumnWizardModel kod i zastąpić całą zawartość tego pliku poniższy kod.

    Imports EnvDTE
    Imports Microsoft.VisualStudio.SharePoint
    Imports Microsoft.VisualStudio
    Imports Microsoft.VisualStudio.Shell
    Imports Microsoft.VisualStudio.Shell.Interop
    Imports IOleServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider
    
    Public Class SiteColumnWizardModel
        Private dteObject As DTE
        Private projectServiceValue As ISharePointProjectService
        Private validatedUrls As New List(Of String)
    
        Friend Sub New(ByVal dteObject As DTE, ByVal requiresFarmPriveleges As Boolean)
            Me.dteObject = dteObject
    
            ' Initialize default values for wizard choices.
            IsSandboxed = Not requiresFarmPriveleges
            IsSecondPagePopulated = False
            FieldType = "Text"
            FieldGroup = "Custom Columns"
            FieldName = "My Custom Column"
            CurrentSiteUrl = GetLocalHostUrl()
        End Sub
    
    #Region "Helper methods used by the wizard UI"
    
        ' Specifies whether the current site URL is valid. Uses the ValidateSite SharePoint command to do this.
        Friend Function ValidateCurrentUrl(ByVal errorMessage As String) As Boolean
            Dim isValid As Boolean = False
            errorMessage = String.Empty
    
            If validatedUrls.Contains(CurrentSiteUrl) Then
                isValid = True
            Else
                Dim uriToValidate As Uri = New Uri(CurrentSiteUrl, UriKind.Absolute)
                Dim vsThreadedWaitDialog As IVsThreadedWaitDialog2 = Nothing
    
                Try
                    vsThreadedWaitDialog = ShowProgressDialog("Connect to SharePoint",
                        "Connecting to SharePoint site " + CurrentSiteUrl)
                    isValid = Me.ProjectService.SharePointConnection.ExecuteCommand(Of Uri, Boolean)(
                        Contoso.SharePoint.Commands.CommandIds.ValidateSite, uriToValidate)
                Catch ex As Exception
                    errorMessage = "An error occurred while validating the site. " + ex.Message
                Finally
                    If isValid Then
                        validatedUrls.Add(CurrentSiteUrl)
                    End If
                    If vsThreadedWaitDialog IsNot Nothing Then
                        CloseProgressDialog(vsThreadedWaitDialog)
                    End If
                End Try
            End If
            Return isValid
        End Function
    
        ' Gets the available field types from the SharePoint site. Uses the GetFieldTypes SharePoint command to do this.
        Friend Function GetFieldTypes() As ArrayList
            ' If we have not yet validated this site, do it now.
            Dim errorMessage As String = String.Empty
            If Not ValidateCurrentUrl(errorMessage) Then
                MessageBox.Show(String.Format("Cannot connect to the SharePoint site: {0}. {1}",
                    CurrentSiteUrl, errorMessage), "SharePoint Connection Error")
                Return Nothing
            End If
    
            ' Site is valid, so go ahead and get the available field types.
            Dim siteUri As Uri = New Uri(CurrentSiteUrl, UriKind.Absolute)
            Dim vsThreadedWaitDialog As IVsThreadedWaitDialog2 = ShowProgressDialog(
                "Connect to SharePoint", "Connecting to SharePoint site " + CurrentSiteUrl)
            Dim fieldTypesArray As String() = Me.ProjectService.SharePointConnection.ExecuteCommand(Of Uri, String())(
                Contoso.SharePoint.Commands.CommandIds.GetFieldTypes, siteUri)
    
            If vsThreadedWaitDialog IsNot Nothing Then
                CloseProgressDialog(vsThreadedWaitDialog)
            End If
    
            Return New ArrayList(fieldTypesArray)
        End Function
    
        ' Returns the default column group names in SharePoint.
        Friend Function GetFieldGroups() As List(Of String)
            Dim groups As List(Of String) = New List(Of String)()
            groups.Add("Base Columns")
            groups.Add("Core Contact and Calendar Columns")
            groups.Add("Core Document Columns")
            groups.Add("Core Task and Issue Columns")
            groups.Add("Extended Columns")
            Return groups
        End Function
    #End Region
    
    #Region "Properties shared by the wizard implementation and the wizard UI"
    
        Friend ReadOnly Property ProjectService As ISharePointProjectService
            Get
                If projectServiceValue Is Nothing Then
                    projectServiceValue = GetProjectService()
                End If
                Return projectServiceValue
            End Get
        End Property
    
        Friend Property IsSecondPagePopulated As Boolean
        Friend Property IsSandboxed As Boolean
        Friend Property FieldType As String
        Friend Property FieldGroup As String
        Friend Property FieldName As String
        Friend Property CurrentSiteUrl As String
    #End Region
    
    #Region "Private methods"
    
        Private Function GetLocalHostUrl() As String
            Const HttpScheme As String = "http"
            Dim builder As UriBuilder = New UriBuilder(HttpScheme, Environment.MachineName.ToLowerInvariant())
            Return builder.ToString()
        End Function
    
        Private Function GetProjectService() As ISharePointProjectService
            Dim serviceProvider As ServiceProvider = New ServiceProvider(CType(dteObject, IOleServiceProvider))
            Return CType(serviceProvider.GetService(GetType(ISharePointProjectService)), ISharePointProjectService)
        End Function
    
        Private Function ShowProgressDialog(ByVal caption As String, ByVal message As String) As IVsThreadedWaitDialog2
            Dim oleServiceProvider As IOleServiceProvider = CType(dteObject, IOleServiceProvider)
            Dim dialogFactory As IVsThreadedWaitDialogFactory = CType(New ServiceProvider(oleServiceProvider).GetService(
                GetType(SVsThreadedWaitDialogFactory)), IVsThreadedWaitDialogFactory)
    
            If dialogFactory Is Nothing Then
                Throw New InvalidOperationException("The IVsThreadedWaitDialogFactory object could not be retrieved.")
            End If
    
            Dim vsThreadedWaitDialog As IVsThreadedWaitDialog2 = Nothing
            ErrorHandler.ThrowOnFailure(dialogFactory.CreateInstance(vsThreadedWaitDialog))
            ErrorHandler.ThrowOnFailure(vsThreadedWaitDialog.StartWaitDialog(caption, message,
                Nothing, Nothing, String.Empty, 0, False, True))
            Return vsThreadedWaitDialog
        End Function
    
        Private Sub CloseProgressDialog(ByVal vsThreadedWaitDialog As IVsThreadedWaitDialog2)
            If vsThreadedWaitDialog Is Nothing Then
                Throw New ArgumentNullException("vsThreadedWaitDialog")
            End If
            Dim canceled As Integer
            ErrorHandler.ThrowOnFailure(vsThreadedWaitDialog.EndWaitDialog(canceled))
        End Sub
    #End Region
    End Class
    
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Windows;
    using EnvDTE;
    using Microsoft.VisualStudio.SharePoint;
    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    using Microsoft.VisualStudio.Shell.Interop;
    using IOleServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider;
    
    namespace ProjectTemplateWizard
    {
        internal class SiteColumnWizardModel
        {
            private DTE dteObject;
            private ISharePointProjectService projectServiceValue;
            private List<string> validatedUrls = new List<string>();
    
            internal SiteColumnWizardModel(DTE dteObject, bool requiresFarmPriveleges)
            {
                this.dteObject = dteObject;
    
                // Initialize default values for wizard choices.
                IsSandboxed = !requiresFarmPriveleges;
                IsSecondPagePopulated = false;
                FieldType = "Text";
                FieldGroup = "Custom Columns";
                FieldName = "My Custom Column";
                CurrentSiteUrl = GetLocalHostUrl();
            }
    
            #region Helper methods used by the wizard UI
    
            // Specifies whether the current site URL is valid. Uses the ValidateSite SharePoint command to do this.
            internal bool ValidateCurrentUrl(out string errorMessage)
            {
                bool isValid = false;
                errorMessage = String.Empty;
    
                if (validatedUrls.Contains(CurrentSiteUrl))
                {
                    isValid = true;
                }
                else
                {
                    Uri uriToValidate = new Uri(CurrentSiteUrl, UriKind.Absolute);
                    IVsThreadedWaitDialog2 vsThreadedWaitDialog = null;
    
                    try
                    {
                        vsThreadedWaitDialog = ShowProgressDialog("Connect to SharePoint",
                            "Connecting to SharePoint site " + CurrentSiteUrl);
                        isValid = this.ProjectService.SharePointConnection.ExecuteCommand<Uri, bool>(
                            Contoso.SharePoint.Commands.CommandIds.ValidateSite, uriToValidate);
                    }
                    catch (Exception ex)
                    {
                        errorMessage = "An error occurred while validating the site. " + ex.Message;
                    }
                    finally
                    {
                        if (isValid)
                        {
                            validatedUrls.Add(CurrentSiteUrl);
                        }
    
                        if (vsThreadedWaitDialog != null)
                        {
                            CloseProgressDialog(vsThreadedWaitDialog);
                        }
                    }
                }
    
                return isValid;
            }
    
            // Gets the available field types from the SharePoint site. Uses the GetFieldTypes SharePoint command to do this.
            internal ArrayList GetFieldTypes()
            {
                // If we have not yet validated this site, do it now.
                string errorMessage;
                if (!ValidateCurrentUrl(out errorMessage))
                {
                    MessageBox.Show(String.Format("Cannot connect to the SharePoint site: {0}. {1}",
                        CurrentSiteUrl, errorMessage), "SharePoint Connection Error");
                    return null;
                }
    
                // Site is valid, so go ahead and get the available field types.
                Uri siteUri = new Uri(CurrentSiteUrl, UriKind.Absolute);
                IVsThreadedWaitDialog2 vsThreadedWaitDialog = ShowProgressDialog(
                    "Connect to SharePoint", "Connecting to SharePoint site " + CurrentSiteUrl);
                string[] fieldTypesArray = this.ProjectService.SharePointConnection.ExecuteCommand<Uri, string[]>(
                        Contoso.SharePoint.Commands.CommandIds.GetFieldTypes, siteUri);
    
                if (vsThreadedWaitDialog != null)
                {
                    CloseProgressDialog(vsThreadedWaitDialog);
                }
    
                return new ArrayList(fieldTypesArray);
            }
    
            // Returns the default column group names in SharePoint.
            internal List<string> GetFieldGroups()
            {
                List<string> groups = new List<string>();
                groups.Add("Base Columns");
                groups.Add("Core Contact and Calendar Columns");
                groups.Add("Core Document Columns");
                groups.Add("Core Task and Issue Columns");
                groups.Add("Extended Columns");
                return groups;
            }
    
            #endregion
    
            #region Properties shared by the wizard implementation and the wizard UI
    
            internal ISharePointProjectService ProjectService
            {
                get
                {
                    if (projectServiceValue == null)
                    {
                        projectServiceValue = GetProjectService();
                    }
                    return projectServiceValue;
                }
            }
    
            internal bool IsSecondPagePopulated { get; set; }
            internal bool IsSandboxed { get; set; }
            internal string FieldType { get; set; }
            internal string FieldGroup { get; set; }
            internal string FieldName { get; set; }
            internal string CurrentSiteUrl { get; set; }
    
            #endregion
    
            #region Private methods
    
            private string GetLocalHostUrl()
            {
                const string HttpScheme = "http";
                UriBuilder builder = new UriBuilder(HttpScheme, Environment.MachineName.ToLowerInvariant());
                return builder.ToString();
            }
    
            private ISharePointProjectService GetProjectService()
            {
                ServiceProvider serviceProvider = new ServiceProvider(dteObject as IOleServiceProvider);
                return serviceProvider.GetService(typeof(ISharePointProjectService)) as ISharePointProjectService;
            }
    
            private IVsThreadedWaitDialog2 ShowProgressDialog(string caption, string message)
            {
                IOleServiceProvider oleServiceProvider = dteObject as IOleServiceProvider;
                IVsThreadedWaitDialogFactory dialogFactory = new ServiceProvider(oleServiceProvider).GetService(
                    typeof(SVsThreadedWaitDialogFactory)) as IVsThreadedWaitDialogFactory;
    
                if (dialogFactory == null)
                {
                    throw new InvalidOperationException("The IVsThreadedWaitDialogFactory object could not be retrieved.");
                }
    
                IVsThreadedWaitDialog2 vsThreadedWaitDialog = null;
                ErrorHandler.ThrowOnFailure(dialogFactory.CreateInstance(out vsThreadedWaitDialog));
                ErrorHandler.ThrowOnFailure(vsThreadedWaitDialog.StartWaitDialog(caption, message,
                     null, null, String.Empty, 0, false, true));
                return vsThreadedWaitDialog;
            }
    
            private void CloseProgressDialog(IVsThreadedWaitDialog2 vsThreadedWaitDialog)
            {
                if (vsThreadedWaitDialog == null)
                {
                    throw new ArgumentNullException("vsThreadedWaitDialog");
                }
    
                int canceled;
                ErrorHandler.ThrowOnFailure(vsThreadedWaitDialog.EndWaitDialog(out canceled));
            }
    
            #endregion
        }
    }
    

Aby utworzyć podpisywania menedżera projektu

  • Otwórz plik ProjectSigningManager kod, a następnie zastąpić całą zawartość tego pliku za pomocą następującego kodu.

    Imports EnvDTE
    Imports System
    Imports System.IO
    Imports System.Runtime.InteropServices
    
    Friend Class ProjectSigningManager
        Private Const KEY_FILENAME As String = "key.snk"
        Private keyBuffer As Byte()
        Private strongNameGenerated As Boolean = False
    
    #Region "Methods used by the project wizard"
    
        Friend Sub GenerateKeyFile()
            If Not strongNameGenerated Then
                keyBuffer = CreateNewKeyPair()
                strongNameGenerated = True
            End If
        End Sub
    
        Friend Sub AddKeyFile(ByVal project As Project)
            If strongNameGenerated Then
                AddKeyFileToProject(project)
            End If
        End Sub
    #End Region
    
    #Region "Private members"
    
        Private Function CreateNewKeyPair() As Byte()
            Dim buffer As IntPtr = IntPtr.Zero
            Dim bufferSize As UInteger
            Dim keyBuffer As Byte()
    
            Try
                If 0 = NativeMethods.StrongNameKeyGen(IntPtr.Zero, 0, buffer, bufferSize) Then
                    Marshal.ThrowExceptionForHR(NativeMethods.StrongNameErrorInfo())
                End If
                If buffer = IntPtr.Zero Then
                    Throw New InvalidOperationException("Cannot generate the strong name key.")
                End If
    
                ' Copy generated key to managed memory.
                keyBuffer = New Byte(bufferSize) {}
                Marshal.Copy(buffer, keyBuffer, 0, CInt(bufferSize))
            Finally
                ' Free native resources.
                NativeMethods.StrongNameFreeBuffer(buffer)
            End Try
            Return keyBuffer
        End Function
    
        Private Sub AddKeyFileToProject(ByVal project As Project)
    
            ' Save the key to a file.
            If keyBuffer IsNot Nothing Then
                Try
                    Dim destinationDirectory As String = Path.GetDirectoryName(project.FullName)
                    Dim keySavePath As String = Path.Combine(destinationDirectory, KEY_FILENAME)
    
                    File.WriteAllBytes(keySavePath, keyBuffer)
                    project.ProjectItems.AddFromFile(keySavePath)
    
                    ' Add properties in the project to use the key for signing.
                    Dim projProps As EnvDTE.Properties = project.Properties
                    projProps.Item("SignAssembly").Value = True
                    projProps.Item("AssemblyOriginatorKeyFile").Value = KEY_FILENAME
                Catch e As Exception
                    Throw New Exception("Cannot add the strong name key to the project. " & e.Message, e)
                End Try
            End If
        End Sub
    
        Private Class NativeMethods
            <DllImport("mscoree.dll")>
            Friend Shared Function StrongNameFreeBuffer(ByVal pbMemory As IntPtr) As Integer
            End Function
    
            <DllImport("mscoree.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True)>
            Friend Shared Function StrongNameKeyGen(ByVal wszKeyContainer As IntPtr, ByVal dwFlags As UInteger, _
                ByRef KeyBlob As IntPtr, ByRef KeyBlobSize As UInteger) As Integer
            End Function
    
            <DllImport("mscoree.dll", CharSet:=CharSet.Unicode)>
            Friend Shared Function StrongNameErrorInfo() As Integer
            End Function
        End Class
    #End Region
    End Class
    
    using EnvDTE;
    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    
    namespace ProjectTemplateWizard
    {
        internal class ProjectSigningManager
        {
            private const string KEY_FILENAME = "key.snk";
            private byte[] keyBuffer;
            private bool strongNameGenerated = false;
    
            #region Methods used by the project wizard
    
            internal void GenerateKeyFile()
            {
                if (!strongNameGenerated)
                {
                    keyBuffer = CreateNewKeyPair();
                    strongNameGenerated = true;
                }
            }
    
            internal void AddKeyFile(Project project)
            {
                if (strongNameGenerated)
                {
                    AddKeyFileToProject(project);
                }
            }
    
            #endregion
    
            #region Private members
    
            private byte[] CreateNewKeyPair()
            {
                IntPtr buffer = IntPtr.Zero;
                uint bufferSize;
                byte[] keyBuffer;
    
                try
                {
                    if (0 == NativeMethods.StrongNameKeyGen(IntPtr.Zero, 0, out buffer, out bufferSize))
                    {
                        Marshal.ThrowExceptionForHR(NativeMethods.StrongNameErrorInfo());
                    }
    
                    if (buffer == IntPtr.Zero)
                    {
                        throw new InvalidOperationException("Cannot generate the strong name key.");
                    }
    
                    // Copy generated key to managed memory.
                    keyBuffer = new byte[bufferSize];
                    Marshal.Copy(buffer, keyBuffer, 0, (int)bufferSize);
                }
                finally
                {
                    // Free native resources.
                    NativeMethods.StrongNameFreeBuffer(buffer);
                }
    
                return keyBuffer;
            }
    
            private void AddKeyFileToProject(Project project)
            {
                // Save the key to a file.
                if (keyBuffer != null)
                {
                    try
                    {
                        string destinationDirectory = Path.GetDirectoryName(project.FullName);
                        string keySavePath = Path.Combine(destinationDirectory, KEY_FILENAME);
    
                        File.WriteAllBytes(keySavePath, keyBuffer);
                        project.ProjectItems.AddFromFile(keySavePath);
    
                        // Add properties in the project to use the key for signing.
                        EnvDTE.Properties projProps = project.Properties;
                        projProps.Item("SignAssembly").Value = true;
                        projProps.Item("AssemblyOriginatorKeyFile").Value = KEY_FILENAME;
                    }
                    catch (Exception e)
                    {
                        throw new Exception("Cannot add the strong name key to the project. " + e.Message, e);
                    }
                }
            }
    
            private static class NativeMethods
            {
                [DllImport("mscoree.dll")]
                internal extern static int StrongNameFreeBuffer(IntPtr pbMemory);
    
                [DllImport("mscoree.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
                internal static extern int StrongNameKeyGen(IntPtr wszKeyContainer, uint dwFlags, out IntPtr KeyBlob, 
                    out uint KeyBlobSize);
    
                [DllImport("mscoree.dll", CharSet = CharSet.Unicode)]
                internal static extern int StrongNameErrorInfo();
            }
    
            #endregion
        }
    }
    

Tworzenie interfejsu użytkownika Kreatora

Dodać XAML, aby zdefiniować interfejs użytkownika w oknie kreatora i kontroli dwóch użytkowników, które zapewniają interfejs użytkownika dla strony kreatora i dodać kod, aby zdefiniować zachowanie formantów okna i użytkownika.Kreator, który tworzysz przypomina wbudowany Kreator dla projektów programu SharePoint w programie Visual Studio.

[!UWAGA]

W poniższych krokach projektu mają niektóre błędy kompilacji, po dodaniu języka XAML lub kod do projektu.Te błędy zniknie po dodaniu kodu w dalszych krokach.

Aby utworzyć okno Kreatora interfejsu użytkownika

  1. W programie project ProjectTemplateWizard, otwórz menu skrótów dla pliku WizardWindow.xaml, a następnie wybierz Otwórz Aby otworzyć okno projektanta.

  2. W widoku XAML projektanta zastąpić bieżącego języka XAML XAML następujące.XAML definiuje interfejs użytkownika, który zawiera nagłówek, Grid , która zawiera strony kreatora, przyciski nawigacji w dolnej części okna.

    <ui:DialogWindow x:Class="ProjectTemplateWizard.WizardWindow"
                     xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
                     xmlns:ui="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.11.0"        
                     xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"                                
                     Title="SharePoint Customization Wizard" Height="500" Width="700" ResizeMode="NoResize" 
                     Loaded="Window_Loaded" TextOptions.TextFormattingMode="Display">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="75*" />
                <RowDefinition Height="364*" />
                <RowDefinition Height="1*" />
                <RowDefinition Height="60*" />
            </Grid.RowDefinitions>
            <Grid Grid.Row="0" Name="headingGrid" Background="White">
                <Label Height="28" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="18,0,0,0" 
                       Name="headingLabel" FontWeight="ExtraBold" />
            </Grid>
            <Grid Grid.Row="1" Name="pageGrid" />
            <Rectangle Grid.Row="2" Name="separatorRectangle" Fill="White"  />
            <StackPanel Grid.Row="3" Name="navigationPanel" Orientation="Horizontal">
                <Button Content="&lt; _Previous" Margin="300,0,0,0"  Height="25" Name="previousButton" Width="85" 
                        IsEnabled="False" Click="previousButton_Click" />
                <Button Content="_Next >" Margin="10,0,0,0" Height="25" Name="nextButton" Width="85" Click="nextButton_Click" 
                        IsDefault="True" />
                <Button Content="_Finish" Margin="10,0,0,0" Height="25" Name="finishButton" Width="85" 
                        Click="finishButton_Click" />
                <Button Content="Cancel" Margin="10,0,0,0" Height="25" Name="cancelButton" Width="85" 
                        IsCancel="True" />
            </StackPanel>
        </Grid>
    </ui:DialogWindow>
    

    [!UWAGA]

    Okno w którym jest tworzony w tym języku XAML wywodzi się z DialogWindow klasa podstawowa.Dodając niestandardowe okno dialogowe WPF Visual Studio, zaleca się, aby czerpać swoje okno dialogowe z tej klasy mają spójny styl z innych oknach dialogowych programu Visual Studio i uniknąć problemów modalne okno dialogowe, które mogłyby się pojawić.Aby uzyskać więcej informacji, zobacz Jak: tworzenie i zarządzanie nimi w oknach dialogowych.

  3. Jeoli projekt programu Visual Basic, należy usunąć ProjectTemplateWizard nazw z WizardWindow Nazwa klasy w x:Class atrybut Window element.Ten element jest w pierwszym wierszu XAML.Gdy skończysz, pierwszy wiersz powinien wyglądać jak w następującym przykładzie.

    <Window x:Class="WizardWindow"
    
  4. Otwórz plik kodem dla pliku WizardWindow.xaml.

  5. Zamień zawartość tego pliku, z wyjątkiem using deklaracje na początku pliku, następujący kod.

    Public Class WizardWindow
        Private firstPage As Page1
        Private secondPage As Page2
        Private Const firstPageLabel As String = "Specify the site and security level for debugging"
        Private Const secondPageLabel As String = "Configure the site column"
    
        Friend Sub New(ByVal presentationModel As SiteColumnWizardModel)
            InitializeComponent()
            Me.PresentationModel = presentationModel
            firstPage = New Page1(Me)
            secondPage = New Page2(Me)
            secondPage.Visibility = Visibility.Hidden
        End Sub
    
        Friend Property PresentationModel As SiteColumnWizardModel
    
        Private Sub Window_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
            headingLabel.Content = firstPageLabel
            pageGrid.Children.Add(firstPage)
            pageGrid.Children.Add(secondPage)
        End Sub
    
        Private Sub nextButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    
            ' Initialize the second wizard page if this is the first time 
            ' it has been shown with the current site URL.
            If Not PresentationModel.IsSecondPagePopulated Then
    
                If Not ValidateUrl() Then
                    Return
                End If
    
                ' Refresh the UI in the second page.
                secondPage.ClearControls()
                secondPage.PopulateSiteColumnOptions()
    
                ' Do not do this work again until the user changes the site URL.
                PresentationModel.IsSecondPagePopulated = True
            End If
    
            ' Display the second wizard page and update related controls.
            firstPage.Visibility = Visibility.Hidden
            secondPage.Visibility = Visibility.Visible
            previousButton.IsEnabled = True
            nextButton.IsEnabled = False
            nextButton.IsDefault = False
            finishButton.IsDefault = True
            headingLabel.Content = secondPageLabel
        End Sub
    
        ' Display the first wizard page again and update related controls.
        Private Sub previousButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            secondPage.Visibility = Visibility.Hidden
            firstPage.Visibility = Visibility.Visible
            previousButton.IsEnabled = False
            finishButton.IsDefault = False
            nextButton.IsEnabled = True
            nextButton.IsDefault = True
            headingLabel.Content = firstPageLabel
        End Sub
    
        Private Sub finishButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            If ValidateUrl() Then
                DialogResult = True
                Close()
            End If
        End Sub
    
        Private Function ValidateUrl() As Boolean
            Dim errorMessage As String = String.Empty
            If Not PresentationModel.ValidateCurrentUrl(errorMessage) Then
                MessageBox.Show(String.Format("Cannot connect to the SharePoint site: {0}. {1}",
                    PresentationModel.CurrentSiteUrl, errorMessage),
                    "SharePoint Connection Error")
                Return False
            End If
            Return True
        End Function
    End Class
    
    using System;
    using System.Windows;
    using Microsoft.VisualStudio.PlatformUI;
    
    namespace ProjectTemplateWizard
    {
        public partial class WizardWindow : DialogWindow
        {
            private Page1 firstPage;
            private Page2 secondPage;
            private const string firstPageLabel = "Specify the site and security level for debugging";
            private const string secondPageLabel = "Configure the site column";
    
            internal WizardWindow(SiteColumnWizardModel presentationModel)
            {
                InitializeComponent();
                this.PresentationModel = presentationModel;
                firstPage = new Page1(this);
                secondPage = new Page2(this);
                secondPage.Visibility = Visibility.Hidden;
            }
    
            internal SiteColumnWizardModel PresentationModel { get; set; }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                headingLabel.Content = firstPageLabel;
                pageGrid.Children.Add(firstPage);
                pageGrid.Children.Add(secondPage);
            }
    
            private void nextButton_Click(object sender, RoutedEventArgs e)
            {
                // Initialize the second wizard page if this is the first time 
                // it has been shown with the current site URL.
                if (!PresentationModel.IsSecondPagePopulated)
                {
                    if (!ValidateUrl())
                    {
                        return;
                    }
    
                    // Refresh the UI in the second page.
                    secondPage.ClearControls();
                    secondPage.PopulateSiteColumnOptions();
    
                    // Do not do this work again until the user changes the site URL.
                    PresentationModel.IsSecondPagePopulated = true;
                }
    
                // Display the second wizard page and update related controls.
                firstPage.Visibility = Visibility.Hidden;
                secondPage.Visibility = Visibility.Visible;
                previousButton.IsEnabled = true;
                nextButton.IsEnabled = false;
                finishButton.IsDefault = true;
                headingLabel.Content = secondPageLabel;
            }
    
            // Display the first wizard page again and update related controls.
            private void previousButton_Click(object sender, RoutedEventArgs e)
            {
                secondPage.Visibility = Visibility.Hidden;
                firstPage.Visibility = Visibility.Visible;
                previousButton.IsEnabled = false;
                finishButton.IsDefault = false;
                nextButton.IsEnabled = true;
                nextButton.IsDefault = true;
                headingLabel.Content = firstPageLabel;
            }
    
            private void finishButton_Click(object sender, RoutedEventArgs e)
            {
                if (ValidateUrl())
                {
                    DialogResult = true;
                    Close();
                }
            }
    
            private bool ValidateUrl()
            {
                string errorMessage;
                if (!PresentationModel.ValidateCurrentUrl(out errorMessage))
                {
                    MessageBox.Show(String.Format("Cannot connect to the SharePoint site: {0}. {1}",
                        PresentationModel.CurrentSiteUrl, errorMessage),
                        "SharePoint Connection Error");
                    return false;
                }
                return true;
            }
        }
    }
    

Aby utworzyć pierwszej stronie Kreatora interfejsu użytkownika

  1. W programie project ProjectTemplateWizard, otwórz menu skrótów dla pliku Page1.xaml, a następnie wybierz Otwórz otworzyć kontrola użytkownika w projektancie.

  2. W widoku XAML projektanta zastąpić bieżącego języka XAML XAML następujące.XAML definiuje interfejs użytkownika, który zawiera pole tekstowe, w którym użytkownicy mogą wprowadzić adres URL witryny lokalne, które chcą używać do debugowania.Interfejs użytkownika zawiera również przyciski opcji, z którymi użytkownicy mogą określać, czy projekt jest w trybie piaskownicy.

    <UserControl x:Class="ProjectTemplateWizard.Page1"
                 xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="https://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" d:DesignHeight="364" d:DesignWidth="700" Loaded="UserControl_Loaded">
        <Grid Height="364" HorizontalAlignment="Left" Name="page1Grid" Width="700">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="20*" />
                <ColumnDefinition Width="548*" />
                <ColumnDefinition Width="132*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <TextBox Grid.Row="1" Grid.Column="1" Margin="5,0,1,0" Height="23" Name="siteUrlTextBox" 
                     TextChanged="siteUrlTextBox_TextChanged" />
            <Label Grid.Row="0" Grid.Column="1" Margin="0,20,0,0" Name="siteLabel" FontWeight="Bold" 
                   Target="{Binding ElementName=siteUrlTextBox}" 
                   Content="What local _site do you want to use for debugging?" />
            <Button Grid.Row="1" Grid.Column="2" Content="_Validate" Height="25" Name="validateButton" 
                    Width="88" Click="validateButton_Click" HorizontalAlignment="Left" 
                    Margin="5,0,0,0" VerticalAlignment="Top" />
            <Label Grid.Row="2" Grid.Column="1" Margin="0,10,0,0" Content="What is the trust level for this SharePoint solution?" 
                   Name="trustLabel" FontWeight="Bold" />
            <StackPanel Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2" Orientation="Vertical">
                <RadioButton Content="Deploy as a sand_boxed solution" Margin="5,0,0,0" Name="sandboxedSolutionRadioButton" 
                             FontWeight="Bold" Checked="sandboxedSolutionRadioButton_Checked" />
                <TextBlock TextWrapping="WrapWithOverflow" Margin="20,7,50,0">Clicking this option causes the solution to be 
                           deployed as a Sandboxed solution. Sandboxed solutions can be deployed by the site collection owner 
                           and are run in a secure, monitored process that has limited resource access.</TextBlock>
                <RadioButton Content="Deploy as a _farm solution" Margin="5,7,0,0" Name="farmSolutionRadioButton" FontWeight="Bold" 
                             Checked="farmSolutionRadioButton_Checked" />
                <TextBlock TextWrapping="WrapWithOverflow" Margin="20,7,50,0">Clicking this option means that users must have 
                           SharePoint administrator privileges to run or deploy the solution.</TextBlock>
            </StackPanel>
        </Grid>
    </UserControl>
    
  3. W wypadku opracowywania projektu języka Visual Basic, należy usunąć ProjectTemplateWizard nazw z Page1 Nazwa klasy w x:Class atrybut UserControl element.Jest to pierwszy wiersz w języku XAML.Gdy skończysz, pierwszy wiersz powinien wyglądać następująco.

    <UserControl x:Class="Page1"
    
  4. Zamień zawartość pliku Page1.xaml, z wyjątkiem using deklaracje na początku pliku, następujący kod.

    Public Class Page1
        Private mainWindow As WizardWindow
    
        Friend Sub New(ByVal mainWindow As WizardWindow)
            Me.mainWindow = mainWindow
            InitializeComponent()
        End Sub
    
        Private Sub UserControl_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
            If (mainWindow.PresentationModel.IsSandboxed) Then
                sandboxedSolutionRadioButton.IsChecked = True
            Else
                sandboxedSolutionRadioButton.IsEnabled = False
                farmSolutionRadioButton.IsChecked = True
            End If
            siteUrlTextBox.Text = mainWindow.PresentationModel.CurrentSiteUrl
        End Sub
    
        ' Validate that the URL exists on the development computer.
        Private Sub validateButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            Dim errorMessage As String = String.Empty
            validateButton.IsEnabled = False
    
            If Not mainWindow.PresentationModel.ValidateCurrentUrl(errorMessage) Then
                MessageBox.Show(String.Format("Cannot connect to the SharePoint site: {0}. {1}",
                    mainWindow.PresentationModel.CurrentSiteUrl, errorMessage),
                    "SharePoint Connection Error")
            Else
                MessageBox.Show("Successfully connected to SharePoint site " +
                    mainWindow.PresentationModel.CurrentSiteUrl, "Connection Successful")
            End If
            validateButton.IsEnabled = True
        End Sub
    
        ' Prevent users from finishing the wizard if the URL is not formatted correctly.
        Private Sub siteUrlTextBox_TextChanged(ByVal sender As Object, ByVal e As TextChangedEventArgs)
            Dim url As String = EnsureTrailingSlash(siteUrlTextBox.Text)
    
            ' Perform some basic error-checking on the URL here.
            If url.Length > 0 AndAlso Uri.IsWellFormedUriString(Uri.EscapeUriString(url), UriKind.Absolute) Then
    
                mainWindow.finishButton.IsEnabled = True
                mainWindow.nextButton.IsEnabled = True
                validateButton.IsEnabled = True
                mainWindow.PresentationModel.CurrentSiteUrl = url
                mainWindow.PresentationModel.IsSecondPagePopulated = False
            Else
                mainWindow.finishButton.IsEnabled = False
                mainWindow.nextButton.IsEnabled = False
                validateButton.IsEnabled = False
            End If
        End Sub
    
        Private Sub sandboxedSolutionRadioButton_Checked(ByVal sender As Object, ByVal e As RoutedEventArgs)
            mainWindow.PresentationModel.IsSandboxed = CBool(sandboxedSolutionRadioButton.IsChecked)
        End Sub
    
        Private Sub farmSolutionRadioButton_Checked(ByVal sender As Object, ByVal e As RoutedEventArgs)
            mainWindow.PresentationModel.IsSandboxed = CBool(sandboxedSolutionRadioButton.IsChecked)
        End Sub
    
        Private Function EnsureTrailingSlash(ByVal url As String)
            If Not String.IsNullOrEmpty(url) AndAlso url(url.Length - 1) <> "/" Then
                url += "/"
            End If
            Return url
        End Function
    End Class
    
    using System;
    using System.Windows;
    using System.Windows.Controls;
    
    namespace ProjectTemplateWizard
    {
        public partial class Page1 : UserControl
        {
            private WizardWindow mainWindow;
    
            internal Page1(WizardWindow mainWindow)
            {
                this.mainWindow = mainWindow;
                InitializeComponent();
            }
    
            private void UserControl_Loaded(object sender, RoutedEventArgs e)
            {
                if (mainWindow.PresentationModel.IsSandboxed)
                {
                    sandboxedSolutionRadioButton.IsChecked = true;
                }
                else
                {
                    sandboxedSolutionRadioButton.IsEnabled = false;
                    farmSolutionRadioButton.IsChecked = true;
                }
    
                siteUrlTextBox.Text = mainWindow.PresentationModel.CurrentSiteUrl;
            }
    
            // Validate that the URL exists on the development computer.
            private void validateButton_Click(object sender, RoutedEventArgs e)
            {
                string errorMessage;
                validateButton.IsEnabled = false;
    
                if (!mainWindow.PresentationModel.ValidateCurrentUrl(out errorMessage))
                {
                    MessageBox.Show(String.Format("Cannot connect to the SharePoint site: {0}. {1}",
                        mainWindow.PresentationModel.CurrentSiteUrl, errorMessage),
                        "SharePoint Connection Error");
                }
                else
                {
                    MessageBox.Show("Successfully connected to SharePoint site " +
                        mainWindow.PresentationModel.CurrentSiteUrl, "Connection Successful");
                }
    
                validateButton.IsEnabled = true;
            }
    
            // Prevent users from finishing the wizard if the URL is not formatted correctly.
            private void siteUrlTextBox_TextChanged(object sender, TextChangedEventArgs e)
            {
                string url = EnsureTrailingSlash(siteUrlTextBox.Text);
    
                // Perform some basic error-checking on the URL here.
                if ((url.Length > 0) && (Uri.IsWellFormedUriString(Uri.EscapeUriString(url), UriKind.Absolute)))
                {
                    mainWindow.finishButton.IsEnabled = true;
                    mainWindow.nextButton.IsEnabled = true;
                    validateButton.IsEnabled = true;
                    mainWindow.PresentationModel.CurrentSiteUrl = url;
                    mainWindow.PresentationModel.IsSecondPagePopulated = false;
                }
                else
                {
                    mainWindow.finishButton.IsEnabled = false;
                    mainWindow.nextButton.IsEnabled = false;
                    validateButton.IsEnabled = false;
                }
            }
    
            private void sandboxedSolutionRadioButton_Checked(object sender, RoutedEventArgs e)
            {
                mainWindow.PresentationModel.IsSandboxed = (bool)sandboxedSolutionRadioButton.IsChecked;
            }
    
            private void farmSolutionRadioButton_Checked(object sender, RoutedEventArgs e)
            {
                mainWindow.PresentationModel.IsSandboxed = (bool)sandboxedSolutionRadioButton.IsChecked;
            }
    
            private string EnsureTrailingSlash(string url)
            {
                if (!String.IsNullOrEmpty(url)
                    && url[url.Length - 1] != '/')
                {
                    url += '/';
                }
                return url;
            }
        }
    }
    

Aby utworzyć drugiej stronie Kreatora interfejsu użytkownika

  1. W programie project ProjectTemplateWizard, otwórz menu skrótów dla pliku Page2.xaml, a następnie wybierz Otwórz.

    Kontrola użytkownika zostanie otwarty w projektancie.

  2. W widoku XAML XAML bieżącego należy zastąpić następujący kod XAML.XAML definiuje interfejs użytkownika, który zawiera listy rozwijanej wyboru typu podstawowego kolumny witryny, pola kombi do określania grupy wbudowane lub niestandardowe, pod którym chcesz wyświetlić kolumnę witryny w galerii i pole tekstowe umożliwiające określenie nazwy kolumny witryny.

    <UserControl x:Class="ProjectTemplateWizard.Page2"
                 xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="https://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" d:DesignHeight="364" d:DesignWidth="700" Loaded="UserControl_Loaded">
        <Grid Height="364" HorizontalAlignment="Left" Name="page2Grid" Width="700">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="20*" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="450*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Label Grid.Row="0" Grid.Column="1" Margin="0,20,0,0" Content="_Type:" Name="fieldTypeLabel" 
                   FontWeight="Bold" Target="{Binding ElementName=fieldTypeComboBox}"/>
            <Label Grid.Row="1" Grid.Column="1" Margin="0,10,0,0" Content="_Group:" Name="groupLabel" 
                   FontWeight="Bold" Target="{Binding ElementName=groupComboBox}"/>
            <Label Grid.Row="2" Grid.Column="1" Margin="0,10,0,0" Content="_Name:" Name="nameLabel" 
                   FontWeight="Bold" Target="{Binding ElementName=nameTextBox}"/>
            <ComboBox Grid.Row="0" Grid.Column="2" HorizontalAlignment="Left" Margin="0,20,0,0" Height="23" 
                      Name="fieldTypeComboBox" Width="450" SelectionChanged="fieldTypeComboBox_SelectionChanged" />
            <ComboBox Grid.Row="1" Grid.Column="2" HorizontalAlignment="Left" Margin="0,10,0,0" Height="23" 
                      Name="groupComboBox" Width="450" IsEditable="True"  />
            <TextBox Grid.Row="2" Grid.Column="2" HorizontalAlignment="Left"  Margin="0,10,0,0" Height="23" 
                     Name="nameTextBox" Width="450" TextChanged="nameTextBox_TextChanged" />
        </Grid>
    </UserControl>
    
  3. W wypadku opracowywania projektu języka Visual Basic, należy usunąć ProjectTemplateWizard nazw z Page2 Nazwa klasy w x:Class atrybut UserControl element.Jest to pierwszy wiersz w języku XAML.Gdy skończysz, pierwszy wiersz powinien wyglądać następująco.

    <UserControl x:Class="Page2"
    
  4. Zamień zawartość pliku kodem dla pliku Page2.xaml, z wyjątkiem using deklaracje na początku pliku, następujący kod.

    Public Class Page2
        Private mainWindow As WizardWindow
        Private innerTextBoxForGroupComboBox As TextBox
    
        Friend Sub New(ByVal mainWindow As WizardWindow)
            Me.mainWindow = mainWindow
            InitializeComponent()
        End Sub
    
        Friend Sub ClearControls()
            fieldTypeComboBox.Items.Clear()
            groupComboBox.Items.Clear()
            nameTextBox.Clear()
        End Sub
    
        Friend Sub PopulateSiteColumnOptions()
            ' Add the available field type names to the combo box.
            Dim fieldTypes As System.Collections.ArrayList = mainWindow.PresentationModel.GetFieldTypes()
            If fieldTypes IsNot Nothing Then
                fieldTypes.Sort()
                For Each fieldValue As String In fieldTypes
                    fieldTypeComboBox.Items.Add(fieldValue)
                Next
                fieldTypeComboBox.SelectedIndex = 0
            End If
    
            ' Add the default group names to the combo box.
            Dim fieldGroups As List(Of String) = mainWindow.PresentationModel.GetFieldGroups()
            For Each fieldGroupValue As String In fieldGroups
                groupComboBox.Items.Add(fieldGroupValue)
            Next
            groupComboBox.SelectedIndex = 0
        End Sub
    
        Private Sub UserControl_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Handle the TextChanged event of the underlying TextBox for the ComboBox. This enables us to determine 
            ' 1) when the user selects an item in the list and 2) when they type their own custom group name. 
            ' The ComboBox.SelectionChanged event is not raised when you type in an editable ComboboBox.
            innerTextBoxForGroupComboBox = CType(groupComboBox.Template.FindName(
                "PART_EditableTextBox", groupComboBox), TextBox)
            AddHandler innerTextBoxForGroupComboBox.TextChanged, AddressOf innerTextBoxForGroupComboBox_TextChanged
        End Sub
    
        Private Sub fieldTypeComboBox_SelectionChanged(ByVal sender As Object, ByVal e As SelectionChangedEventArgs)
            mainWindow.PresentationModel.FieldType = CStr(fieldTypeComboBox.SelectedItem)
        End Sub
    
        Private Sub innerTextBoxForGroupComboBox_TextChanged(ByVal sender As Object, ByVal e As TextChangedEventArgs)
            mainWindow.PresentationModel.FieldGroup = groupComboBox.Text
        End Sub
    
        Private Sub nameTextBox_TextChanged(ByVal sender As Object, ByVal e As TextChangedEventArgs)
            mainWindow.PresentationModel.FieldName = nameTextBox.Text
        End Sub
    End Class
    
    using System.Windows;
    using System.Windows.Controls;
    
    namespace ProjectTemplateWizard
    {
        public partial class Page2 : UserControl
        {
            private WizardWindow mainWindow;
            private TextBox innerTextBoxForGroupComboBox;
    
            internal Page2(WizardWindow mainWindow)
            {
                this.mainWindow = mainWindow;
                InitializeComponent();
            }
    
            internal void ClearControls()
            {
                fieldTypeComboBox.Items.Clear();
                groupComboBox.Items.Clear();
                nameTextBox.Clear();
            }
    
            internal void PopulateSiteColumnOptions()
            {
                // Add the available field type names to the combo box.
                System.Collections.ArrayList fieldTypes = mainWindow.PresentationModel.GetFieldTypes();
                if (fieldTypes != null)
                {
                    fieldTypes.Sort();
                    foreach (string fieldValue in fieldTypes)
                    {
                        fieldTypeComboBox.Items.Add(fieldValue);
                    }
    
                    fieldTypeComboBox.SelectedIndex = 0;
                }
    
                // Add the default group names to the combo box.
                System.Collections.Generic.List<string> fieldGroups = mainWindow.PresentationModel.GetFieldGroups();
                foreach (string fieldGroupValue in fieldGroups)
                {
                    groupComboBox.Items.Add(fieldGroupValue);
                }
    
                groupComboBox.SelectedIndex = 0;
            }
    
            private void UserControl_Loaded(object sender, RoutedEventArgs e)
            {
                // Handle the TextChanged event of the underlying TextBox for the ComboBox. This enables us to determine 
                // 1) when the user selects an item in the list and 2) when they type their own custom group name. 
                // The ComboBox.SelectionChanged event is not raised when you type in an editable ComboboBox.
                innerTextBoxForGroupComboBox = groupComboBox.Template.FindName(
                    "PART_EditableTextBox", groupComboBox) as TextBox;
                innerTextBoxForGroupComboBox.TextChanged += innerTextBoxForGroupComboBox_TextChanged;
            }
    
            private void fieldTypeComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                mainWindow.PresentationModel.FieldType = (string)fieldTypeComboBox.SelectedItem;
            }
    
            void innerTextBoxForGroupComboBox_TextChanged(object sender, TextChangedEventArgs e)
            {
                mainWindow.PresentationModel.FieldGroup = groupComboBox.Text;
            }
    
            private void nameTextBox_TextChanged(object sender, TextChangedEventArgs e)
            {
                mainWindow.PresentationModel.FieldName = nameTextBox.Text;
            }
        }
    }
    

Kreator wdrażania

Zdefiniować główne funkcje kreatora implementując IWizard interfejsu.Ten interfejs definiuje metody, które wywołuje Visual Studio, gdy Kreator rozpoczyna i kończy i w określonym czasie, podczas gdy Kreator jest uruchamiany.

Aby zaimplementować Kreatora

  1. W programie project ProjectTemplateWizard Otwórz plik kod SiteColumnProjectWizard.

  2. Zastąpić całą zawartość tego pliku poniższy kod.

    Imports EnvDTE
    Imports Microsoft.VisualStudio.SharePoint
    Imports Microsoft.VisualStudio.TemplateWizard
    Imports System
    Imports System.Collections.Generic
    
    Public Class SiteColumnProjectWizard
        Implements IWizard
    
        Private wizardUI As WizardWindow
        Private dteObject As DTE
        Private presentationModel As SiteColumnWizardModel
        Private signingManager As ProjectSigningManager
    
        Public Sub New()
            signingManager = New ProjectSigningManager()
        End Sub
    
        Public Sub RunStarted(ByVal automationObject As Object, ByVal replacementsDictionary As Dictionary(Of String, String), _
            ByVal runKind As WizardRunKind, ByVal customParams() As Object) Implements IWizard.RunStarted
    
            dteObject = CType(automationObject, DTE)
            presentationModel = New SiteColumnWizardModel(dteObject, False)
    
            If Not presentationModel.ProjectService.IsSharePointInstalled Then
                Dim errorString As String = "A SharePoint server is not installed on this computer. A SharePoint server " &
                    "must be installed to work with SharePoint projects."
                System.Windows.MessageBox.Show(errorString, "SharePoint Not Installed", System.Windows.MessageBoxButton.OK,
                    System.Windows.MessageBoxImage.Error)
                Throw New WizardCancelledException(errorString)
            End If
    
            wizardUI = New WizardWindow(presentationModel)
            Dim dialogCompleted? As Boolean = wizardUI.ShowModal()
    
            If (dialogCompleted = True) Then
                replacementsDictionary.Add("$selectedfieldtype$", presentationModel.FieldType)
                replacementsDictionary.Add("$selectedgrouptype$", presentationModel.FieldGroup)
                replacementsDictionary.Add("$fieldname$", presentationModel.FieldName)
                signingManager.GenerateKeyFile()
            Else
                Throw New WizardCancelledException()
            End If
        End Sub
    
        ' Populate the SiteUrl and IsSandboxedSolution properties in the new project, and add a new 
        ' key.snk file to the project.
        Public Sub ProjectFinishedGenerating(ByVal project As Project) _
            Implements IWizard.ProjectFinishedGenerating
            Dim sharePointProject As ISharePointProject = presentationModel.ProjectService.Convert(Of Project, ISharePointProject)(project)
            sharePointProject.SiteUrl = New Uri(presentationModel.CurrentSiteUrl, UriKind.Absolute)
            sharePointProject.IsSandboxedSolution = presentationModel.IsSandboxed
            signingManager.AddKeyFile(project)
        End Sub
    
        ' Always return true; this IWizard implementation throws a WizardCancelledException
        ' that is handled by Visual Studio if the user cancels the wizard.
        Public Function ShouldAddProjectItem(ByVal filePath As String) As Boolean _
            Implements IWizard.ShouldAddProjectItem
            Return True
        End Function
    
        ' The following IWizard methods are not used in this example.
        Public Sub BeforeOpeningFile(ByVal projectItem As ProjectItem) _
            Implements IWizard.BeforeOpeningFile
        End Sub
    
        Public Sub ProjectItemFinishedGenerating(ByVal projectItem As ProjectItem) _
            Implements IWizard.ProjectItemFinishedGenerating
        End Sub
    
        Public Sub RunFinished() Implements IWizard.RunFinished
        End Sub
    End Class
    
    using EnvDTE;
    using Microsoft.VisualStudio.SharePoint;
    using Microsoft.VisualStudio.TemplateWizard;
    using System;
    using System.Collections.Generic;
    
    namespace ProjectTemplateWizard
    {
        public class SiteColumnProjectWizard : IWizard
        {
            private WizardWindow wizardUI;
            private DTE dteObject;
            private SiteColumnWizardModel presentationModel;
            private ProjectSigningManager signingManager;
    
            public SiteColumnProjectWizard()
            {
                signingManager = new ProjectSigningManager();
            }
    
            public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, 
                WizardRunKind runKind, object[] customParams)
            {
                dteObject = automationObject as DTE;
                presentationModel = new SiteColumnWizardModel(dteObject, false);
    
                if (!presentationModel.ProjectService.IsSharePointInstalled)
                {
                    string errorString = "A SharePoint server is not installed on this computer. A SharePoint server " +
                        "must be installed to work with SharePoint projects.";
                    System.Windows.MessageBox.Show(errorString, "SharePoint Not Installed", System.Windows.MessageBoxButton.OK,
                        System.Windows.MessageBoxImage.Error);
                    throw new WizardCancelledException(errorString);
                }
    
                wizardUI = new WizardWindow(presentationModel);
                Nullable<bool> dialogCompleted = wizardUI.ShowModal();
    
                if (dialogCompleted == true)
                {
                    replacementsDictionary.Add("$selectedfieldtype$", presentationModel.FieldType);
                    replacementsDictionary.Add("$selectedgrouptype$", presentationModel.FieldGroup);
                    replacementsDictionary.Add("$fieldname$", presentationModel.FieldName);
                    signingManager.GenerateKeyFile();
                }
                else
                {
                    throw new WizardCancelledException();
                }
            }
    
            // Populate the SiteUrl and IsSandboxedSolution properties in the new project, and add a new 
            // key.snk file to the project.
            public void ProjectFinishedGenerating(Project project)
            {
                ISharePointProject sharePointProject = presentationModel.ProjectService.Convert<Project, ISharePointProject>(project);
                sharePointProject.SiteUrl = new Uri(presentationModel.CurrentSiteUrl, UriKind.Absolute);
                sharePointProject.IsSandboxedSolution = presentationModel.IsSandboxed;
                signingManager.AddKeyFile(project);
            }
    
            // Always return true; this IWizard implementation throws a WizardCancelledException
            // that is handled by Visual Studio if the user cancels the wizard.
            public bool ShouldAddProjectItem(string filePath)
            {
                return true;
            }
    
            // The following IWizard methods are not used in this example.
            public void BeforeOpeningFile(ProjectItem projectItem)
            {
            }
    
            public void ProjectItemFinishedGenerating(ProjectItem projectItem)
            {
            }
    
            public void RunFinished()
            {
            }
        }
    }
    

Tworzenie poleceń programu SharePoint

Utwórz dwa niestandardowe polecenia, odwołujących się do modelu obiektów programu SharePoint server.Jedno polecenie Określa, czy adres URL witryny, w Kreatorze wpisanych przez użytkownika jest prawidłowy.Inne polecenie pobiera wszystkie typy pól z określonej witryny programu SharePoint, dzięki czemu użytkownicy mogą wybrać który z nich służy jako podstawa dla ich nowej kolumny witryny.

Aby zdefiniować poleceń programu SharePoint

  1. W SharePointCommands projektu, otwórz plik kod polecenia.

  2. Zastąpić całą zawartość tego pliku poniższy kod.

    Imports Microsoft.SharePoint
    Imports Microsoft.VisualStudio.SharePoint.Commands
    
    Namespace Contoso.SharePoint.Commands
    
        Friend Class Commands
    
            <SharePointCommand(CommandIds.ValidateSite)> _
            Private Function ValidateSite(ByVal context As ISharePointCommandContext, ByVal url As Uri) As Boolean
                Using site As SPSite = New SPSite(url.AbsoluteUri)
                    Dim webUrl As String = DetermineWebUrl(url.AbsolutePath, site.ServerRelativeUrl)
                    If webUrl IsNot Nothing Then
                        Using web As SPWeb = site.OpenWeb(webUrl, True)
                            Return web.Exists
                        End Using
                    End If
                End Using
                Return False
            End Function
    
            ' For simplicity, this command does not check to make sure the provided Uri is valid. 
            ' Use the ValidateSite command to verify that the Uri is valid first.
            <SharePointCommand(CommandIds.GetFieldTypes)> _
            Private Function GetFieldTypes(ByVal context As ISharePointCommandContext, ByVal url As Uri) As String()
                Dim columnDefinitions As List(Of String) = New List(Of String)()
                Using site As SPSite = New SPSite(url.AbsoluteUri)
                    Dim webUrl As String = DetermineWebUrl(url.AbsolutePath, site.ServerRelativeUrl)
                    Using web As SPWeb = site.OpenWeb(webUrl, True)
                        For Each columnDefinition As SPFieldTypeDefinition In web.FieldTypeDefinitionCollection
                            columnDefinitions.Add(columnDefinition.TypeName)
                        Next
                        ' SharePoint commands cannot serialize List<string>, so return an array.
                        Return columnDefinitions.ToArray()
                    End Using
                End Using
            End Function
    
            Private Function DetermineWebUrl(ByVal serverRelativeInputUrl As String, ByVal serverRelativeSiteUrl As String) As String
                ' Make sure both URLs have a trailing slash.
                serverRelativeInputUrl = EnsureTrailingSlash(serverRelativeInputUrl)
                serverRelativeSiteUrl = EnsureTrailingSlash(serverRelativeSiteUrl)
    
                Dim webUrl As String = Nothing
                Dim isSubString As Boolean = serverRelativeInputUrl.StartsWith(serverRelativeSiteUrl, StringComparison.OrdinalIgnoreCase)
    
                If isSubString Then
                    ' The Web URL cannot have escaped characters.
                    webUrl = Uri.UnescapeDataString(serverRelativeInputUrl.Substring(serverRelativeSiteUrl.Length))
                End If
                Return webUrl
            End Function
    
            Private Function EnsureTrailingSlash(ByVal url As String)
                If Not String.IsNullOrEmpty(url) AndAlso url(url.Length - 1) <> "/" Then
                    url += "/"
                End If
                Return url
            End Function
        End Class
    End Namespace
    
    using System;
    using System.Collections.Generic;
    using Microsoft.SharePoint;
    using Microsoft.VisualStudio.SharePoint.Commands;
    
    namespace Contoso.SharePoint.Commands
    {
        internal class Commands
        {
            [SharePointCommand(CommandIds.ValidateSite)]
            private bool ValidateSite(ISharePointCommandContext context, Uri url)
            {
                using (SPSite site = new SPSite(url.AbsoluteUri))
                {
                    string webUrl = DetermineWebUrl(url.AbsolutePath, site.ServerRelativeUrl);
                    if (webUrl != null)
                    {
                        using (SPWeb web = site.OpenWeb(webUrl, true))
                        {
                            return web.Exists;
                        }
                    }
                }
    
                return false;
            }
    
            // For simplicity, this command does not check to make sure the provided Uri is valid. 
            // Use the ValidateSite command to verify that the Uri is valid first.
            [SharePointCommand(CommandIds.GetFieldTypes)]
            private string[] GetFieldTypes(ISharePointCommandContext context, Uri url)
            {
                List<string> columnDefinitions = new List<string>();
                using (SPSite site = new SPSite(url.AbsoluteUri))
                {
                    string webUrl = DetermineWebUrl(url.AbsolutePath, site.ServerRelativeUrl);
                    using (SPWeb web = site.OpenWeb(webUrl, true))
                    {
                        foreach (SPFieldTypeDefinition columnDefinition in web.FieldTypeDefinitionCollection)
                        {
                            columnDefinitions.Add(columnDefinition.TypeName);
                        }
    
                        // SharePoint commands cannot serialize List<string>, so return an array.
                        return columnDefinitions.ToArray();
                    }
                }
            }
    
            private string DetermineWebUrl(string serverRelativeInputUrl, string serverRelativeSiteUrl)
            {
                // Make sure both URLs have a trailing slash.
                serverRelativeInputUrl = EnsureTrailingSlash(serverRelativeInputUrl);
                serverRelativeSiteUrl = EnsureTrailingSlash(serverRelativeSiteUrl);
    
                string webUrl = null;
                bool isSubString = serverRelativeInputUrl.StartsWith(serverRelativeSiteUrl, StringComparison.OrdinalIgnoreCase);
    
                if (isSubString)
                {
                    // The Web URL cannot have escaped characters.
                    webUrl = Uri.UnescapeDataString(serverRelativeInputUrl.Substring(serverRelativeSiteUrl.Length));
                }
    
                return webUrl;
            }
    
            private string EnsureTrailingSlash(string url)
            {
                if (!String.IsNullOrEmpty(url)
                    && url[url.Length - 1] != '/')
                {
                    url += '/';
                }
                return url;
            }
        }
    }
    

Punkt kontrolny

W tym momencie w instruktażu, cały kod dla kreatora jest teraz w projekcie.Utwórz projekt, aby upewnić się, że skompilowany bez błędów.

Tworzenie projektu

  • Na pasku menu wybierz budować, Budowania rozwiązania.

Usuwanie key.snk pliku z szablonu projektu

W Instruktaż: Tworzenie elementu projektu kolumny witryny z szablonu projektu, część 1, utworzonego szablonu projektu zawiera plik key.snk, który jest używany do podpisania każdego wystąpienie projektu kolumny witryny.Ten plik key.snk nie jest już konieczne, ponieważ Kreator generuje teraz nowy plik key.snk dla każdego projektu.Usuń plik key.snk z szablonu projektu i usunąć odwołania do tego pliku.

Aby usunąć plik key.snk z szablonu projektu

  1. W Solution Explorerpod SiteColumnProjectTemplate węzeł, otwórz menu skrótów dla key.snk pliku, a następnie wybierz usunąć.

  2. W oknie dialogowym potwierdzenia wybrać OK przycisk.

  3. Pod SiteColumnProjectTemplate węzeł, otwórz plik SiteColumnProjectTemplate.vstemplate, a następnie usunąć następujący element z niego.

    <ProjectItem ReplaceParameters="false" TargetFileName="key.snk">key.snk</ProjectItem>
    
  4. Zapisz i zamknij plik.

  5. Pod SiteColumnProjectTemplate węzeł, otwórz plik ProjectTemplate.csproj lub ProjectTemplate.vbproj, a następnie usuń następujące PropertyGroup element z niego.

    <PropertyGroup>
      <SignAssembly>true</SignAssembly>
      <AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
    </PropertyGroup>
    
  6. Usuń następujący None element.

    <None Include="key.snk" />
    
  7. Zapisz i zamknij plik.

Kojarzenie kreatora z szablonu projektu

Wdrożeniu kreatora, należy skojarzyć kreatora z Kolumny witryny szablonu projektu.Istnieją trzy procedury, które należy wykonać, aby to zrobić:

  1. Zaloguj się przy użyciu silnej nazwy zestawu kreatora.

  2. Pobierz token klucza publicznego dla Kreatora zestawu.

  3. Dodaj odwołanie do zestawu kreatora w pliku .vstemplate dla Kolumny witryny szablonu projektu.

Aby zarejestrować się przy użyciu silnej nazwy zestawu Kreatora

  1. W Solution Explorer, otwórz menu skrótów dla ProjectTemplateWizard projektu, a następnie wybierz Właściwości.

  2. Na podpisywania kartę, a następnie kliknij polecenie Wybierz podpisuje zestaw z pole wyboru.

  3. W Wybierz plik klucza silnej nazwy listy, wybierz opcję < nowy... >.

  4. W Tworzenie silne nazwy klucza okno dialogowe Wprowadź nazwę dla nowego pliku klucza, wyczyść Chroń mój plik klucza przy użyciu hasła pole wyboru, a następnie wybierz OK przycisk.

  5. Otwórz menu skrótów dla ProjectTemplateWizard projektu, a następnie wybierz budować do utworzenia pliku ProjectTemplateWizard.dll.

Aby uzyskać token klucza publicznego dla zestawu Kreatora

  1. Na Start Menu, wybierz Wszystkie programy, wybierz Microsoft Visual Studio 2012, wybierz Visual Studio Tools, a następnie wybierz polecenie autora wiersza polecenia dla VS2012.

    Otwiera okno wiersza polecenia usługi programu Visual Studio.

  2. Uruchom następujące polecenie, zastępując PathToWizardAssembly z pełną ścieżką do wbudowanego zestawu ProjectTemplateWizard.dll dla projektu ProjectTemplateWizard na komputerze dewelopera:

    sn.exe -T PathToWizardAssembly
    

    Token klucza publicznego zestawu ProjectTemplateWizard.dll są zapisywane do okna wiersza polecenia usługi programu Visual Studio.

  3. Nie zamykaj okna wiersza polecenia usługi programu Visual Studio.Token klucza publicznego, należy podczas następnej procedury.

Aby dodać odwołanie do zestawu kreatora w pliku .vstemplate

  1. W Solution Explorer, rozwiń węzeł SiteColumnProjectTemplate projektu węzeł i otwórz plik SiteColumnProjectTemplate.vstemplate.

  2. Pod koniec pliku, należy dodać następujący WizardExtension elementu między </TemplateContent> i </VSTemplate> tagi.Zamień token wartość PublicKeyToken atrybut z tokenu klucza publicznego uzyskany w poprzedniej procedurze.

    <WizardExtension>
      <Assembly>ProjectTemplateWizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=your token</Assembly>
      <FullClassName>ProjectTemplateWizard.SiteColumnProjectWizard</FullClassName>
    </WizardExtension>
    

    Aby uzyskać więcej informacji o WizardExtension element, zobacz Element WizardExtension (Visual Studio szablonów).

  3. Zapisz i zamknij plik.

Dodawanie parametrów zastępowalnych w pliku Elements.xml w szablonie projektu

Dodać kilka parametrów zastępowalnych w pliku Elements.xml w projekcie SiteColumnProjectTemplate.Parametry te są inicjowane w RunStarted metoda w SiteColumnProjectWizard klasy, który został zdefiniowany wcześniej.Gdy użytkownik tworzy projektu kolumny witryny, Visual Studio automatycznie zastępuje tych parametrów w pliku Elements.xml w nowym projekcie wartości, które są określone w kreatorze.

Parametr wymienny jest token, który zaczyna się i kończy się znakiem dolara ($).Oprócz definiowania własnych parametrów wymiennych, można użyć wbudowanego parametrów, które są określone i inicjowany przez system projektu programu SharePoint.Aby uzyskać więcej informacji, zobacz Parametry wymienne.

Aby dodać parametrów zastępowalnych w pliku Elements.xml

  1. W projekcie SiteColumnProjectTemplate zawartość pliku Elements.xml należy zastąpić następujący kod XML.

    <?xml version="1.0" encoding="utf-8"?>
    <Elements xmlns="https://schemas.microsoft.com/sharepoint/">
      <Field ID="{$guid5$}" 
             Name="$fieldname$" 
             DisplayName="$fieldname$" 
             Type="$selectedfieldtype$" 
             Group="$selectedgrouptype$">
      </Field>
    </Elements>
    

    Nowy plik XML zmienia wartości Name, DisplayName, Type, i Group atrybuty niestandardowe parametry wymienne.

  2. Zapisz i zamknij plik.

Dodanie kreatora pakiet VSIX

Wdrażania kreatora z pakiet VSIX, który zawiera szablon projektu kolumny witryny, dodaj odwołania do projektu kreatora i programu SharePoint projektu polecenia do pliku source.extension.vsixmanifest w projekcie VSIX.

Aby dodać kreatora do pakiet VSIX

  1. W Solution Explorer, w SiteColumnProjectItem projekt, otwórz menu skrótów dla source.extension.vsixmanifest pliku, a następnie wybierz Otwórz.

    Visual Studio otwiera plik w edytorze manifestu.

  2. Na aktywów kartę Edytor, należy wybrać Nowa przycisk.

    Dodać nowego środka zostanie otwarte okno dialogowe.

  3. W typu listy, wybierz opcję Microsoft.VisualStudio.Assembly.

  4. W źródło listy, wybierz opcję projektu w bieżącym rozwiązaniem.

  5. W Projekt listy, wybierz opcję ProjectTemplateWizard, a następnie wybierz polecenie OK przycisk.

  6. Na aktywów kartę edytora, należy wybrać Nowa przycisk ponownie.

    Dodać nowego środka zostanie otwarte okno dialogowe.

  7. W typu listy, wprowadź SharePoint.Commands.v4.

  8. W źródło listy, wybierz opcję projektu w bieżącym rozwiązaniem.

  9. W Projekt listy, wybierz opcję SharePointCommands projektu, a następnie wybierz OK przycisk.

  10. Na pasku menu wybierz budować, Budowania rozwiązania, a następnie upewnij się, że rozwiązanie opiera się bez błędów.

Kreator testowania

Teraz można przystąpić do badania kreatora.Po pierwsze rozpocząć debugowanie rozwiązanie SiteColumnProjectItem w doświadczalnych wystąpienie programu Visual Studio.Następnie test kreatora dla projektu kolumny witryny w doświadczalnych wystąpienie programu Visual Studio.Wreszcie budowy i uruchomienia projektu, aby sprawdzić, czy kolumna witryna działa zgodnie z oczekiwaniami.

Aby rozpocząć debugowanie rozwiązanie

  1. Uruchom ponownie program Visual Studio z poświadczeniami administracyjnymi, a następnie otwórz rozwiązanie SiteColumnProjectItem.

  2. Projektu, ProjectTemplateWizard, należy otworzyć plik SiteColumnProjectWizard kod, a następnie Dodaj punkt przerwania w pierwszej linii kodu w RunStarted metoda.

  3. Na pasku menu wybierz Debug, Wyjątki.

  4. W Wyjątki okno dialogowe pole, upewnij się, że Thrown i - unhandled pola wyboru dla Wyjątków CLR są czyszczone, a następnie wybierz OK przycisk.

  5. Uruchamianie debugowania, wybierając F5 kluczy lub na pasku, wybierając menu Debug, Start Debugging.

    Visual Studio instaluje rozszerzenie do %UserProfile%\AppData\Local\Microsoft\VisualStudio\11.0Exp\Extensions\Contoso\Site Column\1.0 i uruchamia wystąpienie doświadczalnych Visual Studio.Element projektu będzie test w tym wystąpieniu programu Visual Studio.

Aby przetestować kreatora w programie Visual Studio

  1. Eksperymentalne wystąpienie programu Visual Studio, na pasku menu wybierz pliku, Nowa, Projekt.

  2. Rozwiń Visual C# węzła lub języka Visual Basic rozwiń węzeł (w zależności od języka obsługującego szablonu projektu), SharePoint węzła, a następnie wybierz polecenie 2010 węzła.

  3. Na liście szablonów projektu, wybierz opcję Kolumny witryny, nazwa projektu SiteColumnWizardTest, a następnie wybierz polecenie OK przycisk.

  4. Sprawdź, że kod w inne wystąpienie programu Visual Studio zatrzymuje się na punkt przerwania, które wcześniej w zestaw RunStarted metoda.

  5. Kontynuuj debugowanie projektu przez wybranie F5 kluczy lub na pasku, wybierając menu Debug, Kontynuuj.

  6. W Kreatora dostosowania programu SharePoint, wprowadź adres URL witryny, którą chcesz używać do debugowania, a następnie wybierz Dalej przycisk.

  7. W drugiej stronie Kreatora dostosowania programu SharePoint, wybrać następujące opcje:

    • W typu listy, wybierz opcję typu Boolean.

    • W grupy listy, wybierz opcję Własne kolumny typu.

    • W Nazwa polu, wprowadź Moje kolumny tak/nie, a następnie wybierz wykończenie przycisk.

    W Solution Explorer, pojawi się nowy projekt i zawiera element projektu, o nazwie pole1, i Visual Studio otwiera plik Elements.xml projektu w edytorze.

  8. Upewnij się, że Elements.xml zawiera wartości, które określono w kreatorze.

Aby przetestować kolumnę witryny w programie SharePoint

  1. Eksperymentalne wystąpienie programu Visual Studio wybierz klawisz F5.

    Kolumna witryny jest pakowana i wdrożeniu programu SharePoint stronie, że Adres URL witryny określa właściwości projektu.Otwiera przeglądarkę sieci web do domyślnej strony tej witryny.

    [!UWAGA]

    Jeśli Niepełnosprawnych debugowanie skryptu pojawi się okno dialogowe, wybierz opcję Tak przycisk, aby kontynuować debugowania projektu.

  2. Na Akcje witryny menu, wybierz opcję Ustawienia witryny.

  3. Na stronie Ustawienia witryny w obszarze Galerie, wybierz kolumny witryny link.

  4. Na liście kolumn witryny, sprawdź, czy Własne kolumny typu grupa zawiera kolumnę o nazwie Moje kolumny typu, a następnie zamknij przeglądarkę sieci web.

Oczyszczanie na komputerze deweloperskim

Po zakończeniu badania element projektu, należy usunąć szablon projektu z eksperymentalnych wystąpienie programu Visual Studio.

Aby oczyścić komputer rozwoju

  1. Eksperymentalne wystąpienie programu Visual Studio, na pasku menu wybierz Narzędzia, rozszerzenia i aktualizacje.

    Rozszerzenia i aktualizacje zostanie otwarte okno dialogowe.

  2. Na liście Rozszerzenia wybierz Kolumny witryny, a następnie wybierz polecenie odinstalować przycisk.

  3. W wyświetlonym oknie dialogowym wybierz Tak przycisk, aby potwierdzić, że chcesz odinstalować rozszerzenie, a następnie wybierz Uruchom ponownie teraz przycisk, aby zakończyć dezinstalację.

  4. Zamknij doświadczalnych wystąpienie programu Visual Studio i instancji, w którym roztwór CustomActionProjectItem jest otwarty.

    Aby uzyskać informacje dotyczące sposobu wdrażania Visual Studio rozszerzeń, zobacz Visual Studio rozszerzenie wdrażania.

Zobacz też

Zadania

Instruktaż: Tworzenie elementu projektu kolumny witryny z szablonu projektu, część 1

Jak: Szablony projektów za pomocą kreatorów

Informacje

Visual Studio szablonu schematu odwołania

IWizard

Koncepcje

Definiowanie typów elementów projektu programu SharePoint niestandardowe

Tworzenie elementu szablonów i szablony projektu dla elementów projektu programu SharePoint