Compartir a través de


Tutorial: Crear un elemento de proyecto de acción personalizado con una plantilla de elementos, parte 2

Después de definir un tipo personalizado de elemento de proyecto de SharePoint y asociarlo a una plantilla de elemento en Visual Studio, es posible que desee proporcionar también un asistente para la plantilla.Puede usar el asistente para recopilar información de los usuarios cuando empleen la plantilla para agregar a un proyecto una nueva instancia del elemento de proyecto.La información que recopile puede usarse para inicializar el elemento de proyecto.

En este tutorial, agregará un asistente al elemento de proyecto Acción personalizada que se muestra en Tutorial: Crear un elemento de proyecto de acción personalizado con una plantilla de elementos, parte 1.Cuando un usuario agrega un elemento de proyecto acción personalizada a un proyecto de SharePoint, el asistente recopila información sobre la acción personalizada (como su ubicación y la dirección URL para navegar a un usuario final la elige) y agrega esta información al archivo Elements.xml del nuevo elemento.

En este tutorial se muestran las siguientes tareas:

  • Crear un asistente para un tipo de elemento de proyecto de SharePoint personalizado asociado a una plantilla de elemento.

  • Definir una interfaz de usuario de asistente personalizada similar a la de los asistentes integrados para los elementos de proyecto de SharePoint en Visual Studio.

  • Usar parámetros reemplazables para inicializar los archivos de proyecto de SharePoint con los datos recopilados en el asistente.

  • Depurar y probar el asistente.

[!NOTA]

Puede descargar un ejemplo que contiene los proyectos completos, código, y otros archivos para este tutorial de la siguiente ubicación: Archivos de proyecto para los tutoriales de extensibilidad de herramientas de SharePoint.

Requisitos previos

Para realizar este tutorial, debe crear primero la solución CustomActionProjectItem con el tutorial Tutorial: Crear un elemento de proyecto de acción personalizado con una plantilla de elementos, parte 1.

También necesitará los siguientes componentes en el equipo de desarrollo para completar este tutorial:

El conocimiento de los siguientes conceptos es útil, aunque no necesario, para completar el tutorial.

Crear el proyecto de asistente

Para completar este tutorial, debe agregar un proyecto a la solución CustomActionProjectItem que creó en Tutorial: Crear un elemento de proyecto de acción personalizado con una plantilla de elementos, parte 1.Implementará la interfaz IWizard y definirá la interfaz de usuario del asistente de este proyecto.

Para crear el proyecto de asistente

  1. En Visual Studio, abra la solución CustomActionProjectItem

  2. En Explorador de soluciones, abra el menú contextual para el nodo de la solución, elija Agregary, a continuación Nuevo proyecto.

    [!NOTA]

    En los proyectos de Visual Basic, el nodo de la solución aparece en el Explorador de soluciones solo cuando se activa la casilla Mostrar solución siempre en General, Projects and Solutions, Options Dialog Box.

  3. En el cuadro de diálogo Nuevo proyecto , expanda los nodos Visual c# o Visual Basic y, a continuación el nodo Windows .

  4. En la parte superior del cuadro de diálogo Nuevo proyecto , asegúrese de que .NET Framework 4,5 se elige en la lista de versiones de .NET Framework.

  5. Elija la plantilla de proyecto Biblioteca de controles de usuario de WPF , asigne al proyecto ItemTemplateWizard, y elija el botón Aceptar .

    Visual Studio agrega el proyecto ItemTemplateWizard a la solución.

  6. Elimine el elemento UserControl1 del proyecto.

Configurar el proyecto de asistente

Antes de crear el asistente, debe agregar una ventana de (WPF) de Windows Presentation Foundation, un archivo de código, y referencias de ensamblado al proyecto.

