在使用新的CSPROJ格式后面

我已经在Visual Studio 2017中使用新的CSPROJ格式创建了一个WPF应用程序。

通过

  • 设置LanguageTargets,
  • 为XAML文件设置生成器,
  • 为App.Xaml设置构建操作,
  • 并强制调试可执行文件
  • 我可以成功构建和运行应用程序。 但是,我遇到了一个问题,即代码编辑器无法识别放置在XAML中的任何控件,所以在编辑器中出现错误的错误并且没有智能感知。

    代码编辑器中的错误错误

    重现步骤

  • 启动VS 2017
  • 创建一个新的“WPF应用程序(.NET Framework)”C#项目
  • 编辑csproj文件如下所示:
  • 项目文件:

    <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
      <PropertyGroup>
        <LanguageTargets>$(MSBuildExtensionsPath)$(VisualStudioVersion)BinMicrosoft.CSharp.targets</LanguageTargets>
        <TargetFramework>net45</TargetFramework>
        <ProjectGuid>{030D04DA-D603-4D4C-95F7-B6F725A6829E}</ProjectGuid>
      </PropertyGroup>
      <PropertyGroup>
        <OutputType>WinExe</OutputType>
      </PropertyGroup>
      <PropertyGroup>
        <StartupObject />
      </PropertyGroup>
      <ItemGroup>
        <ApplicationDefinition Include="App.xaml">
          <Generator>MSBuild:Compile</Generator>
          <SubType>Designer</SubType>
        </ApplicationDefinition>
        <Page Include="MainWindow.xaml">
          <SubType>Designer</SubType>
          <Generator>MSBuild:Compile</Generator>
        </Page>
        <Compile Update="***.xaml.cs" SubType="Designer" DependentUpon="%(Filename)" />
      </ItemGroup>
      <ItemGroup>
        <Reference Include="PresentationCore" />
        <Reference Include="PresentationFramework" />
        <Reference Include="System.Xaml" />
        <Reference Include="WindowsBase" />
      </ItemGroup>
    </Project>
    
  • 向MainWindow.xaml添加一个名为“button1”的按钮,如下所示:
  • MainWindow.xaml

    <Window x:Class="WpfApp1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Button Name="button1" Width="100" Height="50">Click me!</Button>
        </Grid>
    </Window>
    
  • 在“MainWindow.xaml.cs”中尝试并在代码中设置按钮标题。
  • 您将看到智能感知不认识该按钮已被定义: 代码编辑器中的错误错误

    但是,该项目的构建和运行已成功(请注意,您需要手动运行可执行文件--F5不起作用...)


    以前的答案略有改进是包含.g.cs文件,但将它们标记为不可见,以便它们不显示在解决方案中。 然后,您还需要将BaseIntermediateOutputPath标记为不可见,否则它将显示为空文件夹。

    这给出了相同的行为,但看起来更整洁,因为您在解决方案资源管理器中看不到obj文件夹。

    <ItemGroup>
      <ApplicationDefinition Include="App.xaml">
        <Generator>MSBuild:Compile</Generator>
        <SubType>Designer</SubType>
      </ApplicationDefinition>
      <Page Include="***.xaml" SubType="Designer" Generator="MSBuild:Compile" Exclude="App.xaml" />
      <Compile Update="***.xaml.cs" SubType="Designer" DependentUpon="%(Filename)" />
      <Compile Include="$(IntermediateOutputPath)*.g.cs" Visible="false" />
      <None Include="$(BaseIntermediateOutputPath)" Visible="false" />
    </ItemGroup>
    

    一个稍微黑客的解决方案是编辑项目文件以添加生成的类。 不幸的是,我无法弄清楚如何使文件成为依赖于XAML文件 - 我认为这只适用于同一文件夹中的文件。

    此外,您需要使用MSBuild:UpdateDesignTimeXaml代替MSBuild:Compile ,如此处所述

    最后,看起来您必须明确指定“Page”元素中的每个“包含” - 您不能使用通配符。

    <Project>
      <ItemGroup>
        <ApplicationDefinition Include="App.xaml">
          <SubType>Designer</SubType>
          <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
        </ApplicationDefinition>
        <Page Include="MainWindow.xaml">
          <SubType>Designer</SubType>
          <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
        </Page>
        <Compile Update="***.xaml.cs" DependentUpon="%(Filename)" />
        <!-- ADD THIS LINE HERE TO INCLUDE THE GENERATED PARTIAL CLASSES -->
        <!-- ENSURE YOU ARE USING THE g.cs AND NOT g.i.cs FILES 
             OR YOU WILL GET A BUILD FAILURE -->
        <Compile Include="$(IntermediateOutputPath)***.g.cs" />
      </ItemGroup>
    
    链接地址: http://www.djcxy.com/p/39605.html

    上一篇: behind when using new CSPROJ format

    下一篇: Not able to deserialize Lazy object