Partager via


Procédure pas à pas : création d'un élément de projet d'action personnalisé avec un modèle d'élément, deuxième partie

Après avoir défini un type personnalisé d'élément de projet SharePoint et l'avoir associé à un modèle d'élément dans Visual Studio, vous pouvez également fournir un Assistant pour le modèle.Vous pouvez utiliser l'Assistant pour collecter des informations auprès d'utilisateurs lorsqu'ils utilisent votre modèle pour ajouter à un projet une nouvelle instance de l'élément de projet.Les informations que vous collectez peuvent être utilisées pour initialiser l'élément de projet.

Dans cette procédure pas à pas, vous ajouterez un Assistant à l'élément de projet Action personnalisée présenté dans Procédure pas à pas : création d'un élément de projet d'action personnalisé avec un modèle d'élément, première partie.Lorsqu'un utilisateur ajoute un élément de projet action personnalisée à un projet SharePoint, l'assistant collecte également des informations sur l'action personnalisée (telle que son emplacement et l'URL vers lequel naviguer lorsqu'un utilisateur final le sélectionne) et ajoute ces informations dans le fichier Elements.xml du nouvel élément de projet.

Cette procédure pas à pas présente les tâches suivantes :

  • Création d'un Assistant pour un type d'élément de projet SharePoint personnalisé associé à un modèle d'élément.

  • Définition d'une interface utilisateur d'Assistant personnalisé semblable aux assistants intégrés des éléments de projet SharePoint dans Visual Studio.

  • Utilisation de paramètres remplaçables pour initialiser les fichiers de projet SharePoint avec les données que vous collectez dans l'Assistant.

  • Débogage et test de l'Assistant.

[!REMARQUE]

Vous pouvez télécharger une instance qui contient les projets remplis, de code, et d'autres fichiers pour cette procédure pas - à - pas de l'emplacement suivant : Fichiers projet pour les procédures pas - à - pas d'extensibilité d'outils sharepoint.

Composants requis

Pour exécuter cette procédure pas à pas, vous devez d'abord créer la solution CustomActionProjectItem en suivant la procédure décrite dans Procédure pas à pas : création d'un élément de projet d'action personnalisé avec un modèle d'élément, première partie.

Vous avez par ailleurs besoin des composants suivants sur l'ordinateur de développement pour exécuter cette procédure pas à pas :

Une connaissance des concepts suivants est utile, mais pas obligatoire, pour effectuer cette procédure pas à pas :

Création du projet d'Assistant

Pour exécuter cette procédure, vous devez ajouter un projet à la solution CustomActionProjectItem que vous avez créé dans Procédure pas à pas : création d'un élément de projet d'action personnalisé avec un modèle d'élément, première partie.Vous implémenterez l'interface IWizard et définirez l'interface utilisateur de l'Assistant dans ce projet.

Pour créer le projet d'Assistant

  1. Dans Visual Studio, ouvrez la solution CustomActionProjectItem

  2. Dans Explorateur de solutions, ouvrez le menu contextuel du nœud de solution, choisissez Ajouter, puis choisissez Nouveau projet.

    [!REMARQUE]

    Dans les projets Visual Basic, le nœud de la solution s'affiche dans l'Explorateur de solutions à condition d'avoir activé la case à cocher Toujours afficher la solution dans la General, Projects and Solutions, Options Dialog Box.

  3. Dans la boîte de dialogue Nouveau projet , développez les nœuds Visual C# ou Visual Basic , puis sélectionnez le nœud Fenêtres .

  4. En haut de la boîte de dialogue Nouveau projet , assurez -vous que .NET Framework 4,5 est sélectionnez dans la liste des versions du .NET Framework.

  5. Choisissez le modèle de projet Bibliothèque de contrôles utilisateur WPF , nommez le projet ItemTemplateWizard, puis choisissez le bouton OK .

    Visual Studio ajoute le projet ItemTemplateWizard à la solution.

  6. Supprimez l'élément UserControl1 du projet.

Configuration du projet d'Assistant

Avant de créer l'assistant, vous devez ajouter une fenêtre de Windows Presentation Foundation (WPF), un fichier de code, et des références d'assembly au projet.

