New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Windows Form does not nest .designer.cs under .cs #1272
Comments
I hate to complain because of the amazing results you've already had, but six lines feels a bit more verbose than it needs to be. Is something like this possible? (Is <Compile Update="Form1.cs" SubType="Form" />
<Compile Update="Form1.designer.cs" SubType="Form" DependentUpon="Form1.cs" /> |
More differences:
|
Correction: This is not an absolute showstopper, just very tedious to work around.
I tried deleting the .resx and the resx-generated designer file and now the designer will not open. Two errors: NotImplementedException, call stack:
and "The variable 'buttonEdit1' is either undeclared or was never assigned." which takes me to the code, wherein buttonEdit1 is most certainly both declared and assigned. |
The point of this exercise was to be able to see if the new .csproj offers deliverance from the madness that is Here's what I'm hoping will eventually be the case:
|
I was able to confirm that a call to That brings this issue to a total of seven issues. Should I start issues for these or are they closely related enough for your purposes? |
@jnm2 Hey thanks for trying out these scenarios. As you noticed, we don't support WinForms yet. For the time being we're focused on .NET Core and only build and deploy for .NET Framework. The designers, etc do not/will not work until post VS 2017 RTM. I think it's helpful to get issues filed on these and let's get them tagged so that we can understand what it takes to bring up WinForms (it's a going to be peeling of the onion). The sub type issue is already being tracked here: #997. The nesting issue is being tracked here: #159. The other issues we are not tracking - would you like to file them or do you want me to? |
Understood. My goal is to make these things visible so they happen sooner rather than later, because until there's a strong UI library for Core I'll be using WinForms for a while.
Doesn't matter to me. They will probably be of more value if you file them since you know what's under the hood. |
When it will be done? It's important to me because it is the last thing remaining on my way to new csproj format :) |
This is also bugging me. I'm trying to move entirely into new csproj land, and while most of my stuff will work as is, I have one(!) WinForms app that is holding me back. Is there anyway, even if undocumented, to make new csproj deal with WinForms projects (while keeping the designer functional)? |
Yes, @onovotny, I've been meaning to ask if you have inside information to swoop in and save the day again? |
@damageboy Did you find a solution for this yet? I am currently trying to figure out the exact same issue. I am glad I got it working to conditionally reference System.Windows.Forms whenever it is building for net461... That works but my Designer doesnt show up. |
@johmarjac Have you tried using the MSBuild.Sdk.Extras? It adds the proper nesting support. |
@onovotny Does |
I can't say 100% for WinForms (since I haven't actually tried), but it does work for WPF with designers. There are currently some workarounds needed in your csproj for WPF due to the 2-pass compile steps. You can see it in action with NuGet Package Explorer: https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/blob/master/PackageExplorer/NuGetPackageExplorer.csproj |
Just tried |
@davkean For the Windows Forms designers themselves, that's not something your team is responsible for, is it? I should probably use the VS feedback tool for that? |
@onovotny For me it does not even nest Form1.cs and Form1.Designer.cs together allthough I installed (and restored) the MSBuild.Sdk.Extras Package.
|
Yeah, Forms look like they need something else -- plus it also cannot automatically add the StronglyTypedResourcesGenerator (Extras has a way to disable that), since Forms' resx works differently. |
Same issue here - although I find that just adding |
I hear what you're saying, but I want the .designer.cs for sure so the autogenerated fields and InitializeComponent stay out of sight. I don't want to be the one to submit the PR removing dozens of .designer.cs and .resx files. 😁 |
I have successfully created the worst msbuild hack of all time... I basically have two projects for a The Other, I'm attaching the <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="15.0">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<ProjectGuid>{8F13900E-A99B-4278-9231-5ADB631698FB}</ProjectGuid>
<ApplicationIcon>X.ico</ApplicationIcon>
<AssemblyName>X</AssemblyName>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x64</Platform>
<LangVersion>latest</LangVersion>
<OutputType>WinExe</OutputType>
<RootNamespace>X</RootNamespace>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\..\</SolutionDir>
<Prefer32Bit>true</Prefer32Bit>
<DebugType>portable</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<NoWarn>1701</NoWarn>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Label="MultilingualAppToolkit">
<MultilingualAppToolkitVersion>4.0</MultilingualAppToolkitVersion>
<MultilingualFallbackLanguage>en-US</MultilingualFallbackLanguage>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
<OutputPath>killme\Release\</OutputPath>
<DefineConstants>TRACE;</DefineConstants>
<Optimize>true</Optimize>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<OutputPath>killme\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;</DefineConstants>
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
</PropertyGroup>
<!-- Too much msbuild crap, as created by the old project system -->
</Project>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net471</TargetFramework>
<ApplicationIcon>..\..\designer\X.Designer\X.ico</ApplicationIcon>
<OutputType>winexe</OutputType>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<Import Project="../Resurrect-WinForms.targets" />
<ItemGroup>
<PackageReference Include="DockPanelSuite" Version="3.0.3" />
<PackageReference Include="DockPanelSuite.ThemeVS2015" Version="3.0.3" />
<PackageReference Include="LibGit2Sharp" Version="0.25.0-preview-0073" />
<PackageReference Include="NLog" Version="4.5.0-rc04" />
<PackageReference Include="Npgsql" Version="3.2.6" />
<PackageReference Include="WindowsAPICodePack-Shell" Version="1.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="1.1.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="1.1.2" />
</ItemGroup>
</Project>
And here's <Project>
<PropertyGroup>
<WinFormsPath>..\..\designer\$(AssemblyName).Designer</WinFormsPath>
<WinFormsExcludes>$(WinFormsPath)\killme\**;$(WinFormsPath)\obj\**</WinFormsExcludes>
</PropertyGroup>
<!-- This is a really really special construct we use in our build:
The idea is that we have X.Designer which is a old-csproj projet we HAVE to continue using
to preserve the WinForms designer functionality because life sucks https://github.com/dotnet/project-system/issues/1272
But once the "designing" is done, we don't really have to do anything else with the old format, so we have THIS .csproj
which does magic and re-includes the files so that we can compile them with "standard" dotnet
-->
<ItemGroup>
<Compile
Include="$(WinFormsPath)\**\*$(DefaultLanguageSourceExtension)"
Exclude="$(DefaultItemExcludes);$(WinFormsExcludes)"
Link="%(RecursiveDir)%(FileName)%(Extension)" />
<EmbeddedResource
Include="$(WinFormsPath)\**\*.resx"
Exclude="$(DefaultItemExcludes);$(WinFormsExcludes)"
Link="%(RecursiveDir)%(FileName)%(Extension)" />
<None
Include="$(WinFormsPath)\**\*"
Exclude="$(DefaultItemExcludes);$(WinFormsExcludes)"
Link="%(RecursiveDir)%(FileName)%(Extension)" />
<None Remove="$(WinFormsPath)\**\*$(DefaultLanguageSourceExtension)" />
<None Remove="$(WinFormsPath)\**\*.resx" />
<!-- Causes weird VS2017 15.5 b0rk
<Compile
Update="$(WinFormsPath)/**/*.Designer$(DefaultLanguageSourceExtension)"
DependentUpon="$([System.String]::Copy('%(Filename)').Replace('.Designer', ''))$(DefaultLanguageSourceExtension)"
SubType="Code" /> -->
<EmbeddedResource
Update="$(WinFormsPath)\**\*.resx"
DependentUpon="%(Filename)$(DefaultLanguageSourceExtension)"
SubType="Designer" />
<EmbeddedResource
Update="$(WinFormsPath)\**\*.zh-CN.resx"
DependentUpon="$([System.String]::Copy('%(Filename)').Replace('.zh-CN', ''))$(DefaultLanguageSourceExtension)"
SubType="Designer" />
<EmbeddedResource Remove="$(WinFormsPath)\Properties\Resources.resx" />
<EmbeddedResource Remove="$(WinFormsPath)\Properties\Resources.zh-CN.resx" />
<EmbeddedResource Include="$(WinFormsPath)\Properties\Resources.resx">
<Link>Properties\Resources.resx</Link>
<SubType>Designer</SubType>
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="$(WinFormsPath)\Properties\Resources.zh-CN.resx">
<Link>Properties\Resources.zh-CN.resx</Link>
</EmbeddedResource>
<Compile Remove="$(WinFormsPath)\Properties\Resources.Designer.cs" />
<Compile Include="$(WinFormsPath)\Properties\Resources.Designer.cs">
<Link>Properties\Resources.Designer.cs</Link>
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
</Project> I take no responsibility for anything with this horrid hack I've copy pasted above. |
The targets files in this project were borrowed from a comment in dotnet/project-system#1272 and modified somewhat to fit into an SDK project. Note that these targets are as-yet untested.
For me, when I add new form "test.cs" the csproj will contain:
in order to nest the designer, manually edit the csproj by adding right below it, two new nodes in the same ItemGroup:
now, Shift+F7 works, designer works. |
But what happens when you change something through the designer? |
@jnm2 We're bringing up WinForms now - let's use new issues to track each individual issue; bugs we're aware of are being tracked by the WinForms label:
Feature-WinForms
The nesting itself is being tracked by #159, and we've implemented for 16.0 using rules of legacy but without DependentUpon. We'll respect DependentUpon if its present, otherwise, we'll just auto-nest based on existing rules. I'm going to dupe this bug against it. |
I'm facing the same issue with Active Report, do we have any idea to bring back the designer? |
I just ran into this exact issue when trying to update the project file of a winforms project to the SDK style project (note, I'm only updating the project file, the target framework is still .NET Framework 4.7.2). Forms/UserControls that use vanilla WinForms controls open fine in the Designer, but if I used a licensed control, it fails with the exception mentioned above. Is there any fix/workaround for this? Or any ETA on when (if ever) it will get fixed? |
@petroemil It's on the roadmap to have a preview late this year. Workarounds are here: https://github.com/dotnet/winforms/blob/master/Documentation/winforms-designer.md Visual Studio 2019 is steadily improving in this area too: |
I found out (not why but) when it happens. It happens as soon as the relative path to your .cs and .resx files has a white space. As soon as there is any white space, the .designer.resx will not move to .resx and stay at .cs. How to:
|
I was not able to tell if this issue was already tracked.
Start with this .csproj (15.0.26014.0):
Select Windows Form in Add New Item and see Form1.cs and Form1.designer.cs nodes are siblings in Solution Explorer, and this is the .csproj:
The text was updated successfully, but these errors were encountered: