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 a la que se va a navegar al hacer clic) y agrega esta información al archivo Elements.xml del nuevo elemento de proyecto.

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 2010.

  • 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, el código y otros archivos para este tutorial de la siguiente ubicación: https://go.microsoft.com/fwlink/?LinkId=191369.

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 nuevo 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. Abra la solución CustomActionProjectItem en Visual Studio.

  2. En el Explorador de soluciones, haga clic con el botón secundario en el nodo de la solución, después haga clic en Agregar y, a continuación, en 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, Proyectos y soluciones, Opciones (Cuadro de diálogo).

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

  4. Asegúrese de que .NET Framework 4 esté seleccionado en el cuadro combinado de la parte superior del cuadro de diálogo Nuevo proyecto.

  5. Seleccione la plantilla de proyecto Biblioteca de controles de usuario de WPF.

  6. En el cuadro Nombre, escriba ItemTemplateWizard.

  7. Haga clic en Aceptar.

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

  8. Elimine el elemento UserControl1 del proyecto.

Configurar el proyecto de asistente

Antes de crear el asistente, tiene que agregar referencias de ensamblado, el archivo de código y una ventana de WPF al proyecto.

Para configurar el proyecto de asistente

  1. En el Explorador de soluciones, haga clic con el botón secundario en el nodo de proyecto ItemTemplateWizard y, a continuación, haga clic en Propiedades.

  2. En el Diseñador de proyectos, cambie el marco de trabajo de destino de .NET Framework Client Profile 4 a .NET Framework 4. En los proyectos de Visual C#, puede hacerlo en la pestaña Aplicación; en los proyectos de Visual Basic, puede hacerlo en la pestaña Compilar. Para obtener más información, vea Cómo: Elegir perfil o versión de destino de .NET Framework.

    Nota

    De forma predeterminada, al crear un nuevo proyecto destinado a .NET Framework 4, el proyecto es para la versión Client Profile. Este tutorial requiere la versión completa de .NET Framework 4.

  3. En el proyecto ItemTemplateWizard, agregue un nuevo elemento Ventana (WPF) al proyecto. Asigne el nombre WizardWindow al nuevo elemento.

  4. Agregue dos archivos de código con los nombres siguientes:

    • CustomActionWizard

    • Cadenas

  5. Haga clic en la opción Agregar referencia del menú Proyecto.

  6. En la pestaña .NET, presione CTRL y haga clic en los ensamblados siguientes y, a continuación, haga clic en Aceptar:

    • EnvDTE

    • Microsoft.VisualStudio.Shell.10.0

    • Microsoft.VisualStudio.TemplateWizardInterface

  7. En el Explorador de soluciones, en la carpeta Referencias del proyecto ItemTemplateWizard, haga clic en EnvDTE.

    Nota

    En los proyectos de Visual Basic, la carpeta Referencias solo aparece cuando está activada la casilla Mostrar solución siempre del General, Proyectos y soluciones, Opciones (Cuadro de diálogo).

  8. En la ventana Propiedades, cambie el valor de 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. Cuando complete este tutorial, estas cadenas se escribirán en el archivo Elements.xml del elemento de proyecto Acción personalizada cuando los usuarios seleccionen 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. En el proyecto ItemTemplateWizard, abra el archivo de código Strings.

  2. Reemplace el código de este archivo por 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 2010.

Para crear la interfaz de usuario del asistente

  1. En el proyecto ItemTemplateWizard, haga doble clic en el archivo WizardWindow.xaml para abrir la ventana del diseñador.

  2. En la vista XAML del diseñador, 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 XAML. 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.10.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 derivar el cuadro de diálogo de esta clase para que tenga un estilo coherente con otros cuadros de diálogo de Visual Studio y para evitar los problemas de diálogo modal que pueden producirse en caso contrario. Para obtener más información, vea How to: Create and Manage Dialog Boxes.

  3. Si está desarrollando un proyecto de Visual Basic, quite el espacio de nombres ItemTemplateWizard del nombre de clase WizardWindow del atributo x:Class del elemento Window. Esta es la primera línea del código XAML. Cuando termine, la primera línea tendrá el aspecto siguiente:

    <Window x:Class="WizardWindow"
    
  4. Abra el archivo de código subyacente del archivo WizardWindow.xaml.

  5. Reemplace el código de este archivo por 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

  1. En el proyecto ItemTemplateWizard, abra el archivo de código CustomActionWizard.

  2. Reemplace el código 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 generar el proyecto

  • En el menú Generar, seleccione Generar solución.

Asociar el asistente a la plantilla de elemento

Ahora que ha implementado el asistente, debe asociar el asistente a la plantilla de elemento Acción personalizada. Hay tres pasos principales que debe completar para ello:

  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 el Explorador de soluciones, haga clic con el botón secundario en el nodo del proyecto ItemTemplateWizard y, a continuación, haga clic en Propiedades.

  2. Haga clic en la ficha Firma.

  3. Active la casilla Firmar el ensamblado.

  4. En la lista desplegable Elija un archivo de clave de nombre completo, seleccione <Nuevo...>.

  5. En el cuadro de diálogo Crear clave de nombre seguro, escriba un nombre y desactive la casilla Proteger mi archivo de clave mediante contraseña.

  6. Haga clic en Aceptar.

  7. En el menú Generar, seleccione Generar solución.

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

  1. Abra una ventana Símbolo del sistema de Visual Studio.

  2. Ejecute el siguiente comando. Reemplace la ruta de acceso al ensamblado del asistente por la ruta de acceso completa al ensamblado ItemTemplateWizard.dll integrado del proyecto ItemTemplateWizard en el equipo de desarrollo.

    sn.exe -T path to wizard assembly
    

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

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

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

  1. En el Explorador de soluciones, expanda el nodo de 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 de su token del atributo PublicKeyToken por el token de clave pública que obtuvo en el procedimiento anterior.

    <WizardExtension>
      <Assembly>ItemTemplateWizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=your token</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 carácter del signo de dólar ($). Además de definir sus propios parámetros reemplazables, puede usar los parámetros integrados que se definen y se inicializan en el sistema de proyectos de SharePoint. Para obtener más información, vea Parámetros reemplazables.