Pour configurer le projet d'Assistant

  1. Dans Explorateur de solutions, ouvrez le menu contextuel du nœud de projet ItemTemplateWizard , puis choisissez Propriétés.

  2. Dans Concepteur de projets, assurez -vous que la version cible du. Net Framework a pour valeur le .NET Framework 4,5.

    Pour les projets visual C#, vous pouvez définir cette valeur sur Application tableau.Pour les projets Visual Basic, vous pouvez définir cette valeur sur Compiler tableau.Pour plus d’informations, consultez Comment : cibler une version du .NET Framework.

  3. Dans le projet ItemTemplateWizard , ajoutez un élément fenêtre (WPF) au projet, puis nommez l'élément WizardWindow.

  4. Ajoutez deux fichiers de code CustomActionWizard nommés et chaînes.

  5. Ouvrez le menu contextuel du projet ItemTemplateWizard , puis choisissez Ajouter une référence.

  6. Dans la boîte de dialogue gestionnaire de référence - ItemTemplateWizard , sous le nœud Assemblys , sélectionnez le nœud Extensions .

  7. Activez les cases à cocher en regard de les assemblys suivants, puis choisissez le bouton OK :

    • EnvDTE

    • Microsoft.VisualStudio.Shell.11.0

    • Microsoft.VisualStudio.TemplateWizardInterface

  8. Dans Explorateur de solutions, dans le dossier Références pour le projet ItemTemplateWizard, sélectionnez la référence EnvDTE .

    [!REMARQUE]

    Dans les projets Visual Basic, le dossier Références s'affiche uniquement si la case Toujours afficher la solution est cochée dans la General, Projects and Solutions, Options Dialog Box.

  9. Dans la fenêtre Propriétés , remplacez la valeur de la propriété Embed Interop Types par False.

Définition des chaînes d'emplacement et d'ID par défaut pour les actions personnalisées

À chaque action personnalisée correspondent un emplacement et un ID spécifiés dans les attributs GroupID et Location de l'élément CustomAction du fichier Elements.xml.Dans cette étape, vous allez définir certaines des chaînes valides pour ces attributs dans le projet ItemTemplateWizard.Lorsque vous terminez cette procédure pas - à - pas, ces chaînes sont écrites dans le fichier Elements.xml dans l'élément de projet action personnalisée lorsque les utilisateurs spécifiez un emplacement et un ID dans l'assistant.

Pour plus de simplicité, cet exemple prend en charge uniquement un sous-ensemble des emplacements et ID par défaut disponibles.Pour obtenir une liste complète, consultez Emplacements et ID d'action personnalisée par défaut (page éventuellement en anglais).

Pour définir les chaînes d'emplacement et d'ID par défaut

  1. ouvrez.

  2. Dans le projet ItemTemplateWizard , remplacez le code dans le fichier de code de chaînes par le code suivant.

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

Création de l'interface utilisateur de l'Assistant

Ajoutez du contenu XAML pour définir l'interface utilisateur de l'Assistant, ainsi que du code permettant de lier certains contrôles de l'Assistant aux chaînes d'ID.L'assistant que vous créez ressemble à l'assistant intégré des projets sharepoint dans Visual Studio.

Pour créer l'interface utilisateur de l'Assistant

  1. Dans le projet ItemTemplateWizard , ouvrez le menu contextuel du fichier WizardWindow.xaml , puis choisissez Ouvrir pour ouvrir la fenêtre dans le concepteur.

  2. En mode XAML, remplacez le code XAML existant par le code XAML suivant.Le code XAML définit une interface utilisateur qui se compose d'un titre, de contrôles permettant de spécifier le comportement de l'action personnalisée et des boutons de navigation dans la partie inférieure de la fenêtre.

    [!REMARQUE]

    Votre projet comportera des erreurs de compilation après avoir ajouté ce code.Ces erreurs disparaîtront lorsque vous ajouterez du code dans les étapes ultérieures.

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

    [!REMARQUE]

    La fenêtre créée dans ce XAML est dérivée de la classe de base d' DialogWindow .Lorsque vous ajoutez une boîte de dialogue de la personnalisés WPF dans Visual Studio, nous recommandons que vous dérivez votre boîte de dialogue de cette classe pour avoir un style cohérent avec d'autres boîtes de dialogue dans Visual Studio et pour éviter des problèmes susceptibles de se produire avec les boîtes de dialogue modale.Pour plus d’informations, consultez Comment : Créer et gérer des boîtes de dialogue.

  3. Si vous développez un projet Visual Basic, supprimez l'espace de noms d' ItemTemplateWizard du nom de classe d' WizardWindow dans l'attribut d' x:Class de l'élément d' Window .Cet élément est aligné en premier du XAML.Lorsque vous avez terminé, la première ligne doit ressembler au code suivant :

    <Window x:Class="WizardWindow"
    
  4. Dans le fichier code-behind correspondant au fichier WizardWindow.xaml, remplacez le code existant par le code suivant.

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

