How-to migrate Wpf projects to the new VS2017 format
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>
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>
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>