Para configurar el proyecto de asistente

  1. En Explorador de soluciones, abra el menú contextual del nodo del proyecto ItemTemplateWizard y, a continuación Propiedades.

  2. En Diseñador de proyectos, asegúrese de que el marco de destino esté establecido en .NET Framework 4,5.

    Para los proyectos de Visual c#, puede establecer este valor en la pestaña Aplicación .Para los proyectos de Visual Basic, puede establecer este valor en la pestaña Compilar .Para obtener más información, vea Cómo: Usar como destino una versión de .NET Framework.

  3. En el proyecto ItemTemplateWizard , agregue un elemento Ventana (WPF) al proyecto, y llame al elemento WizardWindow.

  4. Agregue dos archivos de código que se llama CustomActionWizard y cadenas.

  5. Abrir el menú contextual para el proyecto ItemTemplateWizard y, a continuación Agregar referencia.

  6. En el cuadro de diálogo Administrador de referencia - ItemTemplateWizard , bajo el nodo Ensamblados , elija el nodo Extensiones .

  7. Active las casillas situadas junto a los siguientes ensamblados, y después elija el botón Aceptar :

    • EnvDTE

    • Microsoft.VisualStudio.Shell.11.0

    • Microsoft.VisualStudio.TemplateWizardInterface

  8. En Explorador de soluciones, en la carpeta Referencias del proyecto ItemTemplateWizard, elija la referencia EnvDTE .

    [!NOTA]

    En los proyectos de Visual Basic, la carpeta Referencias solo aparece cuando está activada la casilla Mostrar solución siempre del General, Projects and Solutions, Options Dialog Box.

  9. En la ventana Propiedades , cambie el valor de la propiedad Incrustar tipos de interoperabilidad a False.

Definir las cadenas de identificación y ubicación predeterminadas para las acciones personalizadas

Cada acción personalizada tiene una ubicación y un identificador que se especifican en los atributos Location y GroupID del elemento CustomAction en el archivo Elements.xml.En este paso, va a definir algunas cadenas válidas para estos atributos en el proyecto ItemTemplateWizard.Al completar este tutorial, estas cadenas se escriben en el archivo Elements.xml del elemento de proyecto acción personalizada cuando los usuarios especifican una ubicación y un identificador en el asistente.

Para que resulte más sencillo, este ejemplo solo admite un subconjunto de ubicaciones e identificadores predeterminados disponibles.Para consultar la lista completa, vea Default Custom Action Locations and IDs.

Para definir las cadenas de identificación y ubicación predeterminadas

  1. abierto.

  2. En el proyecto ItemTemplateWizard , reemplace el código del archivo de código de cadenas con el código siguiente.

    ' This sample only supports several custom action locations and their group IDs. 
    Friend Class CustomActionLocations
        Friend Const ListEdit As String = "Microsoft.SharePoint.ListEdit"
        Friend Const StandardMenu As String = "Microsoft.SharePoint.StandardMenu"
    End Class
    
    Friend Class StandardMenuGroupIds
        Friend Const Actions As String = "ActionsMenu"
        Friend Const ActionsSurvey As String = "ActionsMenuForSurvey"
        Friend Const NewMenu As String = "NewMenu"
        Friend Const Settings As String = "SettingsMenu"
        Friend Const SettingsSurvey As String = "SettingsMenuForSurvey"
        Friend Const SiteActions As String = "SiteActions"
        Friend Const Upload As String = "UploadMenu"
        Friend Const ViewSelector As String = "ViewSelectorMenu"
    End Class
    
    Friend Class ListEditGroupIds
        Friend Const Communications As String = "Communications"
        Friend Const GeneralSettings As String = "GeneralSettings"
        Friend Const Permissions As String = "Permissions"
    End Class
    
    Friend Class DefaultTextBoxStrings
        Friend Const TitleText As String = "Replace this with your title"
        Friend Const DescriptionText As String = "Replace this with your description"
        Friend Const UrlText As String = "~site/Lists/Tasks/AllItems.aspx"
    End Class
    
    
    namespace ItemTemplateWizard
    {
        // This sample only supports several custom action locations and their group IDs. 
        internal class CustomActionLocations
        {
            internal const string ListEdit = "Microsoft.SharePoint.ListEdit";
            internal const string StandardMenu = "Microsoft.SharePoint.StandardMenu";
        }
    
        internal class StandardMenuGroupIds
        {
            internal const string Actions = "ActionsMenu";
            internal const string ActionsSurvey = "ActionsMenuForSurvey";
            internal const string NewMenu = "NewMenu";
            internal const string Settings = "SettingsMenu";
            internal const string SettingsSurvey = "SettingsMenuForSurvey";
            internal const string SiteActions = "SiteActions";
            internal const string Upload = "UploadMenu";
            internal const string ViewSelector = "ViewSelectorMenu";
        }
    
        internal class ListEditGroupIds
        {
            internal const string Communications = "Communications";
            internal const string GeneralSettings = "GeneralSettings";
            internal const string Permissions = "Permissions";
        }
    
        internal class DefaultTextBoxStrings
        {
            internal const string TitleText = "Replace this with your title";
            internal const string DescriptionText = "Replace this with your description";
            internal const string UrlText = "~site/Lists/Tasks/AllItems.aspx";
        }
    }
    

Crear la interfaz de usuario del asistente

