使用框架 4.7.2 运行 SDK 项目的 vs2019 中的控件和表单缺少图标和视图设计器选项

Posted

技术标签:

【中文标题】使用框架 4.7.2 运行 SDK 项目的 vs2019 中的控件和表单缺少图标和视图设计器选项【英文标题】:controls and forms missing icon and view designer option in vs2019 running SDK project with framework 4.7.2 【发布时间】:2021-11-20 00:14:33 【问题描述】:

到目前为止的总结答案:如果 csproj.user 文件存在,表单和控件仅在设计器中打开。

问题故事:

我有 2 个控件都继承自基本控件。 但是,解决方案资源管理器中缺少控制图标

好的控制源码从

开始
public partial class UniTabMaterialsControl : UnitabBaseControl

    public UniTabMaterialsControl()
    
        InitializeComponent();
    

坏控制源以

开头
public partial class UniTabMaterialsControl : UnitabBaseControl

     
    public UniTabMaterialsControl()
    
        InitializeComponent();
    

基本控制类是

public class UnitabBaseControl : UserControl


我已尝试关闭并重新打开 Visual Studio

[更新]

我添加了一个新的用户控件并将其设置为也从 UnitabBaseControl 继承,奇怪的是行为已纠正。

然后我能够删除新控件并保持正确的行为

Git 显示 UnitabBaseControl.cs 发生了变化,但除了 UserControl 文本的颜色之外,我没有看到其他变化

然后我对整个解决方案进行了全新克隆。 这次从 UnitabBaseControl 继承的所有控件都显示了错误的行为

[更新]

现在我遇到了同样的表单问题

using System.Windows.Forms;

namespace SBD.VivSnap.UI

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        
    

using System.Windows.Forms;

namespace SBD.VivSnap.UI

    public partial class Form2 : Form
    
        public Form2()
        
            InitializeComponent();
        
    

[更新]

我忘了提到我的项目是启动项目所引用的库项目。

我在启动项目中删除然后重新添加了库项目引用。然后所有的表单和控件都正确显示了。

我在 Git 中找不到任何更改来说明解决方案现在起作用的原因。

从那以后我注意到我的主要项目中的问题

[更新]

事实证明我的项目是 .sdk 格式,即使它是框架 4.7.2 我想这可能与它有关。

我正在使用Framework 4.7.2 with an sdk project

Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"

我在另一台运行 VS2019 16.1.4 的计算机上检查了代码,它构建正常。

我正在使用 16.11.4

[更新] 现在我已经更新到 16.11.5 并再次克隆,但仍然有问题。

[更新] 项目文件是

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <TargetFramework>net472</TargetFramework>
    <OutputType>WinExe</OutputType>
    <AssemblyName>Main</AssemblyName>
    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
    <RestorePackages>true</RestorePackages>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>
  <PropertyGroup>
    <StartupObject>SBD.VivSnap.Main.Program</StartupObject>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
    <PackageReference Include="Microsoft.Data.SqlClient">
      <Version>2.0.1</Version>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore">
      <Version>3.1.12</Version>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer">
      <Version>3.1.12</Version>
    </PackageReference>
    <PackageReference Include="NuGet.Build.Tasks.Pack" Version="5.7.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
    <PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\SnapInUI\SBD.VivSnap.UI.csproj" />
  </ItemGroup>
  <ItemGroup>
    <Compile Update="Properties\Settings.Designer.cs">
      <DesignTimeSharedInput>True</DesignTimeSharedInput>
      <AutoGen>True</AutoGen>
      <DependentUpon>Settings.settings</DependentUpon>
    </Compile>
  </ItemGroup>
  <ItemGroup>
    <None Update="Properties\Settings.settings">
      <Generator>SettingsSingleFileGenerator</Generator>
      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
    </None>
  </ItemGroup>
</Project>

csproj.user 文件在我的回答中。

【问题讨论】:

【参考方案1】:

表单的编译类型可能在 .csproj 文件中未正确设置为“表单”。 打开 .csproj 文件并确保在提到“form1.cs”的任何地方都有这行代码:

<Compile Include="form1.cs">
      <SubType>Form</SubType>
    </Compile>

【讨论】:

我很抱歉我没有提到我正在为项目使用 Sdk 格式。我更新了问题。 这是在正确的轨道上。我能够从 csproj.user 复制到 csproj 并且设计师现在可以工作了。现在修复相关项目中的控件。 我同样能够使用 UserControl 修复其他项目中的控件 天知道项目文件是如何损坏的。【参考方案2】:

原来 csproj.user 文件不在源代码管理中。 当我将 myproject.csproj.user 复制到项目文件夹并在 VS 中打开时,表单正确显示。

文件内容是

<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup />
  <ItemGroup>
    <Compile Update="Form1.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Update="Form2.cs">
      <SubType>Form</SubType>
    </Compile>
  </ItemGroup>
</Project>

这让我陷入了是否将 csproj.user 签入源代码控制的两难境地。我以前认为这不是必需的,但似乎确实如此。加上名称“用户”将暗示它是特定于用户的。

【讨论】:

正如另一个答案所建议的,我也认为这应该在普通的.csproj中。提交 .csproj.user 是个坏主意,因为它(最终)包含用户特定的调试信息(例如使用的参数或启动文件的绝对路径)。

以上是关于使用框架 4.7.2 运行 SDK 项目的 vs2019 中的控件和表单缺少图标和视图设计器选项的主要内容,如果未能解决你的问题,请参考以下文章

.net core 2.2.0 vs 2.2.7 无法合并,因为版本被项目锁定

框架4.7.2中的无法还原nuget软件包

现代化 .NET 框架 4.7.2 时代项目的身份验证选项

在项目 SDK Cocoa Touch 框架中使用 Firebase Analytics 时崩溃

VS 编译 MFC 应用可能会遇到的环境变量错误

Xamarin iOS构建错误-本地链接失败(仅链接框架SDK)