VS 2015:WPF项目模板与Nuget包

本文关键字:Nuget 项目 2015 WPF VS | 更新日期: 2023-09-27 18:21:20

我正在尝试创建一个小的WPF模板项目,其中包含ResourceDictionary、Window和一些NuGet包。我找到了这本手册:https://shahbhavya47.wordpress.com/2015/03/11/create-visual-studio-project-template-with-pre-installed-nuget-packages-using-vs-sdk/

它运行得很好,但一旦我添加WPF UserControls,我就会得到一些奇怪的行为:

  1. 如果我让XAML页面生成为"Page",则其他具有Build的类"None"似乎被编译并失败了,因为我有这样的文本标记$safeprojectname$在那里
  2. 即使导出项目,TemplateContent节中的VSTemplate文件中也缺少XAML文件和代码隐藏类
  3. 如果我手动添加页面和代码隐藏文件并重新生成模板项目,则在我使用它们创建的项目中,这些文件不会显示在任何位置

我是不是在这件事上做错了什么,或者附近有一些指南关注WPF模板以及如何使用它们?

提前感谢!

Matthias

VS 2015:WPF项目模板与Nuget包

以下是我如何使其工作的步骤:

  1. 创建了一个模板项目,向其中添加了Newtonfost.Json包,并从解决方案资源管理器.vstemplate文件和.csproj中删除了默认Class1.cs,如该手册中所述
  2. .csproj中的<OutputType>更改为WinExe,将<RequiredFrameworkVerison>更改为4.0
  3. 将以下行添加到.csproj的第一个<PropertyGroup>中,以便VS可以将该项目识别为WPF应用程序
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
  1. .csproj文件添加了以下4个引用,以确保它在创建后立即编译:
<Reference Include="System.Xaml">
  <RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
  1. 将以下4个文件从标准的新WPF项目中复制到模板项目中:App.xaml、MainWindow.xaml,App.xaml.csMainWindow.xamil.cs
  2. 在模板项目中,通过在解决方案资源管理器中选择每个文件并在Properties窗口中更改Action,将所有4个文件的Action设置为None
  3. 将以下<ItemGroup>添加到.csproj文件中,以确保在根据模板生成的项目中正确标记这些文件:
  <ItemGroup>
    <ApplicationDefinition Include="App.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </ApplicationDefinition>
    <Page Include="MainWindow.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Compile Include="MainWindow.xaml.cs">
      <DependentUpon>MainWindow.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
  </ItemGroup>
  1. 将相应的<ProjectItem>元素添加到.vstemplate文件中:
  <ProjectItem ReplaceParameters="true" TargetFileName="App.xaml">App.xaml</ProjectItem>
  <ProjectItem ReplaceParameters="true" TargetFileName="MainWindow.xaml">MainWindow.xaml</ProjectItem>
  <ProjectItem ReplaceParameters="true" TargetFileName="App.xaml.cs">App.xaml.cs</ProjectItem>
  <ProjectItem ReplaceParameters="true" TargetFileName="MainWindow.xaml.cs">MainWindow.xaml.cs</ProjectItem>

ReplaceParameters="true"可以将文本标记包括在添加的4个文件中的任何一个文件中。我在App.xaml.cs:中使用了$safeprojectname$

public partial class App : Application
{
    private string field = "$safeprojectname$";
}

以及在MainWindow.xaml:中

<Grid>
    <TextBlock>$safeprojectname$</TextBlock>
</Grid>

在此之后,构建模板项目在bin/Debug文件夹中生成了zip文件,该文件按预期工作,包括替换两个文件中的$safeprojectname$实例。

请记住,模板项目的主要目标是构建模板,因此,例如,从该项目打开.xaml文件将在设计器中显示无效标记。从一个普通的WPF项目开始,然后将其文件和.csproj文件的相关部分复制到一个模板项目中会容易得多。