Agregue el código XAML que define la interfaz de usuario del asistente y algún otro código que enlace algunos de los controles del asistente con las cadenas de identificación.El asistente que crea se parece al asistente integrado para los proyectos de SharePoint en Visual Studio.

Para crear la interfaz de usuario del asistente

  1. En el proyecto ItemTemplateWizard , abra el menú contextual para el archivo WizardWindow.xaml y, a continuación Abrir para abrir la ventana del diseñador.

  2. En la vista XAML, reemplace el código XAML actual por el siguiente.El XAML define una interfaz de usuario que incluye un título, controles para especificar el comportamiento de la acción personalizada y los botones de navegación en la parte inferior de la ventana.

    [!NOTA]

    El proyecto tendrá algunos errores de compilación después de agregar este código.Estos errores desaparecerán al agregar código en pasos posteriores.

    <ui:DialogWindow x:Class="ItemTemplateWizard.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 Grid.Row="0" Content="Configure the Custom Action" Name="pageHeaderLabel" HorizontalAlignment="Left" 
                       VerticalAlignment="Center" Margin="18,0,0,0" FontWeight="ExtraBold" />
            </Grid>
            <Grid Grid.Row="1" Name="mainGrid">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="20*" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="400*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <StackPanel Grid.Row="0" Grid.Column="1" Orientation="Vertical">
                    <Label Margin="0,20,0,0" Content="Location:" Name="locationLabel" FontWeight="Bold" />
                    <RadioButton Content="_List Edit" Margin="5,0,0,0" Name="listEditRadioButton" 
                                 Checked="listEditRadioButton_Checked" FontWeight="Normal"  />
                    <RadioButton Content="_Standard Menu" Margin="5,5,0,0" Name="standardMenuRadioButton" 
                                 Checked="standardMenuRadioButton_Checked" FontWeight="Normal" />
                </StackPanel>
                <Label Grid.Row="1" Grid.Column="1" Margin="0,15,0,0" Content="_Group ID:" Name="groupIdLabel" 
                       FontWeight="Bold" Target="{Binding ElementName=idComboBox}" />
                <ComboBox Grid.Row="1" Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" Height="23" 
                          Width="253" Name="idComboBox" IsEditable="False" IsSynchronizedWithCurrentItem="True" />
                <Label Grid.Row="2" Grid.Column="1" Margin="0,15,0,0" Content="_Title:" Name="titleLabel" 
                       FontWeight="Bold" Target="{Binding ElementName=titleTextBox}" />
                <TextBox Grid.Row="2" Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" Height="23" 
                         Name="titleTextBox" Width="410" Text="" />
                <Label Grid.Row="3" Grid.Column="1" Margin="0,15,0,0" Content="_Description:" Name="descriptionLabel" 
                       FontWeight="Bold" Target="{Binding ElementName=descriptionTextBox}" />
                <TextBox Grid.Row="3" Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" Height="23" 
                         Name="descriptionTextBox" Width="410" Text="" />
                <Label Grid.Row="4" Grid.Column="1" Margin="0,15,0,0" Content="_URL:" Height="28" Name="urlLabel" 
                       FontWeight="Bold" Target="{Binding ElementName=urlTextBox}" />
                <TextBox Grid.Row="4" Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" Height="23" 
                         Name="urlTextBox" Width="410" Text="" />
            </Grid>
            <Rectangle Grid.Row="2" Name="separatorRectangle" Fill="White"  />
            <StackPanel Grid.Row="3" Name="navigationPanel" Orientation="Horizontal">
                <Button Content="_Finish" Margin="500,0,0,0" Height="25" Name="finishButton" Width="85" 
                        Click="finishButton_Click" IsDefault="True" />
                <Button Content="Cancel" Margin="10,0,0,0" Height="25" Name="cancelButton" Width="85" IsCancel="True" />
            </StackPanel>
        </Grid>
    </ui:DialogWindow>
    

    [!NOTA]

    La ventana que se crea en este XAML se deriva de la clase base DialogWindow .Cuando se agrega un cuadro de diálogo WPF personalizado en Visual Studio, se recomienda deriva el cuadro de diálogo de esta clase para tener un estilo coherente con otros cuadros de diálogo en Visual Studio y para evitar los problemas que se podrían producir de otra manera con cuadros de diálogo modales.Para obtener más información, vea Cómo: Crear y administrar los cuadros de diálogo.

  3. Si está desarrollando un proyecto de Visual Basic, quite el espacio de nombres ItemTemplateWizard class name WizardWindow en el atributo x:Class de elemento Window .Este elemento es la primera línea del XAML.Cuando lo haga, la primera línea debe ser similar al código siguiente:

    <Window x:Class="WizardWindow"
    
  4. En código- subyacente del archivo WizardWindow.xaml, reemplace el código actual con el código siguiente.

    Public Class WizardWindow
        Private standardMenuGroups As List(Of String)
        Private listEditGroups As List(Of String)
        Private standardMenuGroupIdBinding As Binding
        Private listEditGroupIdBinding As Binding
        Private standardMenuGroupIdBindingView As ListCollectionView
        Private listEditGroupIdBindingView As ListCollectionView
    
        Private Sub Window_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
            standardMenuGroups = New List(Of String) From {
                StandardMenuGroupIds.Actions,
                StandardMenuGroupIds.ActionsSurvey,
                StandardMenuGroupIds.NewMenu,
                StandardMenuGroupIds.Settings,
                StandardMenuGroupIds.SettingsSurvey,
                StandardMenuGroupIds.SiteActions,
                StandardMenuGroupIds.Upload,
                StandardMenuGroupIds.ViewSelector}
            listEditGroups = New List(Of String) From {
                ListEditGroupIds.Communications,
                ListEditGroupIds.GeneralSettings,
                ListEditGroupIds.Permissions}
    
            standardMenuGroupIdBinding = New Binding()
            standardMenuGroupIdBinding.Source = standardMenuGroups
            listEditGroupIdBinding = New Binding()
            listEditGroupIdBinding.Source = listEditGroups
    
            standardMenuGroupIdBindingView = CType(CollectionViewSource.GetDefaultView(standardMenuGroups), ListCollectionView)
            listEditGroupIdBindingView = CType(CollectionViewSource.GetDefaultView(listEditGroups), ListCollectionView)
    
            standardMenuRadioButton.IsChecked = True
        End Sub
    
        Private Sub standardMenuRadioButton_Checked(ByVal sender As Object, ByVal e As RoutedEventArgs)
            BindingOperations.ClearBinding(idComboBox, ComboBox.ItemsSourceProperty)
            idComboBox.SetBinding(ComboBox.ItemsSourceProperty, standardMenuGroupIdBinding)
            standardMenuGroupIdBindingView.MoveCurrentToFirst()
        End Sub
    
        Private Sub listEditRadioButton_Checked(ByVal sender As Object, ByVal e As RoutedEventArgs)
            BindingOperations.ClearBinding(idComboBox, ComboBox.ItemsSourceProperty)
            idComboBox.SetBinding(ComboBox.ItemsSourceProperty, listEditGroupIdBinding)
            listEditGroupIdBindingView.MoveCurrentToFirst()
        End Sub
    
        Private Sub finishButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            Me.DialogResult = True
            Me.Close()
        End Sub
    End Class
    
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using Microsoft.VisualStudio.PlatformUI;
    
    namespace ItemTemplateWizard
    {
        public partial class WizardWindow : DialogWindow
        {
            private List<string> standardMenuGroups;
            private List<string> listEditGroups;
            private Binding standardMenuGroupIdBinding;
            private Binding listEditGroupIdBinding;
            private ListCollectionView standardMenuGroupIdBindingView;
            private ListCollectionView listEditGroupIdBindingView;
    
            public WizardWindow()
            {
                InitializeComponent();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                standardMenuGroups = new List<string>() { 
                    StandardMenuGroupIds.Actions,
                    StandardMenuGroupIds.ActionsSurvey,
                    StandardMenuGroupIds.NewMenu, 
                    StandardMenuGroupIds.Settings, 
                    StandardMenuGroupIds.SettingsSurvey,
                    StandardMenuGroupIds.SiteActions, 
                    StandardMenuGroupIds.Upload, 
                    StandardMenuGroupIds.ViewSelector };
                listEditGroups = new List<string>() { 
                    ListEditGroupIds.Communications, 
                    ListEditGroupIds.GeneralSettings,
                    ListEditGroupIds.Permissions };
    
                standardMenuGroupIdBinding = new Binding();
                standardMenuGroupIdBinding.Source = standardMenuGroups;
                listEditGroupIdBinding = new Binding();
                listEditGroupIdBinding.Source = listEditGroups;
    
                standardMenuGroupIdBindingView = (ListCollectionView)CollectionViewSource.GetDefaultView(standardMenuGroups);
                listEditGroupIdBindingView = (ListCollectionView)CollectionViewSource.GetDefaultView(listEditGroups);
    
                standardMenuRadioButton.IsChecked = true;
            }
    
            private void standardMenuRadioButton_Checked(object sender, RoutedEventArgs e)
            {
                BindingOperations.ClearBinding(idComboBox, ComboBox.ItemsSourceProperty);
                idComboBox.SetBinding(ComboBox.ItemsSourceProperty, standardMenuGroupIdBinding);
                standardMenuGroupIdBindingView.MoveCurrentToFirst();
            }
    
            private void listEditRadioButton_Checked(object sender, RoutedEventArgs e)
            {
                BindingOperations.ClearBinding(idComboBox, ComboBox.ItemsSourceProperty);
                idComboBox.SetBinding(ComboBox.ItemsSourceProperty, listEditGroupIdBinding);
                listEditGroupIdBindingView.MoveCurrentToFirst();
            }
    
            private void finishButton_Click(object sender, RoutedEventArgs e)
            {
                this.DialogResult = true;
                this.Close();
            }
        }
    }
    

