Элементы управления WPF не распознаются в выделенном коде при использовании нового формата CSPROJ
Я создал приложение WPF с использованием нового формата CSPROJ в Visual Studio 2017.
От
- установка LanguageTargets,
- настройка генератора для файлов XAML,
- установка действия сборки для App.Xaml,
- и заставляя исполняемый файл отладки
Я могу успешно собрать и запустить приложение. Однако у меня есть проблема в том, что редактор кода не распознает какие-либо элементы управления, помещенные в XAML, поэтому я получаю ошибочные ошибки и не вижу смысла в редакторе.
Действия по воспроизведению
- Launch VS 2017
- Создайте новый проект C# "WPF App (.NET Framework)"
- Отредактируйте файл 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>
- Добавьте кнопку с именем "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>
- Попробуйте установить заголовок кнопки в коде в "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>