Как остановить работу мастера (IWizard) в концепции шаблона проекта - PullRequest
1 голос
/ 21 января 2020

У меня есть один шаблон проекта с концепцией мастера. При выборе шаблона будет показан мастер для настройки продукта.

Мастер содержит две кнопки

1.Fini sh

2.Cancel

Когда нажата кнопка fini sh, я хочу создать проект на основе опции, выбранной в мастере. Это я уже сделал, используя концепцию мастера в шаблоне проекта.

Когда нажата кнопка «Отмена», я хочу остановить генерацию проекта и просто закрыть мастер. Как я могу остановить создание проекта и закрыть мастер без каких-либо исключений?

using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TemplateWizard;
using System.Windows.Forms;
using EnvDTE;

namespace MyProjectWizard
{
    public class WizardImplementation : IWizard
    {

        public TeamsForm firstForm;
        //This method is called before opening any item that
        // has the OpenInEditor attribute.
        public void BeforeOpeningFile(ProjectItem projectItem)
        {
        }

        public void ProjectFinishedGenerating(Project project)
        {
        }

        // This method is only called for item templates,
        // not for project templates.
        public void ProjectItemFinishedGenerating(ProjectItem
            projectItem)
        {
        }

        // This method is called after the project is created.
        public void RunFinished()
        {
        }

        public void RunStarted(object automationObject,
            Dictionary<string, string> replacementsDictionary,
            WizardRunKind runKind, object[] customParams)
        {
            firstForm = new TeamsForm();
            firstForm.ShowDialog();
        }

        // This method is only called for item templates,
        // not for project templates.
        public bool ShouldAddProjectItem(string filePath)
        {
            return true;
        }
    }
}

1 Ответ

1 голос
/ 21 января 2020

Есть только один способ сделать это без исключения. Это через интерфейс IDTWizard. Это не так просто, хотя: https://docs.microsoft.com/en-us/previous-versions/7k3w6w59 (v = vs.140)? Redirectedfrom = MSDN

В вашем случае я бы go что-то вроде этого: https://www.neovolve.com/2011/07/19/pitfalls-of-cancelling-a-vsix-project-template-in-an-iwizard/

public void RunStarted(
    Object automationObject, Dictionary<String, String> replacementsDictionary, WizardRunKind runKind, Object[] customParams)
{
    DTE dte = automationObject as DTE;

    String destinationDirectory = replacementsDictionary["$destinationdirectory$"];

    try
    {
        using (PackageDefinition definition = new PackageDefinition(dte, destinationDirectory))
        {
            DialogResult dialogResult = definition.ShowDialog();

            if (dialogResult != DialogResult.OK)
            {
                throw new WizardBackoutException();
            }

            replacementsDictionary.Add("$packagePath$", definition.PackagePath);
            replacementsDictionary.Add("$packageExtension$", Path.GetExtension(definition.PackagePath));

            _dependentProjectName = definition.SelectedProject;
        }
    }
    catch (Exception ex)
    {
        // Clean up the template that was written to disk
        if (Directory.Exists(destinationDirectory))
        {
            Directory.Delete(destinationDirectory, true);
        }

        Debug.WriteLine(ex);

        throw;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...