Implementar el asistente

Para definir la funcionalidad del asistente, implemente la interfaz IWizard.

Para implementar el asistente

  • En el proyecto ItemTemplateWizard , abra el archivo de código CustomActionWizard y, a continuación reemplaza el código actual de este archivo por el código siguiente:

    Imports EnvDTE
    Imports Microsoft.VisualStudio.TemplateWizard
    Imports System
    Imports System.Collections.Generic
    
    Public Class CustomActionWizard
        Implements IWizard
    
        Private wizardPage As WizardWindow
    
    #Region "IWizard Methods"
    
        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
            wizardPage = New WizardWindow()
            Dim dialogCompleted? As Boolean = wizardPage.ShowModal()
    
            If (dialogCompleted = True) Then
                PopulateReplacementDictionary(replacementsDictionary)
            Else
                Throw New WizardCancelledException()
            End If
        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 implemented in this example.
        Public Sub BeforeOpeningFile(ByVal projectItem As ProjectItem) _
            Implements IWizard.BeforeOpeningFile
        End Sub
    
        Public Sub ProjectFinishedGenerating(ByVal project As Project) _
            Implements IWizard.ProjectFinishedGenerating
        End Sub
    
        Public Sub ProjectItemFinishedGenerating(ByVal projectItem As ProjectItem) _
            Implements IWizard.ProjectItemFinishedGenerating
        End Sub
    
        Public Sub RunFinished() Implements IWizard.RunFinished
        End Sub
    
    #End Region
    
        Private Sub PopulateReplacementDictionary(ByVal replacementsDictionary As Dictionary(Of String, String))
    
            ' Fill in the replacement values from the UI selections on the wizard page. These values are automatically inserted
            ' into the Elements.xml file for the custom action.
            Dim locationValue As String = If(wizardPage.standardMenuRadioButton.IsChecked,
                    CustomActionLocations.StandardMenu, CustomActionLocations.ListEdit)
            replacementsDictionary.Add("$LocationValue$", locationValue)
            replacementsDictionary.Add("$GroupIdValue$", CType(wizardPage.idComboBox.SelectedItem, String))
            replacementsDictionary.Add("$IdValue$", Guid.NewGuid().ToString())
    
            Dim titleText As String = DefaultTextBoxStrings.TitleText
            If False = String.IsNullOrEmpty(wizardPage.titleTextBox.Text) Then
                titleText = wizardPage.titleTextBox.Text
            End If
    
            Dim descriptionText As String = DefaultTextBoxStrings.DescriptionText
            If False = String.IsNullOrEmpty(wizardPage.descriptionTextBox.Text) Then
                descriptionText = wizardPage.descriptionTextBox.Text
            End If
    
            Dim urlText As String = DefaultTextBoxStrings.UrlText
            If False = String.IsNullOrEmpty(wizardPage.urlTextBox.Text) Then
                urlText = wizardPage.urlTextBox.Text
            End If
    
            replacementsDictionary.Add("$TitleValue$", titleText)
            replacementsDictionary.Add("$DescriptionValue$", descriptionText)
            replacementsDictionary.Add("$UrlValue$", urlText)
        End Sub
    End Class
    
    using EnvDTE;
    using Microsoft.VisualStudio.TemplateWizard;
    using System;
    using System.Collections.Generic;
    
    namespace ItemTemplateWizard
    {
        public class CustomActionWizard : IWizard
        {
            private WizardWindow wizardPage;
    
            public CustomActionWizard()
            {
            }
    
            #region IWizard Methods
    
            public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, 
                WizardRunKind runKind, object[] customParams)
            {
                wizardPage = new WizardWindow();
                Nullable<bool> dialogCompleted = wizardPage.ShowModal();
    
                if (dialogCompleted == true)
                {
                    PopulateReplacementDictionary(replacementsDictionary);
                }
                else
                {
                    throw new WizardCancelledException();
                }
            }
    
            // 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 implemented in this example.
            public void BeforeOpeningFile(ProjectItem projectItem)
            {
            }
    
            public void ProjectFinishedGenerating(Project project)
            {
            }
    
            public void ProjectItemFinishedGenerating(ProjectItem projectItem)
            {
            }
    
            public void RunFinished()
            {
            }
    
            #endregion
    
            private void PopulateReplacementDictionary(Dictionary<string, string> replacementsDictionary)
            {
                // Fill in the replacement values from the UI selections on the wizard page. These values are automatically inserted
                // into the Elements.xml file for the custom action.
                string locationValue = (bool)wizardPage.standardMenuRadioButton.IsChecked ?
                    CustomActionLocations.StandardMenu : CustomActionLocations.ListEdit;
                replacementsDictionary.Add("$LocationValue$", locationValue);
                replacementsDictionary.Add("$GroupIdValue$", (string)wizardPage.idComboBox.SelectedItem);
                replacementsDictionary.Add("$IdValue$", Guid.NewGuid().ToString());
    
                string titleText = DefaultTextBoxStrings.TitleText;
                if (!String.IsNullOrEmpty(wizardPage.titleTextBox.Text))
                {
                    titleText = wizardPage.titleTextBox.Text;
                }
    
                string descriptionText = DefaultTextBoxStrings.DescriptionText;
                if (!String.IsNullOrEmpty(wizardPage.descriptionTextBox.Text))
                {
                    descriptionText = wizardPage.descriptionTextBox.Text;
                }
    
                string urlText = DefaultTextBoxStrings.UrlText;
                if (!String.IsNullOrEmpty(wizardPage.urlTextBox.Text))
                {
                    urlText = wizardPage.urlTextBox.Text;
                }
    
                replacementsDictionary.Add("$TitleValue$", titleText);
                replacementsDictionary.Add("$DescriptionValue$", descriptionText);
                replacementsDictionary.Add("$UrlValue$", urlText);
            }
        }
    }
    

Punto de control

En este punto del tutorial, todo el código del asistente está en el proyecto.Compile el proyecto para asegurarse de que se compila sin errores.

Para compilar el proyecto

  • En la barra de menú, elija Generar, Compilar solución.

Asociar el asistente a la plantilla de elemento

Ahora que ha implementado el asistente, debe asociarlo a la plantilla de elementos acción personalizada completando tres pasos principales:

  1. Firmar el ensamblado del asistente con un nombre seguro.

  2. Obtener el token de clave pública del ensamblado del asistente.

  3. Agregar una referencia al ensamblado del asistente en el archivo .vstemplate de la plantilla de elemento Acción personalizada.

Para firmar el ensamblado del asistente con un nombre seguro

  1. En Explorador de soluciones, abra el menú contextual del nodo del proyecto ItemTemplateWizard y, a continuación Propiedades.

  2. En la ficha Firma, active la casilla Firmar el ensamblado.

  3. En la lista Elija un archivo de clave de nombre seguro , elija <New...>.

  4. En el cuadro de diálogo Crear clave de nombre seguro , escriba un nombre, desactive la casilla Proteger mi archivo de clave mediante contraseña , y elija el botón Aceptar .

  5. En la barra de menú, elija Generar, Compilar solución.

Para obtener el token de clave pública del ensamblado del asistente

  1. En una ventana de símbolo del sistema de Visual Studio, ejecute el comando siguiente, reemplazando PathToWizardAssembly con la ruta de acceso completa al ensamblado ItemTemplateWizard.dll integrado del proyecto ItemTemplateWizard en el equipo de desarrollo.

    sn.exe -T PathToWizardAssembly
    

    El token de clave pública del ensamblado ItemTemplateWizard.dll se escribe en la ventana del símbolo del sistema de Visual Studio.

  2. Mantenga abierta la ventana del símbolo del sistema de Visual Studio.Necesitará el token de clave pública completar el procedimiento siguiente.

