次の方法で共有


チュートリアル: 項目テンプレートに基づくカスタム動作プロジェクト項目の作成 (パート 2)

SharePoint プロジェクト項目のカスタム種類を定義し、Visual Studio でその種類を項目テンプレートと関連付けてから、テンプレート用のウィザードを用意することもできます。ユーザーが独自のテンプレートを使用してプロジェクト項目の新しいインスタンスをプロジェクトに追加するときに、ウィザードを使用してユーザーから情報を収集できます。収集した情報を使用して、プロジェクト項目を初期化できます。

このチュートリアルでは、「チュートリアル: 項目テンプレートに基づくカスタム動作プロジェクト項目の作成 (パート 1)」で示されているカスタム動作プロジェクト項目にウィザードを追加します。userがSharePointプロジェクトにカスタム動作プロジェクト項目を追加すると、ウィザードは、エンド ユーザーが選択したときにカスタム動作についての情報 (移動するための場所とURLなど) に収集し、新しいプロジェクト項目のElements.xmlファイルにこの情報を追加します。

このチュートリアルでは、次のタスクを実行します。

  • 項目テンプレートに関連付けるカスタム SharePoint プロジェクト項目の種類に対するウィザードの作成。

  • Visual Studio の SharePoint プロジェクト項目用の組み込みウィザードと似たカスタム ウィザードの UI の定義。

  • 置き換え可能パラメーターを使用して、ウィザードで収集したデータで SharePoint プロジェクト ファイルを初期化します。

  • ウィザードをデバッグおよびテストします。

[!メモ]

次の場所から、このチュートリアルの完了のプロジェクト、コードとそのほかのファイルを含むサンプルをダウンロードできます: SharePointのプロジェクト ファイルは、機能拡張のチュートリアルにTools

必須コンポーネント

このチュートリアルを実行するには、先に「チュートリアル: 項目テンプレートに基づくカスタム動作プロジェクト項目の作成 (パート 1)」を完了して CustomActionProjectItem ソリューションを作成しておく必要があります。

また、このチュートリアルを実行するには、開発コンピューターに次のコンポーネントが必要です。

  • Windows SharePoint、およびサポートされるVisual Studioのエディション。詳細については、「SharePoint ソリューションの開発要件」を参照してください。

  • Visual Studio SDK。このチュートリアルでは、SDK の VSIX プロジェクト テンプレートを使用して、プロジェクト項目を配置するための VSIX パッケージを作成します。詳細については、「Visual Studio の SharePoint ツールの拡張」を参照してください。

次の概念に関する知識があると役に立ちますが、チュートリアルを実行するうえで必須というわけではありません。

ウィザード プロジェクトの作成

チュートリアル: 項目テンプレートに基づくカスタム動作プロジェクト項目の作成 (パート 1)で作成したこのチュートリアルを完了するには、CustomActionProjectItemソリューションにプロジェクトを追加する必要があります。このプロジェクトで、IWizard インターフェイスを実装し、ウィザードの UI を定義します。

