Partager via


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

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, partie 1. Lorsqu'un utilisateur ajoute un élément de projet Action personnalisée à un projet SharePoint, l'Assistant collecte les informations relatives à l'action personnalisée (telles que son emplacement et l'URL à atteindre lorsqu'elle fait l'objet d'un clic) et les ajoute au fichier Elements.xml dans le 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 2010.

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

Notes

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 : https://go.microsoft.com/fwlink/?LinkId=191369.

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, partie 1.

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 pas à pas, vous devez ajouter un nouveau projet à la solution CustomActionProjectItem que vous avez créée dans Procédure pas à pas : création d'un élément de projet d'action personnalisé avec un modèle d'élément, partie 1. 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. Ouvrez la solution CustomActionProjectItem dans Visual Studio.

  2. Cliquez avec le bouton droit sur le nœud de la solution dans l'Explorateur de solutions, cliquez sur Ajouter, puis sur Nouveau projet.

    Notes

    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 Général, Projets et solutions, boîte de dialogue Options.

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

  4. Dans la zone de liste déroulante située en haut de la boîte de dialogue Nouveau projet, vérifiez que .NET Framework 4 est sélectionné.

  5. Sélectionnez le modèle de projet Bibliothèque de contrôles utilisateur WPF.

  6. Dans la zone Nom, tapez ItemTemplateWizard.

  7. Cliquez sur OK.

    Visual Studio ajoute le projet ItemTemplateWizard à la solution.

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

Configuration du projet d'Assistant

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

Pour configurer le projet d'Assistant

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nœud de projet ItemTemplateWizard, puis cliquez sur Propriétés.

  2. Dans le Concepteur de projets, remplacez le framework cible .NET Framework 4 Client Profile par .NET Framework 4. Dans les projets Visual C#, vous pouvez effectuer cette opération dans l'onglet Application ; pour les projets Visual Basic, vous pouvez effectuer cette opération dans l'ongletCompiler. Pour plus d'informations, consultez Comment : cibler une version ou un profil spécifique du .NET Framework.

    Notes

    Par défaut, lorsque vous créez un projet qui cible le .NET Framework 4, le projet cible le profil client. Cette procédure pas à pas nécessite l'infrastructure .NET Framework 4. complète.

  3. Dans le projet ItemTemplateWizard, ajoutez un nouvel élément Fenêtre (WPF) au projet. Nommez le nouvel élément WizardWindow.

  4. Ajoutez deux fichiers de code avec les noms suivants :

    • CustomActionWizard

    • Strings

  5. Dans le menu Projet, cliquez sur Ajouter une référence.

  6. Sous l'onglet .NET, appuyez sur CTRL et cliquez sur les assemblys suivants, puis cliquez sur OK.

    • EnvDTE

    • Microsoft.VisualStudio.Shell.10.0

    • Microsoft.VisualStudio.TemplateWizardInterface

  7. Dans l'Explorateur de solutions, sous le dossier Références du projet ItemTemplateWizard, cliquez sur EnvDTE.

    Notes

    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 Général, Projets et solutions, boîte de dialogue Options.

  8. Dans la fenêtre Propriétés, affectez à la propriété Incorporer les types d'interopérabilité la valeur 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. Lors de l'exécution de cette procédure pas à pas, ces chaînes sont écrites dans l'élément de projet Action personnalisée du fichier Elements.xml quand les utilisateurs sélectionnent 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. Dans le projet ItemTemplateWizard, ouvrez le fichier de code Strings.

  2. Remplacez le code de ce fichier 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 2010.

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

  1. Dans le projet ItemTemplateWizard, double-cliquez sur le fichier WizardWindow.xaml pour ouvrir la fenêtre dans le concepteur.

  2. Dans la vue XAML du concepteur, remplacez le code XAML actuel 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.

    Notes

    Votre projet comportera des erreurs de compilation après avoir ajouté ce code XAML. 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.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>
    

    Notes

    La fenêtre créée dans ce XAML est dérivée de la classe de base DialogWindow. Lorsque vous ajoutez une boîte de dialogue WPF personnalisée dans Visual Studio, il est recommandé de dériver votre boîte de dialogue de cette classe pour assurer la cohérence du style avec d'autres boîtes de dialogue Visual Studio et pour éviter des problèmes de boîte de dialogue modale qui risqueraient de se produire. Pour plus d'informations, consultez How to: Create and Manage Dialog Boxes.

  3. Si vous développez un projet Visual Basic, supprimez l'espace de noms ItemTemplateWizard du nom de la classe WizardWindow dans l'attribut x:Class de l'élément Window. Cette indication se trouve dans la première ligne du code XAML. Lorsque vous avez terminé, la première ligne doit se présenter comme suit :

    <Window x:Class="WizardWindow"
    
  4. Ouvrez le fichier code-behind correspondant au fichier WizardWindow.xaml.

  5. Remplacez le code de ce fichier 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

  1. Dans le projet ItemTemplateWizard, ouvrez le fichier de code CustomActionWizard.

  2. Remplacez le code de 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 le menu Générer, sélectionnez 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. Cette opération comporte 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 l'Explorateur de solutions, cliquez avec le bouton droit sur le nœud de projet ItemTemplateWizard, puis cliquez sur Propriétés.

  2. Cliquez sur l'onglet Signature.

  3. Activez la case à cocher Signer l'assembly.

  4. Dans la liste déroulante Choisir un fichier de clé de nom fort, sélectionnez <Nouveau...>.

  5. Dans la boîte de dialogue Créer une clé de nom fort, entrez un nom et désactivez la case à cocher Protéger mon fichier de clé avec un mot de passe.

  6. Cliquez sur OK.

  7. Dans le menu Générer, sélectionnez Générer la solution.

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

  1. Ouvrez une fenêtre Invite de commandes de Visual Studio.

  2. Exécutez la commande ci-dessous. Remplacez le chemin d'accès à l'assembly de l'Assistant 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 path to wizard assembly
    

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

  3. Ne fermez pas la fenêtre Invite de commandes de Visual Studio. Vous aurez besoin du jeton de clé publique pour 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 et 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 votre jeton de l'attribut 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=your token</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 ($). Vous pouvez non seulement définir vos propres paramètres remplaçables, mais également utiliser des paramètres intégrés qui sont définis et initialisés par le système de projet SharePoint. Pour plus d'informations, consultez Paramètres remplaçables.

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

  1. Ouvrez le fichier Elements.xml dans le projet ItemTemplate.

  2. Remplacez le contenu de ce fichier par le code XML ci-dessous.

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

  3. Enregistrez et fermez le fichier.

Ajout de l'Assistant au package VSIX

Pour déployer l'Assistant avec le package VSIX qui contient l'élément de projet, ajoutez une référence au projet d'Assistant dans le fichier source.extension.vsixmanifest du projet VSIX.

Pour ajouter l'Assistant au package VSIX

  1. Dans l'Explorateur de solutions, double-cliquez sur le fichier source.extension.vsixmanifest dans le projet ÉlémentProjetActionPersonnalisée.

    Visual Studio ouvre le fichier dans l'éditeur de manifeste.

  2. Dans la section Contenu de l'éditeur, cliquez sur le bouton Ajouter du contenu.

  3. Dans la boîte de dialogue Ajouter du contenu, dans la zone de liste Sélectionner un type de contenu, sélectionnez Assistant Modèle.

  4. Sous Sélectionner une source, cliquez sur la case d'option Projet et sélectionnez ItemTemplateWizard dans la zone de liste située en regard de cette case.

  5. Cliquez sur OK.

  6. Dans le menu Générer, cliquez sur Générer la solution. Assurez-vous que la solution se compile sans erreurs.

Test de l'Assistant

Vous êtes maintenant prêt à tester l'Assistant. Commencez à déboguer la solution CustomActionProjectItem dans l'instance expérimentale de Visual Studio. Testez ensuite l'Assistant pour l'élément de projet Action personnalisée d'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 privilèges d'administrateur et ouvrez la solution ÉlémentProjetActionPersonnalisée.

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

  3. Dans le menu Déboguer, cliquez sur Exceptions.

  4. Dans la boîte de dialogue Exceptions, vérifiez que les cases à cocher Levé et Non géré par l'utilisateur correspondant à Exceptions Common Language Runtime sont désactivées.

  5. Cliquez sur OK.

  6. Appuyez sur F5 pour démarrer le débogage.

    Visual Studio installe l'extension sous %UserProfile%\AppData\Local\Microsoft\VisualStudio\10.0Exp\Extensions\Contoso\Élément de projet d'action personnalisée\1.0 et démarre une instance expérimentale de 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 Fichier, pointez sur Nouveau, puis cliquez sur Projet.

  2. Développez Visual C# ou Visual Basic (selon le langage pris en charge par votre modèle d'élément), développez SharePoint, puis cliquez sur 2010.

  3. Dans la liste des modèles de projet, cliquez sur Projet vide.

  4. Dans la zone Nom, tapez CustomActionWizardTest.

  5. Cliquez sur OK.

  6. Dans l'Assistant Personnalisation de SharePoint, saisissez l'URL du site que vous souhaitez utiliser pour le débogage, puis cliquez sur Terminer.

  7. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nœud de projet, pointez sur Ajouter, puis cliquez sur Nouvel élément.

  8. Dans la boîte de dialogue Ajouter un nouvel élément, cliquez sur le nœud 2010 sous le nœud SharePoint.

  9. Dans la liste d'éléments de projet, cliquez sur Action personnalisée, puis sur Ajouter.

  10. Vérifiez que le code de 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. Appuyez sur la touche F5 pour continuer de déboguer le projet.

  11. Dans l'Assistant, effectuez les sélections suivantes :

    • SousEmplacement, cliquez sur Modification de liste.

    • Pour ID de groupe, cliquez sur Communications.

    • Pour Titre, tapez Centre de développement SharePoint.

    • Pour Description, tapez Ouvre le site Web du Centre de développement SharePoint.

    • Pour URL, tapez https://msdn.microsoft.com/sharepoint/default.aspx.

  12. Cliquez sur Terminer.

    Visual Studio ajoute un nouvel élément nommé CustomAction1 à votre projet, puis 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, appuyez sur F5. L'action personnalisée est empaquetée et déployée sur le site SharePoint spécifié par la propriété URL de site du projet. Le navigateur Web s'ouvre à la page par défaut de ce site.

    Notes

    Si la boîte de dialogue Le débogage de script est désactivé est affichée, cliquez sur Oui pour continuer à déboguer le projet.

  2. Cliquez sur Tâches dans la zone de lancement rapide.

  3. Dans le ruban, cliquez sur l'onglet Liste.

  4. Dans le groupe Paramètres, cliquez sur Paramètres de la liste.

  5. Sous le titre Communications qui figure en haut de la page, vérifiez qu'un lien comportant le texte Centre de développement SharePoint apparaît.

  6. Cliquez sur le lien Centre de développement SharePoint. Assurez-vous que le navigateur ouvre le site Web https://msdn.microsoft.com/sharepoint/default.aspx.

  7. Fermez le navigateur Web.

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 Outils, cliquez sur Gestionnaire d'extensions.

    La boîte de dialogue Gestionnaire d'extensions s'ouvre.

  2. Dans la liste d'extensions, cliquez sur Élément de projet d'action personnalisée, puis sur Désinstaller.

  3. Dans la boîte de dialogue qui s'affiche, cliquez sur Oui pour confirmer que vous voulez désinstaller l'extension.

  4. Cliquez sur Redémarrer maintenant pour terminer l'installation.

  5. 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, partie 1

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

Autres ressources

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

Emplacements et ID des actions personnalisées par défaut