Para agregar una referencia al ensamblado del asistente del archivo .vstemplate

  1. En Explorador de soluciones, expanda el nodo del proyecto ItemTemplate , y abra el archivo ItemTemplate.vstemplate.

  2. Cuando se acerque el final del archivo, agregue el siguiente elemento WizardExtension entre las etiquetas </TemplateContent> y </VSTemplate>.Reemplace el valor TheTokenPublicKeyToken con el token de clave pública que obtuvo en el procedimiento anterior.

    <WizardExtension>
      <Assembly>ItemTemplateWizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=YourToken</Assembly>
      <FullClassName>ItemTemplateWizard.CustomActionWizard</FullClassName>
    </WizardExtension>
    

    Para obtener más información sobre el elemento WizardExtension, vea WizardExtension (Elemento, Plantillas de Visual Studio).

  3. Guarde y cierre el archivo.

Agregar parámetros reemplazables al archivo Elements.xml de la plantilla de elemento

Agregue varios parámetros reemplazables al archivo Elements.xml del proyecto ItemTemplate.Estos parámetros se inicializan en el método PopulateReplacementDictionary de la clase CustomActionWizard que definió anteriormente.Cuando un usuario agrega un elemento de proyecto Acción personalizada a un proyecto, Visual Studio reemplaza automáticamente estos parámetros en el archivo Elements.xml del nuevo elemento de proyecto por los valores especificados en el asistente.

