How-to migrate Wpf projects to the new VS2017 format

11,217

Solution 1

December 13th 2018 - .NET Core 3 Preview 1 was announced

.NET Core 3 will support WPF and WinForms applications. You may try it with Preview version of SDK:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>
</Project>

Previous answer

You can use template below to replace old .csproj with. It resolves couple of issues other people templates had.

  1. You don't have to include intermediary *.g.cs files like some suggested to do.
  2. No Main not found error will occur.
  3. No Unable to run your project. The "RunCommand" property is not defined. error will occur.
  4. Includes already configured default Settings and Resources.

Template:

<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
  <PropertyGroup>
    <LanguageTargets>$(MSBuildExtensionsPath)\$(VisualStudioVersion)\Bin\Microsoft.CSharp.targets</LanguageTargets>
    <TargetFramework>net47</TargetFramework>
    <OutputType>WinExe</OutputType>
    <StartupObject />
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DebugType>full</DebugType>
    <DebugSymbols>true</DebugSymbols>
  </PropertyGroup>

  <ItemGroup>
    <!-- App.xaml -->
    <ApplicationDefinition Include="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </ApplicationDefinition>

    <!-- XAML elements -->
    <Page Include="**\*.xaml" Exclude="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </Page>
    <Compile Update="**\*.xaml.cs" SubType="Code" DependentUpon="%(Filename)" />

    <!-- Resources -->
    <EmbeddedResource Update="Properties\Resources.resx" Generator="ResXFileCodeGenerator" LastGenOutput="Resources.Designer.cs" />
    <Compile Update="Properties\Resources.Designer.cs" AutoGen="True" DependentUpon="Resources.resx" DesignTime="True" />

    <!-- Settings -->
    <None Update="Properties\Settings.settings" Generator="SettingsSingleFileGenerator" LastGenOutput="Settings.Designer.cs" />
    <Compile Update="Properties\Settings.Designer.cs" AutoGen="True" DependentUpon="Settings.settings" />

  </ItemGroup>

  <ItemGroup>
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="System.Xaml" />
    <Reference Include="WindowsBase" />
  </ItemGroup>
</Project>

Solution 2

After some searching and trial and error I got it working!

This is the final wpf csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <LanguageTargets>$(MSBuildExtensionsPath)\$(VisualStudioVersion)\Bin\Microsoft.CSharp.targets</LanguageTargets>
    <TargetFrameworks>net451</TargetFrameworks>
    <RootNamespace>MyWpfLibrary</RootNamespace>
    <AssemblyName>MyWpfLibrary</AssemblyName>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Rx-Xaml" Version="2.2.5" />
    <PackageReference Include="reactiveui-core" Version="7.2.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="MyOtherLibrary.csproj" />
  </ItemGroup>

  <ItemGroup>
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="ReachFramework" />
    <Reference Include="System.Net" />
    <Reference Include="System.Printing" />
    <Reference Include="System.Xaml" />
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Update="Properties\Resources.resx" Generator="ResXFileCodeGenerator" LastGenOutput="Resources.Designer.cs" />
    <Compile Update="Properties\Resources.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="Resources.resx"/>

    <Page Include="**\*.xaml" SubType="Designer" Generator="MSBuild:Compile" />
    <Compile Update="**\*.xaml.cs" SubType="Designer" DependentUpon="%(Filename)" />

    <Resource Include="Fonts\*.otf" />    
    <Resource Include="Images\*.png" />
  </ItemGroup>

  <Import Project="$(MSBuildSDKExtrasTargets)" Condition="Exists('$(MSBuildSDKExtrasTargets)')" />
</Project>

Solution 3

The above solution works for Wpf dll's, but I reverted it because Resharper and the Visual Studio designer where not functional anymore after this change. Mainly because they couldn't pair the xaml and the code-behind at design time. But the project compiles and works.