ウィザード プロジェクトを作成するには

  1. Visual Studioでは、CustomActionProjectItemソリューションを開きます。

  2. **[ソリューション エクスプローラー]で、ソリューション ノードのショートカット メニューを開き、[追加]**を選択し、を **[新しいプロジェクト]**を選択します。

    [!メモ]

    Visual Basic プロジェクトでソリューション エクスプローラーにソリューション ノードが表示されるのは、General, Projects and Solutions, Options Dialog Box[常にソリューションを表示] チェック ボックスがオンになっている場合だけです。

  3. [新しいプロジェクト] のダイアログ ボックスで、[Visual C#] または [Visual Basic] のノードを展開し、[ウィンドウ] のノードを選択します。

  4. [新しいプロジェクト] のダイアログ ボックスの上部に、[.NET Framework 4.5] が.NET Frameworkのバージョンの一覧で、が選択されていることを確認します。

  5. [WPF ユーザー コントロール ライブラリ] のプロジェクト テンプレートを選択し、プロジェクト [ItemTemplateWizard]を付けておくと、[OK] のボタンをクリックします。

    Visual Studio のソリューションに ItemTemplateWizard プロジェクトが追加されます。

  6. プロジェクトから UserControl1 アイテムを削除します。

ウィザード プロジェクトの構成

ウィザードを作成する前に、プロジェクトにWindows Presentation Foundation (WPF)のウィンドウ、コード ファイルおよびアセンブリ参照を追加する必要があります。

ウィザード プロジェクトを構成するには

  1. [ソリューション エクスプローラー]では、[ItemTemplateWizard] のプロジェクト ノードからショートカット メニューを開き、**[プロパティ]**を選択します。

  2. **[プロジェクト デザイナー]**で、ターゲット フレームワークを.NET Framework 4.5に設定されていることを確認します。

    Visual C#プロジェクトの場合は、[アプリケーション] のタブにこの値を設定できます。Visual Basicプロジェクトの場合、[コンパイル] のタブにこの値を設定できます。詳細については、「方法: .NET Framework のバージョンをターゲットにする」を参照してください。

  3. [ItemTemplateWizard] のプロジェクトでは、[ウィンドウ (WPF)] の項目をプロジェクトに追加し、項目 WizardWindowを表示します。

  4. CustomActionWizard String 2とという二つのコード ファイルを追加します。

  5. [ItemTemplateWizard] のプロジェクトのショートカット メニューを開き、**[参照の追加]**を選択します。

  6. [Reference Manager - ItemTemplateWizard] のダイアログ ボックスで、[アセンブリ] のノードの下で、[拡張機能] のノードを選択します。

  7. チェック ボックスは、次のアセンブリの横にあるを選択し、[OK] のボタンを選択する:

    • EnvDTE

    • Microsoft.VisualStudio.Shell.11.0

    • Microsoft.VisualStudio.TemplateWizardInterface

  8. ItemTemplateWizardプロジェクトの [参照] フォルダーの [ソリューション エクスプローラー]では、[EnvDTE] の参照を選択します。

    [!メモ]

    Visual Basic プロジェクトでは、[参照設定] フォルダーが表示されるのは、General, Projects and Solutions, Options Dialog Box[常にソリューションを表示] チェック ボックスがオンになっている場合のみです。

  9. [プロパティ] のペインで、**[false]**に [相互運用型の埋め込み] のプロパティの値を変更します。

カスタム動作の既定の場所と ID 文字列の定義

すべてのカスタム動作には場所と ID があり、Elements.xml ファイルの CustomAction 要素の GroupID 属性と Location 属性で指定されています。この手順では、ItemTemplateWizard プロジェクトでこれらの属性に有効な文字列のいくつかを定義します。このチュートリアルを完了すると、これらの文字列は、カスタム動作プロジェクト項目のElements.xmlファイルにuser、このウィザードの場所とIDを指定するときに書き込まれます。

簡潔にするため、このサンプルでは使用可能な既定の場所と ID のサブセットのみをサポートしています。完全な一覧については、「Default Custom Action Locations and IDs (カスタム動作の既定の場所と ID)」を参照してください。

既定の場所と ID の文字列を定義するには

  1. 開きます。

  2. [ItemTemplateWizard] のプロジェクトでは、次のコードにStringコード ファイルのコードに置き換えます。

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

ウィザードの UI の作成

ウィザードの UI を定義する XAML を追加し、ウィザードの一部のコントロールを ID 文字列にバインドするためのコードを追加します。作成するウィザードは、Visual Studio の SharePoint プロジェクト用の組み込みウィザードに似ています。

ウィザードの UI を作成するには

  1. [ItemTemplateWizard] のプロジェクトでは、[WizardWindow.xaml] ファイルのショートカット メニューを開き、ウィンドウをデザイナーで開くに [開く] を選択します。

  2. XAMLビューで、次のXAMLに現在のXAMLに置き換えます。この XAML は、見出しを含む UI、カスタム動作の振る舞いを指定するためのコントロール、およびウィンドウの下部に示されるナビゲーション ボタンを定義します。

    [!メモ]

    このコードを追加すると、いくつかのコンパイル エラーが発生します。これらのエラーは、この後の手順でコードを追加すると解消されます。

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

    [!メモ]

    このXAMLで作成するウィンドウは DialogWindow の基本クラスから派生します。Visual StudioにカスタムのWPFダイアログ ボックスを追加すると、Visual Studioの他のダイアログ ボックスで一貫したスタイル設定を使用すると、モーダル ダイアログ ボックスとして別の方法で発生する可能性のある問題を回避するには、このクラスからダイアログ ボックスを取得することをお勧めします。詳細については、「方法 : ダイアログ ボックスを作成して管理する。」を参照してください。

  3. Visual Basicプロジェクトを開発している場合は、Window の要素の x:Class の属性の WizardWindow の ItemTemplateWizard のクラス名から名前空間を削除します。この要素は、の最初の行にあります。されると、最初の行は次のようになります。:

    <Window x:Class="WizardWindow"
    
  4. WizardWindow.xamlファイルの分離コード ファイルで、次のコードでは、現在のコードに置き換えます。

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

ウィザードの実装

IWizard インターフェイスを実装することで、ウィザードの機能を定義します。

ウィザードを実装するには

  • [ItemTemplateWizard] のプロジェクトでは、[CustomActionWizard] コード ファイルを開き、次のコードでこのファイルの現在のコードに置き換えます。:

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

チェックポイント

この段階で、ウィザードに必要なすべてのコードがプロジェクトに揃ったことになります。エラーが発生することなくプロジェクトをコンパイルできるかどうか、プロジェクトをビルドして確認してください。

プロジェクトをビルドするには

  • メニュー バーで、[ビルド]、**[ソリューションのビルド]**を選択します。

ウィザードと項目テンプレートの関連付け

ウィザードの実装が済んだので、[ユーザー設定のアクション] の項目テンプレートで3種類の主要な手順を実行すると、アプリケーションを関連付ける必要があります:

  1. ウィザード アセンブリに厳密な名前で署名します。

  2. ウィザード アセンブリの公開キー トークンを取得します。

  3. カスタム動作項目テンプレートの .vstemplate ファイルに、ウィザード アセンブリへの参照を追加します。

ウィザード アセンブリに厳密な名前で署名するには

  1. [ソリューション エクスプローラー]では、[ItemTemplateWizard] のプロジェクト ノードからショートカット メニューを開き、**[プロパティ]**を選択します。

  2. [署名] タブの [アセンブリの署名] チェック ボックスをオンにします。

  3. [厳密な名前のキー ファイルを選択してください] の一覧で、を選択 **<New...>**します。

  4. [厳密な名前キーの作成] のダイアログ ボックスに名前を入力し、[キーファイルをパスワードで保護する] のチェック ボックスをオフにし、を [OK] のボタンをクリックします。

  5. メニュー バーで、[ビルド]、**[ソリューションのビルド]**を選択します。

ウィザード アセンブリの公開キー トークンを取得するには

  1. Visual Studioのコマンド プロンプト ウィンドウで、開発用コンピューターにItemTemplateWizardプロジェクトのビルドされたItemTemplateWizard.dllアセンブリに完全パスで PathToWizardAssembly を置き換える次のコマンドを実行します。

    sn.exe -T PathToWizardAssembly
    

    ItemTemplateWizard.dll アセンブリに対する公開キー トークンが Visual Studio コマンド プロンプト ウィンドウに記述されます。

  2. Visual Studio コマンド プロンプト ウィンドウは開いたままにします。公開キー トークンが次の手順を実行する必要があります。

.vstemplate ファイルにウィザード アセンブリへの参照を追加するには

  1. [ソリューション エクスプローラー]では、[ItemTemplate] のプロジェクト ノードを展開し、ItemTemplate.vstemplateファイルを開きます。

  2. ファイルの末尾の近くで、次の WizardExtension 要素を </TemplateContent> タグと </VSTemplate> タグの間に追加します。前の手順で取得した公開キー トークンで PublicKeyToken の属性の YourToken の値に置き換えます。

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

    WizardExtension 要素の詳細については、「WizardExtension 要素 (Visual Studio テンプレート)」を参照してください。

  3. ファイルを保存して閉じます。

項目テンプレートの Elements.xml ファイルへの置き換え可能パラメーターの追加

複数の置き換え可能パラメーターを、ItemTemplate プロジェクトの Elements.xml ファイルに追加します。これらのパラメーターは、前に定義した CustomActionWizard クラスの PopulateReplacementDictionary メソッドで初期化されます。ユーザーがカスタム動作プロジェクト項目をプロジェクトに追加すると、Visual Studio によって自動的に、新しいプロジェクト項目の Elements.xml ファイル内のこれらのパラメーターが、ウィザードでユーザーが指定した値に置き換えられます。

置き換え可能パラメーターはドル記号 ($) が付いて開始と終了のトークンです。独自の置き換え可能パラメーターの定義に加えて、SharePointプロジェクト システムが定義し、初期化、組み込みパラメーターを使用できます。詳細については、「置き換え可能パラメーター」を参照してください。

置き換え可能パラメーターを Elements.xml ファイルに追加するには

  1. ItemTemplateプロジェクトでは、次のXMLにElements.xmlファイルの内容を置き換えます。

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

    新しい XML では、Id、GroupId、Location、Description、Url の各属性の値が置き換え可能パラメーターに変更されます。

  2. ファイルを保存して閉じます。

VSIX パッケージへのウィザードの追加

VSIXプロジェクトのsource.extension.vsixmanifestファイルで、プロジェクト項目を含むVSIXパッケージで配置したように、ウィザード プロジェクトへの参照を追加します。

VSIX パッケージにウィザードを追加するには

  1. **[ソリューション エクスプローラー]**では、CustomActionProjectItemプロジェクトの [source.extension.vsixmanifest] ファイルからショートカット メニューを開き、マニフェスト エディターでファイルを開くには [開く] を選択します。

  2. マニフェスト エディターで、[資産] タブをクリックし、を [新規作成] のボタンをクリックします。

    [新しい資産の追加] のダイアログ ボックスが表示されます。

  3. [種類] の一覧で、**[Microsoft.VisualStudio.Assembly]**を選択します。

  4. [ソース] の一覧で、**[現在のソリューション内のプロジェクト]**を選択します。

  5. [プロジェクト] の一覧で、[ItemTemplateWizard]を選択し、[OK] のボタンをクリックします。

  6. メニュー バーで、[ビルド]、**[ソリューションのビルド]**を選択し、次に、ソリューションのエラーなしでコンパイルしてください。

ウィザードのテスト

これで、ウィザードをテストする準備ができました。まず、Visual Studioの実験用インスタンスでCustomActionProjectItemソリューションのデバッグを開始します。次に、Visual Studioの実験用インスタンスで、SharePointプロジェクトのカスタム動作プロジェクト項目のウィザードをテストします。最後に、SharePoint プロジェクトをビルドして実行し、カスタム動作が正常に機能することを確認します。

ソリューションをデバッグする

  1. 管理資格情報を使用してVisual Studioを再起動し、CustomActionProjectItemソリューションを開きます。

  2. ItemTemplateWizardプロジェクトで、CustomActionWizardコード ファイルを開き、RunStarted のメソッドのコードの先頭行にブレークポイントを追加します。

  3. メニュー バーで、[デバッグ]、**[例外]**を選択します。

  4. [例外] のダイアログ ボックスで、[Common Language Runtime Exceptions][スローされるとき][ユーザーにハンドルされていないとき] のチェック ボックスがオフになっていることを確認し、次に [OK] のボタンを選択します。

  5. F5キーのは、**[デバッグ]**を選択するメニュー バーのをクリックしてデバッグを開始した [デバッグの開始]

    Visual Studioは、%UserProfile%\AppData\Local\Microsoft\VisualStudio\11.0Exp\Extensions\Contoso\Custom Action Project Item\1.0に拡張機能をインストール、Visual Studioの実験用インスタンスを起動します。Visual Studioでプロジェクト項目をテストします。この場合

Visual Studio でウィザードをテストするには

  1. Visual Studioの実験用インスタンスで、メニュー バーで、[ファイル][新規作成]、**[プロジェクト]**を選択します。

  2. [Visual C#] または [Visual Basic] のノードを次の項目テンプレートがサポートする言語に応じて) [SharePoint] 展開し、ノードを展開し、を [2010] のノードを選択します。

  3. プロジェクト テンプレートの一覧で、[SharePoint 2010 プロジェクト]を選択し、プロジェクト CustomActionWizardTestを付けておくと、[OK] のボタンをクリックします。

  4. **[SharePoint カスタマイズ ウィザード]**では、デバッグ用に使用する入力し、次に [完了] のボタンを選択します。サイトのURL。

  5. **[ソリューション エクスプローラー]で、プロジェクトのノードのショートカット メニューを開き、[追加]**を選択し、を **[新しい項目]**を選択します。

  6. [Add New Item - CustomItemWizardTest] のダイアログ ボックスで、[SharePoint] のノードを展開し、[2010] のノードを展開します。

  7. プロジェクト項目の一覧で、[ユーザー設定のアクション] の項目を選択し、[追加] のボタンをクリックします。

  8. Visual Studio のもう一方のインスタンスで、先ほど RunStarted メソッドに設定したブレークポイントで、コードが停止していることを確認します。

  9. または、**[デバッグ]**を選択するメニュー バーで **[続行]**F5キーをクリックして、プロジェクトのデバッグを続行します。

    SharePoint カスタマイズ ウィザードが表示されます。

  10. [場所]の下に、[List Edit] のオプション ボタンを選択します。

  11. [グループ ID] の一覧で、**[通信]**を選択します。

  12. [タイトル] ボックスに、[SharePoint Developer Center]を入力します。

  13. [説明] ボックスに、SharePoint Developer Center Webサイトを開きますを入力します。

  14. [URL] ボックスに、https://msdn.microsoft.com/sharepoint/default.aspxを入力し、を [完了] のボタンをクリックします。

    isual Studioでは、プロジェクトへの [CustomAction1] という追加され、エディターのElements.xmlファイルを項目を開きます。Elements.xml にウィザードで指定した値が含まれることを確認します。

SharePoint のカスタム動作をテストするには

  1. Visual Studioの実験用インスタンスで、F5キーのキーを選択したり、メニュー バーで、[デバッグ]、**[デバッグの開始]**を選択します。

    プロジェクトの [サイト URL] のプロパティで指定されたカスタム動作はSharePointサイトにパッケージ化および配置され、WebBrowserには、このサイトの既定のページが表示されます。

    [!メモ]

    [スクリプト デバッグが無効] ダイアログ ボックスが表示されたら、[○] のボタンをクリックします。

  2. SharePointサイトのリストの領域では、[タスク] のリンクを選択します。

    [–にすべてのタスクおよびタスク] のページが表示されます。

  3. 次に、リボン [リスト ​​ツール] のタブで、[一覧] のタブを、[設定] のグループで、をクリックします **[リストの設定]**を選択します。

    [リストの設定] のページが表示されます。

  4. ページの先頭付近に [通信] 見出しの下で、ブラウザーがWebサイトhttps://msdn.microsoft.com/sharepoint/default.aspxを開き、ブラウザーを閉じます選択することを [SharePoint Developer Center] のリンクを確認します。

開発コンピューターのクリーンアップ

プロジェクト項目のテストが終わったら、プロジェクト項目テンプレートを Visual Studio の実験用インスタンスから削除します。

開発コンピューターをクリーンアップするには

  1. Visual Studioの実験用インスタンスで、メニュー バーで、[ツール]、**[拡張機能と更新プログラム]**を選択します。

    [拡張機能と更新プログラム] のダイアログ ボックスが表示されます。

  2. 拡張機能の一覧で、[Custom Action Project Item] の拡張機能を選択し、[アンインストール] のボタンをクリックします。

  3. 表示されたダイアログ ボックスで、拡張機能をアンインストールする選択し、アンインストールを実行するに [今すぐ再起動] のボタンを選択します。ことを確認するために [○] のボタンをクリックします。

  4. Visual Studioの実験用インスタンスとインスタンス (CustomActionProjectItemソリューションが開いている) Visual Studioの両方のインスタンスのインスタンスを閉じます。

参照

処理手順

チュートリアル: 項目テンプレートに基づくカスタム動作プロジェクト項目の作成 (パート 1)

方法 : プロジェクト テンプレートを組み合わせたウィザードを使用する

関連項目

Visual Studio テンプレート スキーマ参照

IWizard

概念

SharePoint プロジェクト項目の種類の定義

SharePoint プロジェクト項目の項目テンプレートとプロジェクト テンプレートの作成

その他の技術情報

カスタム アクションの既定の場所および ID