Un parámetro reemplazable es un token que empieza y termina por el signo de dólar ($).Además de definición poseer parámetros reemplazables, puede usar los parámetros integrados que el sistema de proyectos de SharePoint define y se inicializa.Para obtener más información, vea Parámetros reemplazables.

Para agregar parámetros reemplazables al archivo Elements.xml

  1. En el proyecto ItemTemplate, reemplace el contenido del archivo Elements.xml con el XML siguiente.

    <?xml version="1.0" encoding="utf-8" ?>
    <Elements Id="$guid8$" xmlns="https://schemas.microsoft.com/sharepoint/">
      <CustomAction Id="$IdValue$"
                    GroupId="$GroupIdValue$"
                    Location="$LocationValue$"
                    Sequence="1000"
                    Title="$TitleValue$"
                    Description="$DescriptionValue$" >
        <UrlAction Url="$UrlValue$"/>
      </CustomAction>
    </Elements>
    

    El nuevo código XML cambia los valores de los atributos Id, GroupId, Location, Description y Url por parámetros reemplazables.

  2. Guarde y cierre el archivo.

Agregar el asistente al paquete VSIX

En el archivo source.extension.vsixmanifest del proyecto VSIX, agregue una referencia al proyecto de asistente de modo que haya implementado con el paquete VSIX que contiene el elemento de proyecto.

Para agregar el asistente al paquete VSIX

  1. En Explorador de soluciones, abra el menú contextual del archivo source.extension.vsixmanifest en el proyecto elementoproyectoacciónpersonalizada y, a continuación Abrir para abrirlo en el editor de manifiestos.

  2. En el editor de manifiestos, elija la ficha Activos , elija el botón Nuevo .

    El cuadro de diálogo Agregar nuevo activo aparece.

  3. En la lista Tipo , elija Microsoft.VisualStudio.Assembly.

  4. En la lista Origen , elija Un proyecto de la solución actual.

  5. En la lista Proyecto , elija ItemTemplateWizard, y elija el botón Aceptar .

  6. En la barra de menú, elija Generar, Compilar solución, y asegúrese de que la solución se compila sin errores.

Probar el asistente

Ahora está preparado para probar el asistente.Primero, empiece a depurar la solución CustomActionProjectItem en la instancia experimental de Visual Studio.A continuación pruebe el asistente del elemento de proyecto acción personalizada en un proyecto de SharePoint en la instancia experimental de Visual Studio.Por último, compile y ejecute el proyecto SharePoint para comprobar que la acción personalizada funciona del modo esperado.

Para empezar a depurar la solución

  1. Reinicie Visual Studio con credenciales administrativas, y vuelva a abrir la solución elementoproyectoacciónpersonalizada.

  2. En el proyecto ItemTemplateWizard, abra el archivo de código CustomActionWizard, y después agregue un punto de interrupción a la primera línea de código en el método RunStarted .

  3. En la barra de menú, elija Depurar, Excepciones.

  4. En el cuadro de diálogo Excepciones , asegúrese de que las casillas Producida y No controlada por el usuario para Excepciones de Common Language Runtime están desactivadas, y elija el botón Aceptar .

  5. Empiece a depurar eligiendo la tecla F5, o, en la barra de menús, eligiendo Depurar, Iniciar depuración.

    Visual Studio instala la extensión en %UserProfile%\AppData\Local\Microsoft\VisualStudio\11.0Exp\Extensions\Contoso\Custom Action Project Item\1.0 and starts an experimental instance of Visual Studio.Probará el elemento de proyecto en esta instancia de Visual Studio.