For a wpf executable you need to do the following:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <LanguageTargets>$(MSBuildExtensionsPath)\$(VisualStudioVersion)\Bin\Microsoft.CSharp.targets</LanguageTargets>
    <TargetFramework>net451</TargetFramework>
    <OutputType>WinExe</OutputType>
    <RootNamespace>MyNamespace</RootNamespace>
    <AssemblyName>MyExe</AssemblyName>
    <ApplicationIcon>MyExe.ico</ApplicationIcon>
    <ApplicationManifest>app.manifest</ApplicationManifest>
    <StartupObject>MyNamespace.App</StartupObject>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="System.Xaml" />
    <Reference Include="WindowsBase" />
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Update="Properties\Resources.resx" Generator="ResXFileCodeGenerator" LastGenOutput="Resources.Designer.cs" />
    <Compile Update="Properties\Resources.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="Resources.resx" />

    <None Update="Properties\Settings.settings" Generator="SettingsSingleFileGenerator" LastGenOutput="Settings.Designer.cs" />
    <Compile Update="Properties\Settings.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="Settings.settings" />

    <Page Include="MainWindow.xaml" SubType="Designer" Generator="MSBuild:Compile" />
    <Compile Update="MainWindow.xaml.cs" DependentUpon="MainWindow.xaml" />
    <Resource Include="Images\*.png" />

    <ApplicationDefinition Include="App.xaml" SubType="Designer" Generator="XamlIntelliSenseFileGenerator" />
    <Compile Update="App.xaml.cs" DependentUpon="App.xaml" />
  </ItemGroup>

  <Import Project="$(MSBuildSDKExtrasTargets)" Condition="Exists('$(MSBuildSDKExtrasTargets)')" />
</Project>

Solution 4

There's Sunburst.NET.Sdk.WPF that allows to use it as .NET SDK. Here's complete example for WPF application where any .cs and .xaml files will be included automatically:

<Project Sdk="Sunburst.NET.Sdk.WPF/1.0.47">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net40</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="../WpfMath/WpfMath.csproj" />
  </ItemGroup>
</Project>

When you build this project with msbuild (notably I had no luck with dotnet build though), it will automatically download SDK from NuGet and set everything up.

Solution 5

The above solutions may not work with Xamarin.Platforms.WPF on VS2019

Here's a project(based on previous answers) designed for the .net framework (not the .net core app), but can handle .net standard dependencies:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <RootNamespace>TestWPF</RootNamespace>
    <AssemblyName>TestWPF</AssemblyName>
    <TargetFramework>net461</TargetFramework>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <Deterministic>true</Deterministic>        
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <DebugType>full</DebugType>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
    <DebugType>pdbonly</DebugType>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NETCore.Platforms" Version="3.0.0" />
    <PackageReference Include="Xamarin.Forms" Version="4.2.0.848062" />
    <PackageReference Include="Xamarin.Forms.Platform.WPF" Version="4.2.0.848062" />
  </ItemGroup>
  <ItemGroup>
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="WindowsBase" />
    <Reference Include="System.Xaml" />
  </ItemGroup>
  <ItemGroup>
    <EmbeddedResource Update="Properties\Resources.resx" Generator="ResXFileCodeGenerator" LastGenOutput="Resources.Designer.cs" />
    <Compile Update="Properties\Resources.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="Resources.resx" />
    <None Update="Properties\Settings.settings" Generator="SettingsSingleFileGenerator" LastGenOutput="Settings.Designer.cs"/>
    <Compile Update="Properties\Settings.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="Settings.settings" />

    <ApplicationDefinition Include="App.xaml" Generator="MSBuild:Compile" />
    <Page Include="**\*.xaml" Exclude="App.xaml" SubType="Designer" Generator="MSBuild:Compile" />
    <Compile Update="**\*.xaml.cs" SubType="Designer" DependentUpon="%(Filename)" />

    <EmbeddedResource Remove="**\*.xaml" />

  </ItemGroup>  
  <Import Project="$(MSBuildSDKExtrasTargets)" Condition="Exists('$(MSBuildSDKExtrasTargets)')" />
</Project>
Share:
11,217

Related videos on Youtube