Implémentation de l'Assistant

Définissez les fonctionnalités de l'Assistant en implémentant l'interface IWizard.

Pour implémenter l'Assistant

  • Dans le projet ItemTemplateWizard , ouvrez le fichier de code CustomActionWizard , puis remplacez le code existant dans ce fichier par le code suivant :

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

Point de contrôle

À ce stade de la procédure, l'intégralité du code de l'Assistant fait désormais partie du projet.Générez le projet afin de garantir sa compilation sans erreur.

Pour générer votre projet

  • Dans la barre de menus, sélectionnez Générer, Générer la solution.

Association de l'Assistant au modèle d'élément

Maintenant que vous avez implémenté l'assistant, vous devez l'associer au modèle d'élément action personnalisée en effectuant trois étapes principales :

  1. Signature de l'assembly de l'Assistant avec un nom fort.

  2. Obtention du jeton de clé publique correspondant à l'assembly de l'Assistant.

  3. Ajout d'une référence à l'assembly de l'Assistant dans le fichier .vstemplate pour le modèle d'élément Action personnalisée.

Pour signer l'assembly de l'Assistant avec un nom fort

  1. Dans Explorateur de solutions, ouvrez le menu contextuel du nœud de projet ItemTemplateWizard , puis choisissez Propriétés.

  2. Sous l'onglet Signature, activez la case à cocher Signer l'assembly.

  3. Dans la liste choisissez un fichier de clé de nom fort , choisissez <New...>.

  4. Dans la boîte de dialogue créez la clé de nom fort , entrez un nom, désactivez la case à cocher protégez mon fichier de clé avec un mot de passe , puis choisissez le bouton OK .

  5. Dans la barre de menus, sélectionnez Générer, Générer la solution.

Pour obtenir le jeton de clé publique correspondant à l'assembly de l'Assistant

  1. Dans une fenêtre d'invite de commandes de Visual Studio, exécutez la commande suivante, en remplaçant PathToWizardAssembly par le chemin d'accès complet à l'assembly ItemTemplateWizard.dll créé pour le projet ItemTemplateWizard sur votre ordinateur de développement.

    sn.exe -T PathToWizardAssembly
    

    Le jeton de clé publique correspondant à l'assembly ItemTemplateWizard.dll est écrit dans la fenêtre Invite de commandes de Visual Studio.

  2. Ne fermez pas la fenêtre Invite de commandes de Visual Studio.Vous aurez besoin du jeton de clé publique pour exécuter la procédure suivante.

Pour ajouter une référence à l'assembly de l'Assistant dans le fichier .vstemplate

  1. Dans Explorateur de solutions, développez le nœud de projet ItemTemplate , puis ouvrez le fichier ItemTemplate.vstemplate.

  2. À l'approche de la fin du fichier, ajoutez l'élément suivant WizardExtension entre les balises </TemplateContent> et </VSTemplate>.Remplacez la valeur de YourToken de l'attribut d' PublicKeyToken par le jeton de clé publique que vous avez obtenu dans la procédure précédente.

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

    Pour plus d'informations sur l'élément WizardExtension, consultez WizardExtension, élément (modèles Visual Studio).

  3. Enregistrez et fermez le fichier.

Ajout de paramètres remplaçables au fichier Elements.xml du modèle d'élément

Ajoutez plusieurs paramètres remplaçables au fichier Elements.xml du projet ItemTemplate.Ces paramètres sont initialisés dans la méthode PopulateReplacementDictionary de la classe CustomActionWizard que vous avez définie précédemment.Lorsqu'un utilisateur ajoute un élément de projet Action personnalisée à un projet, Visual Studio remplace automatiquement ces paramètres dans le fichier Elements.xml du nouvel élément de projet par les valeurs qui ont été spécifiées dans l'Assistant.

