How-to migrate Wpf projects to the new VS2017 format

后端 未结 6 455
耶瑟儿~
耶瑟儿~ 2020-12-08 03:18

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

相关标签:
6条回答
  • 2020-12-08 03:25

    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>
    
    0 讨论(0)
  • 2020-12-08 03:30

    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>
    
    0 讨论(0)
  • 2020-12-08 03:32

    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>
    
    0 讨论(0)
  • 2020-12-08 03:34

    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.

    0 讨论(0)
  • 2020-12-08 03:45

    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>
    
    0 讨论(0)
  • 2020-12-08 03:49

    Now that .NET Core 3 has been released, you should use it if you can.

    But if not, I've found that I can create a separate Shared project for only the XAML items, and I can reference that project from the SDK-style project. Everything builds properly.

    Note that the XAML designer doesn't work -- no Intellisense or red squigglies. Visual Studio opens the XAML files with the XML editor.

    0 讨论(0)
提交回复
热议问题