Condividi tramite


Procedura dettagliata: creazione di un elemento di progetto Azione personalizzata con un modello di elemento, parte 2

Dopo avere definito un tipo di elemento di progetto SharePoint personalizzato e averlo associato a un modello di elemento in Visual Studio, è anche possibile fornire una procedura guidata per il modello.È possibile utilizzare la procedura guidata per raccogliere informazioni dagli utenti quando utilizzano il modello per aggiungere una nuova istanza dell'elemento di progetto a un progetto.Le informazioni raccolte possono essere utilizzate per inizializzare l'elemento di progetto.

In questa procedura dettagliata verrà aggiunta una procedura guidata all'elemento di progetto Azione personalizzata illustrato in Procedura dettagliata: creazione di un elemento di progetto Azione personalizzata con un modello di elemento, parte 1.Quando un utente aggiunge un elemento di progetto azione personalizzata a un progetto SharePoint, la procedura guidata vengono raccolte informazioni sull'azione personalizzata (ad esempio la posizione e l'url da passare quando un utente finale si sceglie) e queste informazioni nel file Elements.xml nel nuovo elemento di progetto.

In questa procedura dettagliata vengono illustrate le attività seguenti:

  • Creazione di una procedura guidata per un tipo di elemento di progetto SharePoint personalizzato associato a un modello di elemento.

  • Definizione di un'interfaccia utente della procedura guidata personalizzata simile a quella delle procedure guidate predefinite per gli elementi di progetto SharePoint in Visual Studio.

  • Utilizzo di parametri sostituibili per inizializzare i file di progetto SharePoint con i dati raccolti nella procedura guidata.

  • Debug e test della procedura guidata.

[!NOTA]

È possibile scaricare un esempio che contiene i progetti completati, il codice e altri file di questa procedura dettagliata dal seguente percorso: File di progetto per le procedure dettagliate di estensibilità degli strumenti di SharePoint.

Prerequisiti

Per eseguire questa procedura dettagliata, è prima necessario creare la soluzione CustomActionProjectItem completando quanto descritto in Procedura dettagliata: creazione di un elemento di progetto Azione personalizzata con un modello di elemento, parte 1.

Per completare la procedura dettagliata, nel computer di sviluppo devono inoltre essere disponibili i componenti seguenti:

Per completare la procedura dettagliata è consigliabile conoscere i concetti riportati di seguito:

Creazione del progetto di procedura guidata

Per completare questa procedura dettagliata, è necessario aggiungere un progetto alla soluzione CustomActionProjectItem creata in Procedura dettagliata: creazione di un elemento di progetto Azione personalizzata con un modello di elemento, parte 1.È quindi necessario implementare l'interfaccia IWizard e definire l'interfaccia utente della procedura guidata in questo progetto.

Per creare il progetto di procedura guidata

  1. In Visual Studio, aprire la soluzione CustomActionProjectItem

  2. In Esplora soluzioni, aprire il menu di scelta rapida del nodo della soluzione, scegliere Aggiungiquindi scegliere Nuovo progetto.

    [!NOTA]

    Nei progetti di Visual Basic, il nodo della soluzione viene visualizzato in Esplora soluzioni solo quando la casella di controllo Mostra sempre soluzione viene selezionata in General, Projects and Solutions, Options Dialog Box.

  3. Nella finestra di dialogo Nuovo progetto, espandere i nodi Visual Basic o Visual C# quindi selezionare il nodo Finestre.

  4. Nella parte superiore della finestra di dialogo Nuovo progetto, assicurarsi che .NET Framework 4.5 sia selezionato nell'elenco delle versioni di.NET Framework.

  5. Scegliere il modello di progetto Libreria di controlli utente WPF, denominare il progetto ItemTemplateWizardquindi scegliere il pulsante OK.

    Tramite Visual Studio il progetto ItemTemplateWizard verrà aggiunto alla soluzione.

  6. Eliminare l'elemento UserControl1 dal progetto.

Configurazione del progetto di procedura guidata

Prima di creare la procedura guidata, è necessario aggiungere una finestra di Windows Presentation Foundation (WPF), un file di codice e riferimenti al progetto.

Per configurare il progetto di procedura guidata

  1. In Esplora soluzioni, aprire il menu di scelta rapida nel nodo del progetto ItemTemplateWizard quindi scegliere Proprietà.

  2. In Progettazione progetti, assicurarsi che il framework di destinazione sia impostato su .NET Framework 4,5.

    Per i progetti visual C#, è possibile impostare questo valore sulla scheda Application.Per i progetti di Visual Basic., è possibile impostare questo valore sulla scheda Compilazione.Per ulteriori informazioni, vedere Procedura: destinare una versione di .NET Framework.

  3. Nel progetto ItemTemplateWizard, aggiungere un elemento Finestra (WPF) al progetto e denominarlo l'elemento WizardWindow.

  4. Aggiungere due file di codice denominato CustomActionWizard e stringhe.

  5. Aprire il menu di scelta rapida del progetto ItemTemplateWizard quindi scegliere Aggiungi riferimento.

  6. Nella finestra di dialogo Gestione riferimenti - ItemTemplateWizard, nel nodo Assembly, selezionare il nodo Estensioni.

  7. Selezionare le caselle di controllo accanto ai seguenti assembly e quindi scegliere il pulsante OK :

    • EnvDTE

    • Microsoft.VisualStudio.Shell.11.0

    • Microsoft.VisualStudio.TemplateWizardInterface

  8. In Esplora soluzioni, nella cartella Riferimenti per il progetto ItemTemplateWizard, selezionare il riferimento EnvDTE.

    [!NOTA]

    Nei progetti di Visual Basic la cartella Riferimenti viene visualizzata solo quando la casella di controllo Mostra sempre soluzione è selezionata in General, Projects and Solutions, Options Dialog Box.

  9. Nella finestra Proprietà, modificare il valore della proprietà Incorpora tipi di interoperabilità a False.

Definizione del percorso e delle stringhe ID predefiniti per le azioni personalizzate

Per ogni azione personalizzata sono disponibili un percorso e un ID specificati negli attributi GroupID e Location dell'elemento CustomAction nel file Elements.xml.In questo passaggio vengono definite alcune delle stringhe valide per questi attributi nel progetto ItemTemplateWizard.Dopo avere completato questa procedura dettagliata, le stringhe vengono scritte nel file Elements.xml nell'elemento di progetto azione personalizzata quando gli utenti specificano un percorso e un ID nella procedura guidata.

Per semplicità, in questo esempio è supportato solo un subset degli ID e dei percorsi predefiniti disponibili.Per un elenco completo, vedere ID e percorsi predefiniti delle azioni personalizzate (la pagina potrebbe essere in inglese).

Per definire il percorso e le stringhe ID predefiniti

  1. aperto.

  2. Nel progetto ItemTemplateWizard, sostituire il codice nel file di codice delle stringhe con il codice seguente.

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

Creazione dell'interfaccia utente della procedura guidata

Aggiungere codice XAML per definire l'Interfaccia utente della procedura guidata e aggiungere codice per associare alcuni controlli nella procedura guidata alle stringhe ID.La procedura guidata creata è simile a quella predefinita per i progetti SharePoint in Visual Studio.

Per creare l'interfaccia utente della procedura guidata

  1. Nel progetto ItemTemplateWizard, aprire il menu di scelta rapida per il file WizardWindow.xaml quindi scegliere Apri per aprire la finestra nella finestra di progettazione.

  2. In visualizzazione XAML, sostituire l'oggetto corrente XAML con il codice XAML seguente.Il codice XAML definisce un'interfaccia utente che include un'intestazione, controlli per specificare il comportamento dell'azione predefinita e i pulsanti di navigazione nella parte inferiore della finestra.

    [!NOTA]

    Il progetto presenterà alcuni errori di compilazione dopo aver aggiunto questo codice.che scompariranno quando si aggiunge codice nei passaggi successivi.

    <ui:DialogWindow x:Class="ItemTemplateWizard.WizardWindow"
                     xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
                     xmlns:ui="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.11.0"        
                     xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
                     Title="SharePoint Customization Wizard" Height="500" Width="700" ResizeMode="NoResize" 
                     Loaded="Window_Loaded" TextOptions.TextFormattingMode="Display">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="75*" />
                <RowDefinition Height="364*" />
                <RowDefinition Height="1*" />
                <RowDefinition Height="60*" />
            </Grid.RowDefinitions>
            <Grid Grid.Row="0" Name="headingGrid" Background="White">
                <Label Grid.Row="0" Content="Configure the Custom Action" Name="pageHeaderLabel" HorizontalAlignment="Left" 
                       VerticalAlignment="Center" Margin="18,0,0,0" FontWeight="ExtraBold" />
            </Grid>
            <Grid Grid.Row="1" Name="mainGrid">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="20*" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="400*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <StackPanel Grid.Row="0" Grid.Column="1" Orientation="Vertical">
                    <Label Margin="0,20,0,0" Content="Location:" Name="locationLabel" FontWeight="Bold" />
                    <RadioButton Content="_List Edit" Margin="5,0,0,0" Name="listEditRadioButton" 
                                 Checked="listEditRadioButton_Checked" FontWeight="Normal"  />
                    <RadioButton Content="_Standard Menu" Margin="5,5,0,0" Name="standardMenuRadioButton" 
                                 Checked="standardMenuRadioButton_Checked" FontWeight="Normal" />
                </StackPanel>
                <Label Grid.Row="1" Grid.Column="1" Margin="0,15,0,0" Content="_Group ID:" Name="groupIdLabel" 
                       FontWeight="Bold" Target="{Binding ElementName=idComboBox}" />
                <ComboBox Grid.Row="1" Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" Height="23" 
                          Width="253" Name="idComboBox" IsEditable="False" IsSynchronizedWithCurrentItem="True" />
                <Label Grid.Row="2" Grid.Column="1" Margin="0,15,0,0" Content="_Title:" Name="titleLabel" 
                       FontWeight="Bold" Target="{Binding ElementName=titleTextBox}" />
                <TextBox Grid.Row="2" Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" Height="23" 
                         Name="titleTextBox" Width="410" Text="" />
                <Label Grid.Row="3" Grid.Column="1" Margin="0,15,0,0" Content="_Description:" Name="descriptionLabel" 
                       FontWeight="Bold" Target="{Binding ElementName=descriptionTextBox}" />
                <TextBox Grid.Row="3" Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" Height="23" 
                         Name="descriptionTextBox" Width="410" Text="" />
                <Label Grid.Row="4" Grid.Column="1" Margin="0,15,0,0" Content="_URL:" Height="28" Name="urlLabel" 
                       FontWeight="Bold" Target="{Binding ElementName=urlTextBox}" />
                <TextBox Grid.Row="4" Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" Height="23" 
                         Name="urlTextBox" Width="410" Text="" />
            </Grid>
            <Rectangle Grid.Row="2" Name="separatorRectangle" Fill="White"  />
            <StackPanel Grid.Row="3" Name="navigationPanel" Orientation="Horizontal">
                <Button Content="_Finish" Margin="500,0,0,0" Height="25" Name="finishButton" Width="85" 
                        Click="finishButton_Click" IsDefault="True" />
                <Button Content="Cancel" Margin="10,0,0,0" Height="25" Name="cancelButton" Width="85" IsCancel="True" />
            </StackPanel>
        </Grid>
    </ui:DialogWindow>
    

    [!NOTA]

    La finestra creata in questo codice XAML viene derivata dalla classe base DialogWindow.Quando si aggiunge una finestra di dialogo WPF personalizzata a Visual Studio, è consigliabile deriva la finestra di dialogo da questa classe per far sì che lo stile coerente con altre finestre di dialogo in Visual Studio e per evitare problemi che possono verificarsi nelle finestre di dialogo modale.Per ulteriori informazioni, vedere Procedura: creare e gestire le finestre di dialogo.

  3. Se si sviluppa un progetto di Visual Basic., rimuovere lo spazio dei nomi ItemTemplateWizard il nome della classe WizardWindow nell'attributo x:Class di elemento Window.Questo elemento è la prima riga del codice XAML.Al termine, la prima riga dovrebbe essere simile al seguente:

    <Window x:Class="WizardWindow"
    
  4. Nel file code-behind per il file WizardWindow.xaml, sostituire il codice corrente con il codice seguente.

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

Implementazione della procedura guidata

Definire le funzionalità della procedura guidata implementando l'interfaccia IWizard.

Per implementare la procedura guidata

  • Nel progetto ItemTemplateWizard, aprire il file di codice CustomActionWizard quindi sostituire il codice corrente nel file con il codice seguente:

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

Verifica

In questa fase della procedura dettagliata, tutto il codice per la procedura guidata si trova nel progetto.Compilare il progetto assicurandosi che tale operazione venga eseguita correttamente.

Per compilare il progetto

  • Sulla barra dei menu, scegliere Compilazione, Compila soluzione.

Associazione della procedura guidata al modello di elemento

Dopo avere implementato la procedura guidata, è necessario associarla al modello di elemento Azione personalizzata completando tre passaggi principali:

  1. Firmare l'assembly della procedura guidata con un nome sicuro.

  2. Ottenere il token di chiave pubblica per l'assembly della procedura guidata.

  3. Aggiungere un riferimento all'assembly della procedura guidata nel file con estensione vstemplate per il modello di elemento Azione personalizzata.

Per firmare l'assembly della procedura guidata con un nome sicuro

  1. In Esplora soluzioni, aprire il menu di scelta rapida nel nodo del progetto ItemTemplateWizard quindi scegliere Proprietà.

  2. Nella scheda Firma selezionare la casella di controllo Firma assembly.

  3. Nell'elenco Scegli un file chiave con nome sicuro, scegliere <New...>.

  4. Nella finestra di dialogo Crea chiave con nome sicuro, nome, deselezionare la casella di controllo Proteggi file di chiave con una password quindi scegliere il pulsante OK.

  5. Sulla barra dei menu, scegliere Compilazione, Compila soluzione.

Per ottenere il token di chiave pubblica per l'assembly della procedura guidata

  1. In una finestra del prompt dei comandi di Visual Studio, eseguire il comando seguente, sostituendo PathToWizardAssembly con il percorso completo dell'assembly ItemTemplateWizard.dll compilato per il progetto ItemTemplateWizard nel computer di sviluppo.

    sn.exe -T PathToWizardAssembly
    

    Il token di chiave pubblica per l'assembly ItemTemplateWizard.dll è scritto nella finestra del prompt dei comandi di Visual Studio.

  2. Tenere aperta la finestra del prompt dei comandi di Visual Studio.Il token di chiave pubblica sarà necessario per completare la procedura successiva.

Per aggiungere un riferimento all'assembly della procedura guidata nel file con estensione vstemplate

  1. In Esplora soluzioni, espandere il nodo del progetto ItemTemplate quindi aprire il file ItemTemplate.vstemplate.

  2. Alla fine del file, aggiungere l'elemento WizardExtension seguente tra i tag </TemplateContent> e </VSTemplate>.Sostituire il valore YourToken l'attributo PublicKeyToken con il token di chiave pubblica ottenuto nella procedura precedente.

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

    Per ulteriori informazioni sull'elemento WizardExtension, vedere Elemento WizardExtension (modelli di Visual Studio).

  3. Salvare e chiudere il file.

Aggiunta di parametri sostituibili al file Elements.xml nel modello di elemento

Aggiungere diversi parametri sostituibili al file Elements.xml nel progetto ItemTemplate.Questi parametri vengono inizializzati nel metodo PopulateReplacementDictionary della classe CustomActionWizard definita in precedenza.Quando un utente aggiunge un elemento di progetto Azione personalizzata a un progetto, questi parametri nel file Elements.xml nel nuovo elemento di progetto vengono sostituiti automaticamente da Visual Studio con i valori specificati nella procedura guidata.

Un parametro sostituibile è un token che inizia e termina con il segno di dollaro ($).Oltre a definire i propri parametri sostituibili, è possibile utilizzare parametri predefiniti che il sistema di progetto SharePoint definisce e inizializzato.Per ulteriori informazioni, vedere Parametri sostituibili.

Per aggiungere parametri sostituibili al file Elements.xml

  1. Nel progetto ItemTemplate, sostituire il contenuto del file Elements.xml con il codice XML seguente.

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

    Tramite il nuovo codice XML i valori degli attributi Id, GroupId, Location, Description e Url vengono modificati in parametri sostituibili.

  2. Salvare e chiudere il file.

Aggiunta della procedura guidata al pacchetto VSIX

Nel file source.extension.vsixmanifest nel progetto VSIX, aggiungere un riferimento al progetto di procedura guidata in modo che venga distribuito con il pacchetto VSIX che contiene l'elemento di progetto.

Per aggiungere la procedura guidata al pacchetto VSIX

  1. In Esplora soluzioni, aprire il menu di scelta rapida nel file source.extension.vsixmanifest il progetto CustomActionProjectItem quindi scegliere Apri per aprirlo nell'editor del manifesto.

  2. Nell'editor del manifesto, scegliere la scheda Asset, quindi scegliere il pulsante Nuova.

    La finestra di dialogo Aggiungi nuovo asset visualizzato.

  3. Nell'elenco Tipo, scegliere Microsoft.VisualStudio.Assembly.

  4. Nell'elenco Alimentazione, scegliere Progetto nella soluzione corrente.

  5. Nell'elenco Project, scegliere ItemTemplateWizardquindi scegliere il pulsante OK.

  6. Sulla barra dei menu, scegliere Compilazione, Compila soluzionequindi assicurarsi che la soluzione venga compilato senza errori.

Test della procedura guidata

È ora possibile eseguire il test della procedura guidata.Innanzitutto, avviare il debug della soluzione CustomActionProjectItem nell'istanza sperimentale di Visual Studio.Esaminare quindi la procedura guidata per l'elemento di progetto azione personalizzata in un progetto SharePoint nell'istanza sperimentale di Visual Studio.Infine, compilare ed eseguire il progetto SharePoint per verificare che l'azione personalizzata funzioni come previsto.

Per avviare il debug della soluzione

  1. Riavviare Visual Studio con credenziali amministrative e aprire la soluzione CustomActionProjectItem.

  2. Nel progetto ItemTemplateWizard, aprire il file di codice CustomActionWizard e aggiungere un punto di interruzione alla prima riga di codice nel metodo RunStarted.

  3. Sulla barra dei menu, scegliere Debug, Eccezioni.

  4. Nella finestra di dialogo Eccezioni, verificare che le caselle di controllo Non gestita dall'utente e Generata per Eccezioni comuni di runtime per le lingue siano deselezionate e quindi scegliere il pulsante OK.

  5. Avviare il debug scegliendo il tasto F5, o, sulla barra dei menu, scegliente Debug, Avvia debug.

    In Visual Studio i file di estensione vengono installati in %UserProfile% \ AppData \ local \ Microsoft \ VisualStudio \ 11.0Exp \ extensions \ Contoso \ elemento di progetto \ 1,0 e viene avviata un'istanza sperimentale di Visual Studio.L'elemento del progetto verrà testato in questa istanza di Visual Studio.

Per testare la procedura guidata in Visual Studio

  1. Nell'istanza sperimentale di Visual Studio, sulla barra dei menu, scegliere Il file, Nuova, Project.

  2. Espandere il nodo Visual Basic o Visual C# (a seconda del linguaggio che il modello di elemento supporta), espandere il nodo SharePoint quindi selezionare il nodo 2010.

  3. Nell'elenco di modelli di progetto, scegliere Progetto SharePoint 2010, denominare il progetto CustomActionWizardTestquindi scegliere il pulsante OK.

  4. In Personalizzazione guidata SharePoint, immettere l'url del sito che si desidera utilizzare per il debug e quindi scegliere il pulsante Fine.

  5. In Esplora soluzioni, aprire il menu di scelta rapida del nodo del progetto, scegliere Aggiungiquindi scegliere Nuovo elemento.

  6. Nella finestra di dialogo Aggiungi nuovo elemento - CustomItemWizardTest, espandere il nodo SharePoint quindi espandere il nodo 2010.

  7. Nell'elenco di elementi di progetto, selezionare l'elemento Azione personalizzata quindi scegliere il pulsante Aggiungi.

  8. Verificare che il codice nell'altra istanza di Visual Studio venga interrotto in corrispondenza del punto di interruzione impostato precedentemente nel metodo RunStarted.

  9. Continuare a eseguire il debug del progetto scegliendo il tasto F5 o, sulla barra dei menu, scegliente Debug, Continua.

    Viene visualizzata la Personalizzazione guidata SharePoint.

  10. In Percorso, scegliere il pulsante di opzione Modifica elenco.

  11. Nell'elenco ID gruppo, scegliere Comunicazioni.

  12. Nella casella Titolo, immettere Centro per sviluppatori SharePoint.

  13. Nella casella Descrizione, immettere Aprire il sito Web del Centro per sviluppatori di SharePoint.

  14. Nella casella URL, immettere https://msdn.microsoft.com/sharepoint/default.aspxquindi scegliere il pulsante Fine.

    lo isual studio viene aggiunto un elemento denominato CustomAction1 al progetto e aprire il file Elements.xml nell'editor.Verificare che il file Elements.xml contenga i valori specificati nella procedura guidata.

Per testare l'azione personalizzata in SharePoint

  1. Nell'istanza sperimentale di Visual Studio, scegliere il tasto F5 o, sulla barra dei menu, scegliere Debug, Avvia debug.

    L'azione personalizzata viene assemblata e distribuita al sito di SharePoint specificato dalla proprietà URL sito del progetto e il browser viene visualizzata la pagina predefinita di questo sito.

    [!NOTA]

    Se la finestra di dialogo Debug degli script disabilitato viene visualizzato, scegliere il pulsante .

  2. Nell'area degli elenchi del sito di SharePoint, scegliere il collegamento Attività.

    La pagina Attività - Tutte le attività viene visualizzata.

  3. Nella scheda Strumenti elenco della barra multifunzione, scegliere la scheda Elenco quindi, nel gruppo Impostazioni, scegliere Impostazioni elenco.

    La pagina Impostazioni elenco viene visualizzata.

  4. In Comunicazioni e dirette nella parte superiore della pagina, scegliere il collegamento Centro per sviluppatori SharePoint, verificare che il browser aprire il sito Web https://msdn.microsoft.com/sharepoint/default.aspx e quindi chiudere il browser.

Pulizia del computer di sviluppo

Dopo aver completato il test dell'elemento di progetto, rimuovere il modello di elemento di progetto dall'istanza sperimentale di Visual Studio.

Per pulire il computer di sviluppo

  1. Nell'istanza sperimentale di Visual Studio, sulla barra dei menu, scegliere Strumenti, Estensioni e aggiornamenti.

    La finestra di dialogo Estensioni e aggiornamenti viene aperto.

  2. Nell'elenco di estensioni selezionare, l'estensione Elemento di progetto azione personalizzata quindi scegliere il pulsante Disinstalla.

  3. Nella finestra di dialogo, scegliere il pulsante per confermare che si desidera disinstallare l'estensione e quindi scegliere il pulsante Riavvia ora per completare la disinstallazione.

  4. Chiudere entrambe le istanze di Visual Studio (l'istanza sperimentale e l'istanza di Visual Studio in cui la soluzione CustomActionProjectItem è aperta).

Vedere anche

Attività

Procedura dettagliata: creazione di un elemento di progetto Azione personalizzata con un modello di elemento, parte 1

Procedura: utilizzare procedure guidate con modelli di progetto

Riferimenti

Riferimenti allo schema dei modelli di Visual Studio

IWizard

Concetti

Definizione di tipi di elementi di progetto SharePoint

Creazione di modelli di elemento e di modelli di progetto per gli elementi di progetto SharePoint

Altre risorse

Impostare come valore predefinito percorsi di un'azione personalizzata e gli ID