Para agregar parámetros reemplazables al archivo Elements.xml

  1. Abra el archivo Elements.xml del proyecto ItemTemplate.

  2. Reemplace el contenido de este archivo por el código 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.

  3. Guarde y cierre el archivo.

Agregar el asistente al paquete VSIX

Para implementar el asistente con el paquete VSIX que contiene el elemento de proyecto, agregue una referencia al proyecto de asistente en el archivo source.extension.vsixmanifest del proyecto VSIX.

Para agregar el asistente al paquete VSIX

  1. En el Explorador de soluciones, haga doble clic en el archivo source.extension.vsixmanifest en el proyecto ElementoProyectoAcciónPersonalizada.

    Visual Studio abre el archivo en el editor de manifiestos.

  2. En la sección Contenido del editor, haga clic en el botón Agregar contenido.

  3. En el cuadro de diálogo Agregar contenido, en el cuadro de lista Seleccione un tipo de contenido, seleccione Asistente para plantillas.

  4. En Seleccione un origen, haga clic en el botón de radio Proyecto y seleccione ItemTemplateWizard en el cuadro de lista adyacente.

  5. Haga clic en Aceptar.

  6. En el menú Generar, haga clic en Generar solución. 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 de 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 privilegios de administrador y abra la solución ElementoProyectoAcciónPersonalizada.

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

  3. En el menú Depurar, haga clic en Excepciones.

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

  5. Haga clic en Aceptar.

  6. Presione F5 para iniciar la depuración.

    Visual Studio instala la extensión en %UserProfile%\AppData\Local\Microsoft\VisualStudio\10.0Exp\Extensions\Contoso\Elemento proyecto acción personalizada\1 .0 e inicia una instancia experimental de 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 el menú Archivo, seleccione Nuevo y haga clic en Proyecto.

  2. Expanda Visual C# o Visual Basic (en función del lenguaje que admita la plantilla de elemento), expanda SharePoint y, a continuación, haga clic en 2010.

  3. En la lista de plantillas de proyecto, haga clic en Proyecto vacío.

  4. En el cuadro Nombre, escriba CustomActionWizardTest.

  5. Haga clic en Aceptar.

  6. En el Asistente para la personalización de SharePoint, escriba la dirección URL del sitio que desea utilizar en la depuración y haga clic en Finalizar.

  7. En el Explorador de soluciones, haga clic en el nodo del proyecto con el botón secundario, seleccione Agregar y haga clic en Nuevo elemento.

  8. En el cuadro de diálogo Agregar nuevo elemento, haga clic en el nodo 2010 bajo el nodo SharePoint.

  9. En la lista de elementos de proyecto, haga clic en Acción personalizada y, a continuación, haga clic en Agregar.

  10. 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. Presione F5 para continuar y depurar el proyecto.

  11. En el asistente, realice las siguientes selecciones:

    • En Ubicación, haga clic en List Edit.

    • En Group ID, haga clic en Communications.

    • Como Title, escriba SharePoint Developer Center.

    • En Description, escriba Opens the SharePoint Developer Center Web site.

    • En URL, escriba https://msdn.microsoft.com/sharepoint/default.aspx.

  12. Haga clic en Finalizar.

    Visual Studio agrega un nuevo elemento denominado CustomAction1 a su 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, presione F5. La acción personalizada se empaqueta e implementa en el sitio de SharePoint especificado por la propiedad Site URL del proyecto. El explorador web se abre a la página predeterminado de este sitio.

    Nota

    Si se muestra el cuadro de diálogo Depuración de scripts deshabilitada, haga clic en para continuar depurando el proyecto.

  2. En el área de inicio rápido, haga clic en Tareas.

  3. En la cinta, haga clic en la pestaña Lista.

  4. En el grupo Configuración, haga clic en Configuración de la lista.

  5. En el encabezado Comunicaciones situado junto a la parte superior de la página, compruebe que aparece un vínculo con el texto SharePoint Developer Center.

  6. Haga clic en el vínculo SharePoint Developer Center. Compruebe que el explorador abre el sitio web https://msdn.microsoft.com/sharepoint/default.aspx.

  7. Cierre el explorador web.

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 el menú Herramientas, haga clic en Administrador de extensiones.

    Se abre el cuadro de diálogo Administrador de extensiones.

  2. En la lista de extensiones, haga clic en Elemento Proyecto Acción Personalizada y, a continuación, haga clic Desinstalar.

  3. En el cuadro de diálogo que aparece, haga clic en para confirmar que desea desinstalar la extensión.

  4. Haga clic en Reiniciar ahora para completar la desinstalación.

  5. Cierre ambas instancias de Visual Studio (la instancia experimental y la instancia de Visual Studio que tiene abierta la solución ElementoProyectoAcciónPersonalizada).

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

Otros recursos

Definir tipos de elementos de proyecto personalizados de SharePoint

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

Ubicaciones e identificadores de acciones personalizadas predeterminadas