项目向导完成之前已创建项目

时间:2013-06-12 21:21:59

标签: c# visual-studio project wizard project-template

我为我的模板创建了一个项目向导。使用此向导,用户可以填写诸如应用程序名称之类的内容,然后创建应用程序。问题是该向导已启动,但随后立即创建项目,而不是在完成向导之后。这意味着没有进行替换。

我有这种形式(大大简化):

<Window x:Class="PartyTemplateWizard.Form"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="340" d:DesignWidth="750">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <TextBlock Text="Name" Grid.Column="0" />

        <TextBox x:Name="Name" Grid.Column="1" Text="{Binding Path=dummyproperty, FallbackValue='Naam'}" />

        <Button Content="Ok" Grid.Column="1" Grid.Row="1" />
    </Grid>
</Window>

使用向导:

public class Wizard : IWizard
{
    private readonly Form _form = new Form();

    public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
    {
        try
        {
            _form.Show();

            string name = _form.Name.Text;

            if (!string.IsNullOrEmpty(name)) replacementsDictionary.Add("$appname$", name);
        }
        catch (Exception e)
        {
        }
    }

    public bool ShouldAddProjectItem(string filePath)
    {
        return true;
    }

    public void RunFinished()
    {
    }

    public void BeforeOpeningFile(ProjectItem projectItem)
    {
    }

    public void ProjectItemFinishedGenerating(ProjectItem projectItem)
    {
    }

    public void ProjectFinishedGenerating(Project project)
    {
    }
}

我用这段代码将其绑定到我的模板:

<WizardExtension>
  <Assembly>PartyTemplateWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=6c4fd97fa2ac3b4f</Assembly>
  <FullClassName>PartyTemplateWizard.Wizard</FullClassName>
</WizardExtension>

github上提供完整代码:https://github.com/Avalaxy/PartyTemplateWizard

有没有人知道为什么在向导成功完成之前创建项目(尽管由于Ok按钮上没有事件处理程序,这是不可能的)?

1 个答案:

答案 0 :(得分:1)

请尝试使用_form.ShowDialog();,以便阻止主线程。目前似乎RunStarted方法无阻塞地执行,因此您的自定义表单未被使用。