Un paramètre remplaçable est un jeton qui commence et se termine par le signe dollar ($).En plus de définir vos propres paramètres remplaçables, vous pouvez utiliser les paramètres prédéfinis que le système de projet SharePoint définit et initialise.Pour plus d’informations, consultez Paramètres remplaçables.

Pour ajouter des paramètres remplaçables au fichier Elements.xml

  1. Dans le projet ItemTemplate, remplacez le contenu du fichier Elements.xml par le code XML suivant.

    <?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>
    

    Dans le nouveau code XML, les paramètres remplaçables se substituent aux valeurs des attributs Id, GroupId, Location, Description et Url.

  2. Enregistrez et fermez le fichier.

Ajout de l'Assistant au package VSIX

Dans le fichier source.extension.vsixmanifest du projet VSIX, ajoutez une référence au projet d'Assistant afin qu'il vous soit déployé avec le package VSIX qui contient l'élément de projet.

Pour ajouter l'Assistant au package VSIX

  1. Dans Explorateur de solutions, ouvrez le menu contextuel du fichier source.extension.vsixmanifest dans le projet élémentprojetactionpersonnalisée, puis choisissez Ouvrir pour l'ouvrir dans l'éditeur de manifeste.

  2. Dans l'éditeur de manifeste, sélectionnez l'onglet Composants , puis choisissez le bouton Nouveau .

    La boîte de dialogue ajoutez le nouveau ressource s'affiche.

  3. Dans la liste Type , choisissez Microsoft.VisualStudio.Assembly.

  4. Dans la liste Source , choisissez un projet dans la solution actuelle.

  5. Dans la liste Projet , choisissez ItemTemplateWizard, puis choisissez le bouton OK .

  6. Dans la barre de menus, sélectionnez Générer, Générer la solution, puis vérifiez que les compilations de solution sans erreur.

Test de l'Assistant

Vous êtes maintenant prêt à tester l'Assistant.D'abord, commencez à déboguer la solution CustomActionProjectItem dans l'instance expérimentale de Visual Studio.Examinez ensuite l'assistant pour l'élément de projet action personnalisée dans un projet SharePoint dans l'instance expérimentale de Visual Studio.Enfin, générez et exécutez le projet SharePoint pour vous assurer que l'action personnalisée fonctionne comme prévu.

Pour commencer à déboguer la solution

  1. Redémarrez Visual Studio avec les informations d'identification d'administration, puis ouvrez la solution élémentprojetactionpersonnalisée.

  2. Dans le projet ItemTemplateWizard, ouvrez le fichier de code CustomActionWizard, puis ajoutez un point d'arrêt sur la première ligne de code dans la méthode d' RunStarted .

  3. Dans la barre de menus, sélectionnez Déboguer, Exceptions.

  4. Dans la boîte de dialogue Exceptions , assurez -vous que les cases à cocher Levé et utilisateur non pris en charge pour Exceptions du common langage runtime sont supprimées, puis choisissez le bouton OK .

  5. Commencez à déboguer en choisissant la touche F5, ou, dans la barre de menus, choisissant Déboguer, Démarrer le débogage.

    Visual Studio installe l'extension sous %UserProfile%\AppData\Local\Microsoft\VisualStudio\11.0Exp\Extensions\Contoso\Custom Action Project Item\1.0 and starts an experimental instance of Visual Studio.Vous testerez l'élément de projet dans cette instance de Visual Studio.

