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

问题描述 投票:0回答:4

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

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

重现步骤

  1. 推出 VS 2017
  2. 创建一个新的“WPF App (.NET Framework)”C# 项目
  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”中的代码中设置按钮标题。

您将看到智能感知无法识别已定义的按钮:

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

c# wpf visual-studio-2017 roslyn-project-system common-project-system
4个回答
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
投票

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

此外,您需要使用

MSBuild:UpdateDesignTimeXaml
代替
MSBuild:Compile
,如此处

所述

最后,您似乎必须明确命名“Page”元素中的每个“Include” - 您不能使用通配符。

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

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版本)


0
投票

您可以在 csproj 文件中添加 UseWPF 标志。这是我的解决方案,我将 xaml 控件从一个项目复制/移动到另一个项目,并遇到此问题,直到我意识到 csproj 文件中不存在 UseWPF。设置后,MSBuild:Compile 会自动关联,无需在 csproj 中指定。

© www.soinside.com 2019 - 2024. All rights reserved.