Para probar el asistente en Visual Studio

  1. En la instancia experimental de Visual Studio, en la barra de menú, elija Archivo, Nuevo, Proyecto.

  2. Expanda el nodo Visual c# o Visual Basic (dependiendo del lenguaje que la plantilla de elementos admite), expanda el nodo SharePoint y, a continuación el nodo 2010 .

  3. En la lista de plantillas de proyecto, elija Proyecto de SharePoint 2010, asigne al proyecto CustomActionWizardTest, y elija el botón Aceptar .

  4. En Asistente para la personalización de SharePoint, escriba la dirección URL del sitio que desea utilizar para depurar, y elija el botón Finalizar .

  5. En Explorador de soluciones, abra el menú contextual para el nodo del proyecto, elija Agregary, a continuación Nuevo elemento.

  6. En el cuadro de diálogo Agregar nuevo elemento - CustomItemWizardTest , expanda el nodo SharePoint , expanda el nodo 2010 .

  7. En la lista de elementos de proyecto, elija el elemento acción personalizada , y elija el botón Agregar .

  8. Compruebe que el código de la otra instancia de Visual Studio se detiene en el punto de interrupción que estableció anteriormente en el método RunStarted.

  9. Continuar depurando el proyecto eligiendo la tecla F5 o, en la barra de menús, eligiendo Depurar, Continuar.

    Aparece el Asistente para la personalización de SharePoint.

  10. En Ubicación, elija el botón de opción Edición de lista .

  11. En la lista Identificador del grupo , elija Comunicaciones.

  12. En el cuadro Título , entre en Centro para desarrolladores de SharePoint.

  13. En el cuadro Descripción , entre en Abra el sitio Web del centro para desarrolladores de SharePoint.

  14. En el cuadro Dirección URL , entre en https://msdn.microsoft.com/sharepoint/default.aspx, y elija el botón Finalizar .

    Studio isual agrega un elemento denominado CustomAction1 al proyecto y abre el archivo Elements.xml en el editor.Compruebe que Elements.xml contiene los valores especificados en el asistente.

Para probar la acción personalizada en SharePoint

  1. En la instancia experimental de Visual Studio, elija la tecla F5 o, en la barra de menú, elija Depurar, Iniciar depuración.

    La acción personalizada se empaqueta e implementa en el sitio de SharePoint especificado por la propiedad URL del sitio de proyecto, y el explorador web se abre en la página predeterminada de este sitio.

    [!NOTA]

    Si aparece el cuadro de diálogo Depuración de scripts deshabilitada , elija el botón .

  2. En el área de listas del sitio de SharePoint, elija el vínculo Tareas .

    La página Tareas – todas las tareas aparece.

  3. En la pestaña Herramientas de la lista ribbon, elija la ficha Lista y, a continuación, en el grupo Configuración , elija Configuración de la lista.

    La página Configuración de la lista aparece.

  4. En Comunicaciones que dirige cerca de la parte superior de la página, elija el vínculo Centro para desarrolladores de SharePoint , comprueba que el explorador el sitio Web https://msdn.microsoft.com/sharepoint/default.aspx, y luego cierre el explorador.

Limpiar el equipo de desarrollo

Después de probar el elemento de proyecto, quite la plantilla de elemento de proyecto de la instancia experimental de Visual Studio.

para limpiar el equipo de desarrollo

  1. En la instancia experimental de Visual Studio, en la barra de menú, elija Herramientas, Extensiones y actualizaciones.

    El cuadro de diálogo Extensiones y actualizaciones abra.

  2. En la lista de extensiones, elija la extensión Elemento de proyecto acción personalizada , y elija el botón Desinstalar .

  3. En el cuadro de diálogo que aparece, elija el botón para confirmar que desea desinstalar la extensión, y elija el botón Reiniciar ahora para completar la desinstalación.

  4. Cierre ambas instancias de Visual Studio (la instancia experimental y la instancia de Visual Studio en la que la solución CustomActionProjectItem está abierto).

Vea también

Tareas

Tutorial: Crear un elemento de proyecto de acción personalizado con una plantilla de elementos, parte 1

Cómo: Utilizar los asistentes con las plantillas de proyectos

Referencia

Referencia de esquema de plantillas de Visual Studio

IWizard

Conceptos

Definir tipos de elementos de proyecto personalizados de SharePoint

Crear plantillas de elemento y plantillas de proyecto para los elementos de proyecto de SharePoint

Otros recursos

Ubicaciones predeterminadas y id. de la acción personalizada