Pour tester l'Assistant dans Visual Studio

  1. Dans l'instance expérimentale de Visual Studio, dans le menu, choisissez Fichier, Nouveau, Projet.

  2. Développez le nœud Visual C# ou Visual Basic (selon le langage qui pris en charge par votre modèle d'élément), développez le nœud SharePoint , puis sélectionnez le nœud 2010 .

  3. Dans la liste des modèles de projet, choisissez Projet SharePoint 2010, nommez le projet CustomActionWizardTest, puis choisissez le bouton OK .

  4. Dans Assistant personnalisation de SharePoint, entrez l'URL du site que vous souhaitez utiliser pour le débogage, puis choisissez le bouton Terminer .

  5. Dans Explorateur de solutions, ouvrez le menu contextuel du nœud de projet, choisissez Ajouter, puis choisissez Nouvel élément.

  6. Dans la boîte de dialogue ajoutez le nouvel élément - CustomItemWizardTest , développez le nœud SharePoint , puis développez le nœud 2010 .

  7. Dans la liste d'éléments de projet, sélectionnez l'élément action personnalisée , puis choisissez le bouton Ajouter .

  8. Assurez-vous que le code dans l'autre instance de Visual Studio s'arrête au niveau du point d'arrêt que vous avez défini précédemment dans la méthode RunStarted.

  9. Continuez à déboguer le projet en sélectionnant la touche F5 ou, dans la barre de menus, choisissant Déboguer, Continuer.

    L'Assistant Personnalisation de SharePoint s'affiche.

  10. Sous Emplacement, sélectionnez la case d'option modification de liste .

  11. Dans la liste identification groupe , choisissez Communications.

  12. Dans la zone Titre , entrez Centre de développement SharePoint.

  13. Dans la zone Description , entrez Ouvre le site Web du centre de développement SharePoint.

  14. Dans la zone URL , entrez https://msdn.microsoft.com/sharepoint/default.aspx, puis choisissez le bouton Terminer .

    le isual studio ajoute un élément nommé CustomAction1 à votre projet et ouvre le fichier Elements.xml dans l'éditeur.Vérifiez que le fichier Elements.xml contient les valeurs que vous avez spécifiées dans l'Assistant.

Pour tester l'action personnalisée dans SharePoint

  1. Dans l'instance expérimentale de Visual Studio, choisissez la touche F5 ou, dans la barre de menus, sélectionnez Déboguer, Démarrer le débogage.

    L'action personnalisée est empaquetée et déployée sur le site SharePoint spécifié par la propriété Recherchez l'URL du projet, et le navigateur web s'ouvre à la page par défaut de ce site.

    [!REMARQUE]

    Si la boîte de dialogue Débogage de script est désactivé s'affiche, cliquez sur le bouton oui .

  2. Dans la zone de liste du site SharePoint, cliquez sur le lien Tâches .

    La page tâches – toutes tâches s'affiche.

  3. Sous l'onglet outils de liste du ruban, cliquez sur l'onglet liste , puis, dans le groupe Paramètres , choisissez Paramètres de liste.

    La page Répertoriez les paramètres s'affiche.

  4. Sous Communications en-tête se en haut de la page, cliquez sur le lien Centre de développement SharePoint , vérifiez que le navigateur ouvre le site Web https://msdn.microsoft.com/sharepoint/default.aspx, puis fermez le navigateur.

Nettoyage de l'ordinateur de développement

Une fois le test de l'élément de projet terminé, supprimez le modèle d'élément de projet de l'instance expérimentale de Visual Studio.

Pour nettoyer l'ordinateur de développement

  1. Dans l'instance expérimentale de Visual Studio, dans le menu, choisissez Outils, Extensions et mises à jour.

    La boîte de dialogue Extensions et mises à jour s'ouvre.

  2. Dans la liste d'extensions, sélectionnez l'extension Élément de projet action personnalisée , puis choisissez le bouton Désinstaller .

  3. Dans la boîte de dialogue qui s'affiche, cliquez sur le bouton oui pour confirmer que vous voulez désinstaller l'extension, puis choisissez le bouton Redémarrez maintenant pour terminer la désinstallation.

  4. Fermez les deux instances de Visual Studio (l'instance expérimentale et l'instance de Visual Studio dans laquelle la solution élémentprojetactionpersonnalisée est ouverte).

Voir aussi

Tâches

Procédure pas à pas : création d'un élément de projet d'action personnalisé avec un modèle d'élément, première partie

Comment : utiliser des Assistants avec des modèles de projet

Référence

Référence du schéma de modèle Visual Studio

IWizard

Concepts

Définition de types d'éléments de projet SharePoint personnalisés

Création de modèles d'élément et de modèles de projet pour les éléments de projet SharePoint

Autres ressources

Est la valeur par défaut des emplacements personnalisés et les ID d'action