Пошаговое руководство. Создание элемента проекта настраиваемого действия с помощью шаблона элемента, часть 2
После того как пользовательский тип элемента проекта SharePoint определен и связан с шаблоном элемента в Visual Studio, имеет смысл также создать мастер для шаблона.Этот мастер можно использовать для сбора информации от пользователей, когда они добавляют в проект новые экземпляры элемента проекта с помощью этого шаблона.Собранные сведения могут быть использованы для инициализации элемента проекта.
Данное пошаговое руководство освещает добавление мастера к элементу проекта настраиваемого действия, как это показано в разделе Пошаговое руководство. Создание элемента проекта настраиваемого действия с помощью шаблона элемента, часть 1.Когда пользователь добавляет элемент проекта настраиваемого действия в проект SharePoint мастер собирает сведения о настраиваемом действии (например, его расположение и URL-адрес для перехода, когда пользователь выбирает в нем), и добавляет эти данные в файл Elements.xml нового элемента проекта.
В этом пошаговом руководстве показано выполнение следующих задач.
Создание мастера для настраиваемого типа элемента проекта SharePoint, связанного с шаблоном элемента.
Определение пользовательского интерфейса мастера, похожий на встроенных пользовательских мастеров для элементов проекта SharePoint в Visual Studio.
Использование подстановочных параметров для инициализации файлов проекта SharePoint с данными, собранными мастером.
Отладка и тестирование мастера.
Примечание |
---|
Можно загрузить образец, содержащая завершенные проекты, код и другие файлы для этого пошагового руководства из следующих расположений: Файлы проекта для SharePoint оборудуют примеры расширяемости. |
Обязательные компоненты
Для выполнения этого пошагового руководства необходимо в первую очередь создать решение CustomActionProjectItem, выполнив Пошаговое руководство. Создание элемента проекта настраиваемого действия с помощью шаблона элемента, часть 1.
Также для выполнения данного пошагового руководства на компьютере разработчика должны быть установлены следующие компоненты.
Поддерживаемые выпуски Windows, SharePoint и Visual Studio.Дополнительные сведения см. в разделе Требования по разработке решений SharePoint.
Пакет SDK для Visual Studio.В этом пошаговом руководстве шаблон Проект VSIX из пакета SDK используется для создания пакета VSIX, который служит для развертывания элемента проекта.Дополнительные сведения см. в разделе Расширение средств SharePoint в Visual Studio.
Знание следующих подходов может оказаться полезным, но не требуется для выполнения пошагового руководства.
Мастера для проектов и шаблонов элементов в Visual Studio.Дополнительные сведения см. в разделе Практическое руководство. Использование мастеров для шаблонов проекта и в документации на интерфейс IWizard.
настраиваемые действия в SharePoint.Дополнительные сведения см. в разделе Custom Action.
Создание проекта мастера
Для выполнения инструкций данного пошагового руководства необходимо добавить к решению проект CustomActionProjectItem, созданного в Пошаговое руководство. Создание элемента проекта настраиваемого действия с помощью шаблона элемента, часть 1.Необходимо будет реализовать интерфейс IWizard и определить пользовательский интерфейс мастера в этом проекте.
Создание проекта мастера
В Visual Studio открытие решения CustomActionProjectItem
В Обозреватель решений открыть контекстное меню для узла решения выберите Добавить, а затем выберите Создать проект.
Примечание В проектах Visual Basic узел решения отображается в обозревателе решений, только если в диалоговом окне General, Projects and Solutions, Options Dialog Box установлен флажок Всегда показывать решение.
В диалоговом окне Создать проект разверните узлы Visual C# или Visual Basic, а затем выберите узел Окна.
В верхней части диалогового окна Создать проект, убедитесь, что платформа .NET Framework 4,5 выбратьо в списке версий платформы .NET Framework.
Выберите шаблон проекта Библиотека пользовательских элементов управления WPF, назовите проект ItemTemplateWizard, а затем нажмите кнопку ОК.
Visual Studio добавит в решение проект ItemTemplateWizard.
Удалите элемент UserControl1 из проекта.
Настройка проекта мастера
Перед созданием мастер, необходимо добавить окно Windows Presentation Foundation (WPF), файл кода и ссылки на сборку в проект.
Настройка проекта мастера
В Обозреватель решений открыть контекстное меню с узла проекта ItemTemplateWizard, а затем выберите Свойства.
В Конструктор проектов проверьте, что требуемая версия .NET Framework устанавливаются на платформу .NET Framework 4,5.
Для проектов visual C#, можно установить это значение на вкладке Приложение.Для проектов Visual Basic, можно установить это значение на вкладке Компилировать.Дополнительные сведения см. в разделе Практическое руководство. Определение целевой версии .NET Framework.
В проекте ItemTemplateWizard добавьте элемент Окно (WPF) в проект и назовите элемент WizardWindow.
Добавьте 2 файла кода, называются CustomActionWizard и строками.
Открыть контекстное меню для проекта ItemTemplateWizard, а затем выберите Добавить ссылку.
В диалоговом окне Диспетчер ссылок - ItemTemplateWizard под узлом Сборки выберите узел Расширения.
Установите флажки рядом с следующими сборками, а затем нажмите кнопку ОК:
EnvDTE
Microsoft.VisualStudio.Shell.11.0
Microsoft.VisualStudio.TemplateWizardInterface
В Обозреватель решений в папке Ссылки для проекта ItemTemplateWizard выберите ссылку EnvDTE.
Примечание В проектах Visual Basic папка Ссылки отображается, только если в окне General, Projects and Solutions, Options Dialog Box установлен флажок Всегда показывать решение.
В окне Свойства измените значение свойства Внедрить типы взаимодействия к Ложь.
Определение строк "Расположение по умолчанию" и "ID" для настраиваемых действий
У любого настраиваемого действия есть расположение и идентификатор, заданные атрибутами GroupID и Location элемента CustomAction в файле Elements.xml.На этом этапе необходимо задать допустимые значения для данных атрибутов в проекте ItemTemplateWizard.При изучении в этом пошаговом руководстве эти строки записаны в файл Elements.xml в элементе проекта настраиваемого действия, когда пользователи задают расположение и идентификатор в мастере.
Для простоты данный пример описывает лишь подмножество доступных по умолчанию расположений и идентификаторов.Полный список см. в разделе Default Custom Action Locations and IDs.
Определение строк по умолчанию, содержащих расположение и идентификатор
открыть.
В проекте ItemTemplateWizard замените код в файле кода строк со следующим кодом.
' 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"; } }
Создание пользовательского интерфейса мастера
Добавьте XAML, чтобы определить пользовательский интерфейс мастера, и добавьте код привязки некоторых элементов управления в мастере к строкам идентификаторов.Мастер, который будет создан похожий на встроенный мастер проектов SharePoint в Visual Studio.
Создание пользовательского интерфейса мастера
В проекте ItemTemplateWizard открыть контекстное меню для файла WizardWindow.xaml, а затем выберите Открыть чтобы открыть окно в конструкторе.
В представлении XAML, замените текущий язык XAML следующим кодом XAML.Этот код XAML определяет пользовательский интерфейс, содержащий заголовок, элементы управления для указания поведения настраиваемого действия и кнопки навигации в нижней части окна.
Примечание Проект будет иметь некоторые компилировать ошибки после добавления этого кода.Эти ошибки исчезнут при добавлении кода на следующих шагах.
<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.При добавлении пользовательское диалоговое окно WPF в Visual Studio рекомендуется наследовать диалоговое окно от этого класса, чтобы иметь согласованный styling с другими диалоговыми окнами в Visual Studio и избежать проблем, которые могут возникать в противном случае с окнами модальным диалогового окна.Дополнительные сведения см. в разделе Практическое руководство. Создание и управление диалоговые окна.
Если разрабатываемый проект Visual Basic, удалите пространство имен ItemTemplateWizard от имени класса WizardWindow в атрибуте x:Class элемента Window.Этот элемент первой линии XAML.По завершении, первая линия должна выглядеть следующим образом:
<Window x:Class="WizardWindow"
В файле с выделенным кодом для файла 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 основных этапов:
подпишите сборку мастера строгим именем;
получите токен открытого ключа для сборки мастера;
добавьте ссылку в сборку мастера в VSTEMPLATE-файле для шаблона элемента Настраиваемое действие.
Подписывание сборки мастера строгим именем
В Обозреватель решений открыть контекстное меню с узла проекта ItemTemplateWizard, а затем выберите Свойства.
На вкладке Подписи установите флажок Подписать сборку.
В списке выберите <New...>Выберите файл ключа строгого имени.
В диалоговом окне Создание ключа строгого имени введите имя, снимите флажок Защитить мой файл ключей паролем, а затем нажмите кнопку ОК.
В строке меню выберите Построение, Построить решение.
Получение токена открытого ключа для сборки мастера
В окне командной строки Visual Studio выполните следующую команду, заменив PathToWizardAssembly полным путем к построенной сборке ItemTemplateWizard.dll для проекта ItemTemplateWizard на компьютере разработчика.
sn.exe -T PathToWizardAssembly
Токен открытого ключа для сборки ItemTemplateWizard.dll выводится в окне командной строки Visual Studio.
Не закрывайте окно командной строки Visual Studio.Токен открытого ключа, необходимо выполнить следующую процедуру.
Добавление ссылки на сборку мастера в VSTEMPLATE-файл
В Обозреватель решений разверните узел проекта ItemTemplate, а затем откройте файл ItemTemplate.vstemplate.
Добавьте следующий элемент WizardExtension между тегами </TemplateContent> и </VSTemplate> (ближе к концу файла).Замените значение YourToken атрибута PublicKeyToken с токеном открытого ключа, которые получили в предыдущей процедуре.
<WizardExtension> <Assembly>ItemTemplateWizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=YourToken</Assembly> <FullClassName>ItemTemplateWizard.CustomActionWizard</FullClassName> </WizardExtension>
Дополнительные сведения об элементе WizardExtension см. в разделе Элемент WizardExtension (шаблоны Visual Studio).
Сохраните и закройте файл.
Добавление подстановочных параметров в файл Elements.xml шаблона элемента
Добавьте несколько подстановочных параметров в файл Elements.xml проекта ItemTemplate.Эти параметры инициализируются методом PopulateReplacementDictionary класса CustomActionWizard, определенного ранее.При добавлении пользователем в проект элемента проекта "Настраиваемое действие" Visual Studio автоматически заменяет эти параметры в файле Elements.xml нового элемента проекта значениями, указанными пользователем в мастере.
Меняемый параметр токен, который начинается и заканчивается знаком доллара ($).Помимо указания собственных подстановочные параметры можно использовать встроенные параметры, что система проекта SharePoint определяет и выполняет инициализацию.Дополнительные сведения см. в разделе Подстановочные параметры.
Добавление подстановочных параметров в файл Elements.xml
В проект ItemTemplate замените содержимое файла Elements.xml следующим 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 на подстановочные параметры.
Сохраните и закройте файл.
Добавление мастера в пакет VSIX
В файле source.extension.vsixmanifest в проекте VSIX добавьте ссылку на проект мастера, чтобы он развертывался в пакете VSIX, содержащую элемент проекта.
Добавление мастера в пакет VSIX
В Обозреватель решений открыть контекстное меню source.extension.vsixmanifest из файла в проект CustomActionProjectItem, а затем выберите Открыть, чтобы открыть файл в редакторе манифестов.
В редакторе манифестов, выберите вкладку Активы, а затем нажмите кнопку Создать.
Диалоговое окно Добавить новый актив.
В списке Тип выберите Microsoft.VisualStudio.Assembly.
В списке Источник выберите Проект в текущем решении.
В списке Проект выберите ItemTemplateWizard, а затем нажмите кнопку ОК.
В строке меню выберите Построение, Построить решение и убедитесь, что решение будет компилироваться без ошибок.
Тестирование мастера
Мастер готов к тестированию.Во-первых, начните отладку решения CustomActionProjectItem в экспериментальном экземпляре Visual Studio.Затем проверьте мастер для элемента проекта настраиваемого действия в проекте SharePoint в экспериментальном экземпляре Visual Studio.И наконец, выполните построение и запустите проект SharePoint, чтобы проверить, что настраиваемое действие работает ожидаемым образом.
Начать отладку решения
Перезапустите Visual Studio с учетными данными администратора, а затем открыть решения CustomActionProjectItem.
В проекте ItemTemplateWizard, откройте файл кода CustomActionWizard, а затем добавьте точку останова на первой строке кода в методе RunStarted.
В строке меню выберите Отладка, Исключения.
В диалоговом окне Исключения, убедитесь, что очищены флажки Вызванное и Не обработанное пользовательским кодом для Исключения среды CLR, а затем выбрать кнопку ОК.
Начать отладку путем выбора ключа F5 либо в строке меню, при выборе Отладка, Начать отладку.
Visual Studio устанавливает расширения до %UserProfile% \ AppData \ local \ Microsoft \ VisualStudio \ 11.0Exp \ extensions \ Contoso \ элемент проекта настраиваемого действия \ 1.0 и запускает экспериментальном экземпляре Visual Studio.Тестировании элемент проекта в данном экземпляре Visual Studio.
Тестирование мастера в Visual Studio
В экспериментальном экземпляре Visual Studio в строке меню выберите Файл, Создать, Проект.
Разверните узел Visual C# или Visual Basic (в зависимости от языка, который поддерживает шаблон элемента) разверните узел SharePoint, а затем выберите узел 2010.
В списке шаблонов проектов выберите Проект SharePoint 2010, назовите проект CustomActionWizardTest, а затем нажмите кнопку ОК.
В Мастер настройки SharePoint введите URL-адрес сайта, который необходимо использовать для отладки, а затем нажмите кнопку Готово.
В Обозреватель решений открыть контекстное меню для узла проекта выберите Добавить, а затем выберите Создать элемент.
В диалоговом окне добавьте новый элемент - CustomItemWizardTest разверните узел SharePoint, а затем разверните узел 2010.
В списке элементов проекта выберите элемент Настраиваемое действие, а затем нажмите кнопку Добавить.
Убедитесь, что выполнение кода в другом экземпляре Visual Studio прерывается на точке останова, заданной ранее в методе RunStarted.
Чтобы продолжить отладку проекта, выбрав ключ F5 либо в строке меню, при выборе Отладка, Продолжить.
Появится окно "Мастер настройки SharePoint".
В Расположение выберите переключатель правка списка.
В списке Идентификатор группы выберите Связь.
В окне Название введите Центр разработчика SharePoint.
В окне Описание введите Открывает веб-сайт центра разработчиков SharePoint.
В окне URL-адрес, вставки https://msdn.microsoft.com/sharepoint/default.aspx, а затем кнопку Готово.
isual studio добавляет элемент с именем CustomAction1 в проект и открывается файл Elements.xml в редакторе.Проверьте, что в файле Elements.xml содержатся значения, заданные в мастере.
Тестирование настраиваемого действия в SharePoint
В экспериментальном экземпляре Visual Studio выберите ключ F5 либо в строке меню выберите Отладка, Начать отладку.
Пользовательское действие было представлено отдельным пакетом, пригодным к сайту SharePoint и развертыватьо, определенное свойством URL-адрес сайта проекта и Интернет-браузер открывает страницу по умолчанию данного сайта.
Примечание Если откроется диалоговое окно Отладка скриптов отключена отображается, нажмите кнопку Да.
В области списков сайта SharePoint выберите ссылку Задачи.
Страница задачи – все задачи.
На вкладке ленты Инструменты списка выберите вкладку Список, а затем в группе Параметры выберите параметры списка.
Страница Перечисляет параметры.
В Связь заголовок в верхней части страницы выберите ссылку Центр разработчика SharePoint, убедитесь, что браузер открывает веб-сайт https://msdn.microsoft.com/sharepoint/default.aspx, а затем закройте браузер.
Очистка компьютера разработчика
После завершения тестирования элемента проекта удалите шаблон элемента проекта из экспериментального экземпляра Visual Studio.
Очистка компьютера разработчика
В экспериментальном экземпляре Visual Studio в строке меню выберите Сервис, Расширения и обновления.
Будет открыто диалоговое окно Расширения и обновления.
В списке расширений выберите расширение элемент проекта настраиваемого действия, а затем нажмите кнопку Удалить.
В появившемся диалоговом окне нажмите кнопку Да, чтобы подтвердить удаление расширения, а затем нажмите кнопку Перезагрузить сейчас для завершения удаления.
Закройте оба экземпляра Visual Studio (экспериментальном экземпляра и экземпляр Visual Studio, в котором решения CustomActionProjectItem открыто).
См. также
Задачи
Практическое руководство. Использование мастеров для шаблонов проекта
Ссылки
Справочник по схеме шаблонов Visual Studio
Основные понятия
Определение пользовательских типов элементов проектов SharePoint
Создание шаблонов элементов и проектов для элементов проектов SharePoint
Другие ресурсы
По умолчанию расположений и идентификаторы настраиваемых действий