Niek Jannink
Author by

Niek Jannink

Updated on June 18, 2022

Comments

  • Niek Jannink
    Niek Jannink about 2 years

    I'm migrating my projects to the new visual studio 2017 format which is working nicely for all standard libraries only now I run into problems with my UI libraries where I use Wpf / Xaml.

    I cannot figure out howto do this for my user controls. The old item doesn't seem to be valid anymore.

    Anybody has an idea howto do this or if it's even possible.

    • Fabio
      Fabio about 7 years
      What you mean by The old item doesn't seem to be valid anymore? Does building fails, or exception thrown during runtime?
    • Niek Jannink
      Niek Jannink about 7 years
      the new project format doesn't seem to recognize / build xaml files
    • Fabio
      Fabio about 7 years
      Did you create new project? Why? You should be able just open original project in VS 2017
    • Niek Jannink
      Niek Jannink about 7 years
      I wanted to simplify my project files with using the new package references and *.cs includes.
    • Nikhil Agrawal
      Nikhil Agrawal about 7 years
      Have you installed correct workload? For WPF, its .Net Desktop Development.
    • Niek Jannink
      Niek Jannink about 7 years
      Yes I installed the .Net Desktop Development workload
  • Mark Olbert
    Mark Olbert about 7 years
    did you attempt to migrate a WPF executable project? If so, how did you do that? I'm getting a "Main not found" error on compile.
  • Maurício
    Maurício about 7 years
    @MarkOlbert You need to set the build action of App.xaml. I've actually got a list of all the things I had to do to make this work on my question here.
  • Mark Olbert
    Mark Olbert about 7 years
    Thanx, Niek. BTW, what do the references to LanguageTargets and MSBuildSDKExtrasTargets mean?
  • Niek Jannink
    Niek Jannink about 7 years
    I think the LanguageTargets mean it's C# and not VB.Net or F# and the and I guess the MSBuildSDKExtrasTargets are something for MSBuild. I haven't tried removing them to see what happens :)
  • Roman Mueller
    Roman Mueller about 7 years
    Your answer was very useful for me. In my case I had the situation with a WPF library. So I had to remove the <ApplicationDefinition> and not set the OutputType to Exe.
  • walterlv
    walterlv about 6 years
    You should use <Generator>MSBuild:Compile</Generator> instead of <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
  • Sunil Buddala
    Sunil Buddala about 6 years
    Any idea how to do the same for Telerik reports? I'm not sure what to use as generator.
  • Niek Jannink
    Niek Jannink about 6 years
    This is indeed a much nicer solution for now. Lets wait untill MS releases the full support for Wpf and Winforms.
  • Edward Brey
    Edward Brey about 6 years
    When this project structure, when I edit Settings.settings, the VS designer does not regenerate Settings.Designer.cs. Likewise, Run Custom Tool has no effect.
  • LOST
    LOST almost 6 years
    For some reason, when I build my project, generated files are not updated, and I have to rebuild manually every time I change any of .XAMLs
  • ForNeVeR
    ForNeVeR over 5 years
    @FizxMike I was using MSBuild 15.
  • Cameron MacFarland
    Cameron MacFarland over 5 years
    Might also need to add this work-around for the new CPS. github.com/dotnet/project-system/issues/2488
  • springy76
    springy76 over 5 years
    The Page on github says Sdk="Sunburst.NET.Sdk.WPF" but this only gives errors to me. Thanx for hint with the full version qualification Sdk="Sunburst.NET.Sdk.WPF/1.0.47". (The github page has no issues enabled :( )
  • Yepeekai
    Yepeekai almost 5 years
    For vs2019, you have to remove the languagetargets line. It fails with this line and it is not correctly set directly in the targets file of the sdk.
  • Zev Spitz
    Zev Spitz over 4 years
    @springy76 See my answer for a possible solution without the Sunburst SDK.
  • Niek Jannink
    Niek Jannink about 3 years
    It's not the official update tool, but created by hvanbakel. Looks legit and promising, but use at own risk.