Элементы управления WPF не распознаются в выделенном коде при использовании нового формата CSPROJ

Я создал приложение WPF с использованием нового формата CSPROJ в Visual Studio 2017.

От

Я могу успешно собрать и запустить приложение. Однако у меня есть проблема в том, что редактор кода не распознает какие-либо элементы управления, помещенные в XAML, поэтому я получаю ошибочные ошибки и не вижу смысла в редакторе.

Ошибочные ошибки в редакторе кода

Действия по воспроизведению

  1. Launch VS 2017
  2. Создайте новый проект C# "WPF App (.NET Framework)"
  3. Отредактируйте файл csproj так, чтобы он выглядел следующим образом:

Файл проекта:

<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, как показано ниже:

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

Вы увидите, что intellisense не распознает, что кнопка определена: Ошибочные ошибки в редакторе кода

Тем не менее, проект собирается и запускается успешно (обратите внимание, вам нужно будет запустить исполняемый файл вручную - F5 не работает...)

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>

Я обнаружил, что использование этого типа для определения Sdk разрешило это для меня:

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

вместо того

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

(Это в версии VS2017 15.9.15)

Одно немного хакерское решение - отредактировать файл проекта, добавив сгенерированные классы. К сожалению, я не могу понять, как заставить файл быть зависимым от файла XAML - я думаю, что он работает только для файлов в той же папке.

Кроме того, вам нужно использовать MSBuild:UpdateDesignTimeXaml вместо MSBuild:Compileкак описано здесь

Наконец, кажется, что вы должны явно назвать каждое "Включить" в элементе "Страница" - вы не можете использовать подстановочные знаки.

<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>
Другие вопросы по тегам