How-to migrate Wpf projects to the new VS2017 format
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.
- You don't have to include intermediary
*.g.cs
files like some suggested to do. - No
Main not found
error will occur. - No
Unable to run your project. The "RunCommand" property is not defined.
error will occur. - 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>
Related videos on Youtube
![Niek Jannink](https://lh4.googleusercontent.com/-Pgb3zoKnvRo/AAAAAAAAAAI/AAAAAAAAAU8/kDuu8Tt_h6Q/photo.jpg?sz=256)
Niek Jannink
Updated on June 18, 2022Comments
-
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 about 7 yearsWhat you mean by The old item doesn't seem to be valid anymore? Does building fails, or exception thrown during runtime?
-
Niek Jannink about 7 yearsthe new project format doesn't seem to recognize / build xaml files
-
Fabio about 7 yearsDid you create new project? Why? You should be able just open original project in VS 2017
-
Niek Jannink about 7 yearsI wanted to simplify my project files with using the new package references and *.cs includes.
-
Nikhil Agrawal about 7 yearsHave you installed correct workload? For WPF, its .Net Desktop Development.
-
Niek Jannink about 7 yearsYes I installed the .Net Desktop Development workload
-
-
Mark Olbert about 7 yearsdid 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 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 about 7 yearsThanx, Niek. BTW, what do the references to LanguageTargets and MSBuildSDKExtrasTargets mean?
-
Niek Jannink about 7 yearsI 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 about 7 yearsYour 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 about 6 yearsYou should use
<Generator>MSBuild:Compile</Generator>
instead of<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
-
Sunil Buddala about 6 yearsAny idea how to do the same for Telerik reports? I'm not sure what to use as generator.
-
Niek Jannink about 6 yearsThis is indeed a much nicer solution for now. Lets wait untill MS releases the full support for Wpf and Winforms.
-
Edward Brey about 6 yearsWhen this project structure, when I edit
Settings.settings
, the VS designer does not regenerateSettings.Designer.cs
. Likewise, Run Custom Tool has no effect. -
LOST almost 6 yearsFor 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 over 5 years@FizxMike I was using MSBuild 15.
-
Cameron MacFarland over 5 yearsMight also need to add this work-around for the new CPS. github.com/dotnet/project-system/issues/2488
-
springy76 over 5 yearsThe Page on github says
Sdk="Sunburst.NET.Sdk.WPF"
but this only gives errors to me. Thanx for hint with the full version qualificationSdk="Sunburst.NET.Sdk.WPF/1.0.47"
. (The github page has no issues enabled :( ) -
Yepeekai almost 5 yearsFor 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 over 4 years@springy76 See my answer for a possible solution without the Sunburst SDK.
-
Niek Jannink about 3 yearsIt's not the official update tool, but created by hvanbakel. Looks legit and promising, but use at own risk.