使用新的CSPROJ格式时,WPF控件在代码隐藏中无法识别

时间:2017-05-24 09:24:20

标签: c# wpf visual-studio-2017 roslyn-project-system common-project-system

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

通过

我可以成功构建并运行该应用程序。但是,我有一个问题,即代码编辑器无法识别XAML中的任何控件,因此我在编辑器中得到错误的错误而没有智能感知。

Erroneous errors in the code editor

重现的步骤

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

    <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
      <PropertyGroup>
        <LanguageTargets>$(MSBuildExtensionsPath)\$(VisualStudioVersion)\Bin\Microsoft.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>
    
    1. 将一个名为“button1”的按钮添加到MainWindow.xaml,如下所示:
    2. 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>
      
      1. 尝试在“MainWindow.xaml.cs”中的代码中设置按钮标题。
      2. 您将看到intellisense无法识别按钮已定义: Erroneous errors in the code editor

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

3 个答案:

答案 0 :(得分:2)

您之前的答案略有改进,包括.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>

答案 1 :(得分:1)

一个有点讨厌的解决方案是编辑项目文件以添加生成的类。不幸的是,我无法解决如何使文件成为DependentUpon XAML文件 - 我认为that only works for files in the same folder

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

最后,您似乎必须明确命名每个&#34;包含&#34;在&#34; Page&#34;元素 - 您不能使用通配符。

<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>

答案 2 :(得分:1)

我发现使用这种方式来定义SDK可以解决我的问题:

<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="MSBuild.Sdk.Extras">
  <PropertyGroup>
....

代替

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
....

(这是VS2017的15.9.15版本)