在.NET Core 3.0 Preview上使用Windows窗体设计器
支持使用基于Windows窗体应用程序的.NET Core 3.0(预览)的Windows窗体设计器
介绍
截至撰写本文时,Microsoft和社区目前正在测试.NET Core 3.0。如果您在.NET Core 3.0的一般可用性之后阅读本文,请跳过本文。否则,继续。
Windows Forms一直是维护企业/企业桌面应用程序的巅峰之作。尽管有着开发桌面应用程序的古老机制,但微软能够认识到经过实战测试的工具包的优势,并决定将其转移到现代.NET Core平台(以前称为.NET Framework)。
到目前为止,他们设法通过Windows窗体转换很好地将事物整合在一起,但是缺少早期采用者的一些关键组件,其中一个恰好是Windows窗体设计器; Microsoft Visual Studio内置的工具,旨在简化用户界面开发。要确认.NET Core 3.0预览中的Windows窗体设计器限制,请尝试打开并设计任何表单/用户控制文件(通常是新创建的项目中的Form1.cs。)因此,文章的结果存在。本文将指导您如何克服.NET Core 3.0预览版Windows窗体设计器的限制,而无需等待其一般可用性。
软件要求
要继续阅读本文,您必须在系统上安装以下组件:
- Microsoft Visual Studio 2019 - 至少版本16.2.0
- .NET Core 3.0预览版7(截至编写本文时,将使用预览版7)
克服限制
证明问题
- 创建一个新的Windows窗体应用程序(.NET Core)。如果您看不到左侧的条目,请使用方便的“ 搜索模板”搜索框并键入“ Windows Forms App(.NET Core) ”。
- 对于这个项目,我们将命名它
DotNetCore.WinForms,但你可以任意命名,确保理解这个概念,你会很高兴。 - 如果没有进行任何更改,请尝试打开Form1.cs
文件,您应该看到类似的内容。请不要惊慌,这是正常行为,因为我们正在运行.NET Core 3.0的预览版本。我们稍后会解决这个问题。
此时,您开始感觉到在.NET Core 3.0预览下无法进行任何类型的用户界面设计。
解决方案
为了解决这个限制,我们可以使用一种方法,通过基于功能齐全的.NET Framework创建一个额外的Windows Forms项目,我们可以间接地利用.NET Core项目的设计。请继续直到最后。
- 右键单击解决方案名称,然后创建一个名为_TemporaryFixup的新解决方案文件夹。
- 在_TemporaryFixup解决方案文件夹下,创建一个新的Windows窗体应用程序(.NET Framework)项目。如果您看不到左侧的条目,请使用方便的“ 搜索模板 ”搜索框并键入“ Windows Forms App(.NET Framework) ”。
- 对于这个项目,我们将命名为DotNetFramework.WinForms,但您可以将其命名为任何您喜欢的名称。
- 删除Form1.cs
文件。 - 右键单击该
DotNetFramework.WinForms项目,然后单击“ 属性”。 - 将默认命名空间更改为与.NET Core项目相同; 在我们的例子中,我们将其设置为
DotNetCore.WinForms(将在几个中解释) - 创建一个新表单并将其命名为您喜欢的任何名称。
现在,让我们使用以下命令修改项目中的Program.cs文件DotNetFramework.WinForms:
using System;
using System.IO;
using System.Linq; namespace DotNetFramework.WinForms
{
static class Program
{
private static string SourceProjectDir =
@"C:\Users\ahmad\source\repos\DotNetCore.WinForms\DotNetFramework.WinForms";
private static string TargetProjectDir =
@"C:\Users\ahmad\source\repos\DotNetCore.WinForms\DotNetCore.WinForms"; [STAThread]
static void Main()
{
var directory = new DirectoryInfo(SourceProjectDir); var srcFiles = directory.GetFiles("*.Designer.cs", SearchOption.AllDirectories); foreach (var srcFile in srcFiles)
{
// Get the relative directory
var relativeDirectory = $"{srcFile.DirectoryName.Substring
(SourceProjectDir.Length,
srcFile.DirectoryName.Length - SourceProjectDir.Length)}"; // Append the determined relative directory to the corresponding designer
// & C# source files related to the form.
var designerFileName = $@"{relativeDirectory}\{srcFile.Name}";
var noDesignerFileName =
$@"{relativeDirectory}\{srcFile.Name.Replace(".Designer", "")}"; var srcDesignerFile = $"{SourceProjectDir}{designerFileName}";
var srcNoDesignerFile = $"{SourceProjectDir}{noDesignerFileName}"; var dstDesignerFile = $"{TargetProjectDir}{designerFileName}";
var dstNoDesignerFile = $"{TargetProjectDir}{noDesignerFileName}"; // Create an array based on the relative location.
var dirs = relativeDirectory.Split('\\').ToList(); // Keep track of where were we when we created a directory.
var currentDir = TargetProjectDir; // Start creating the missing directories in our target project.
foreach (var dir in dirs)
{
currentDir = Path.Combine(currentDir, dir);
Directory.CreateDirectory(currentDir);
} // Overwrite the file to the targeted project.
File.Copy(srcDesignerFile, dstDesignerFile, true); // If our UI logic is unavailable, that means we've created
// a new form from the source project.
// so we copy the form's UI logic code to the target project.
if (!File.Exists(dstNoDesignerFile) && File.Exists(srcNoDesignerFile))
{
File.Copy(srcNoDesignerFile, dstNoDesignerFile, false);
}
}
}
}
}
由于我们专注于在.NET Core平台上开发我们的应用程序,因此我们不需要显示.NET Framework对应的任何对话框。我们宁愿*只将.NET Framework项目的用户界面设计部分反映到.NET Core项目中。这几乎可以解释为什么我们之前将默认命名空间更改为.NET Framework项目,还记得吗?
确保修改SourceProjectDir变量以保存.NET Framework项目目录,并使用TargetProjectDir变量保存.NET Core项目目录。
接下来,我们想要在每次构建和运行.NET Core项目时调出.NET Framework可执行文件。在我们继续前进之前,首先构建整个解决方案。其次,右键单击.NET Framework项目并单击Properties,然后从左侧的选项卡中选择Build Events。在“ 预构建事件命令行 ”字段中,粘贴以下内容:
$(TargetPath)
最后,您可以从.NET Framework项目开始设计用户界面元素,并通过按Ctrl + Shift + B自动反映您对.NET Core项目的更改,然后运行!
使用代码
上面提供的代码本质上是一个反射器。它仅反映.NET Framework项目的.NET Framework项目的表单文件。您可以无限制地修改代码,使其按照您的意图执行操作。
兴趣点
Windows窗体设计器的便利性已被带回。无论您是计划在.NET Core下使用Windows Forms重新开始,还是迁移现有的基于.NET Framework的传统项目,您现在都可以轻松地继续这样做,而无需等待.NET Core 3.0的一般可用性。
在.NET Core 3.0 Preview上使用Windows窗体设计器的更多相关文章
- [翻译]用于.NET Core的Windows窗体设计器发布
本文由微信公众号<开发者精选资讯>翻译首发,转载请注明来源 今天我们很高兴地宣布,.NET Core项目的Windows窗体设计器现在可以在 Visual Studio 2019 16.6 ...
- 用VS Code体验调试.NET Core 2.0 Preview (传统三层架构)
准备工作 VS Code下载地址:https://vscode.cdn.azure.cn/stable/379d2efb5539b09112c793d3d9a413017d736f89/VSCodeS ...
- 【译】.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容
.NET Core 3.0 Preview 3已经推出,它包含了一系列关于ASP.NET Core的新的更新. 下面是该预览版的更新列表: Razor组件改进: 单项目模板 新的Razer扩展 E ...
- .NET Core 2.0 Preview 1发布下载和文档
.NET Core 2.0.0 Preview 1 发布于 2017 5.10. 你可以通过 Visual Studio 2017 Preview 15.3, Visual Studio for Ma ...
- asp.net core 1.1 项目升级至 asp.net core 2.0 preview 2 与正式版
这两天把一个 asp.net core 1.1 的项目迁移到了 asp.net core 2.0 preview 2 ,在这篇随笔中记录一下. 如果项目在有 global.json 文件,需要删除或修 ...
- ASP.NET Core 2.0 Preview 1 中贴心的新特性
西雅图时间5月10日,微软在 Build 2017 大会上发布了 ASP.NET Core 2.0 Preview 1 ( 详见 Announcing ASP.NET 2.0.0-Preview1 a ...
- .NET Core 3.0 Preview 5 亮点之一:发布单文件可执行程序
在阅读 Announcing .NET Core 3.0 Preview 5 时发现了 .NET Core 3.0 Preview 5 的一个新特性 —— Publishing Single EXEs ...
- 【译】宣告推出.NET Core 3.0 Preview 7(英雄的黎明)
今天,我们宣布推出.NET Core 3.0 Preview 7.我们已经从创建新特性阶段过渡到了完善版本阶段.对于其余的预览版,我们将把重点放在质量(改进)上. 在Windows,macOS和Lin ...
- [翻译] .NET Core 3.0 Preview 7 发布
原文: Announcing .NET Core 3.0 Preview 7 今天,我们宣布推出 .NET Core 3.0 Preview 7 .我们的工作已经从创建新功能过渡到打磨版本.预计剩余的 ...
随机推荐
- 深入理解JVM,类加载器
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流(即字节码)”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称 ...
- Spring MVC接口实例
概述 前文记录了MVC模式和Spring MVC的初步认识,现在记录创建一个项目,配置Spring MVC,编写接口程序. 创建项目 打开IntelliJ IDEA,点击"File-> ...
- 易优CMS:type的基础用法
[基础用法] 名称:type 功能:获取指定栏目信息 语法: {eyou:type typeid='栏目ID' empty='暂时没有数据'} <a href="{$field.typ ...
- JavaWeb之servlet(1)
servlet servlet:就是一个Java程序,运行在web服务器中,用于接收和响应客户端的http请求.更多是配合动态资源使用.当然静态资源也要使用servlet,只不过Tomcat里面已经定 ...
- centos7下通过yum方式安装docker环境
1.移除旧版本: yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ ...
- Linux下设置root密码
如下面的代码所示: sudo passwd [sudo] geeksong 的密码: 输入新的 UNIX 密码: 重新输入新的 UNIX 密码: passwd:已成功更新密码 更性的unix密码就是r ...
- 【LeetCode】58.最后一个单词的长度
最后一个单词的长度 给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例 ...
- mysql 之优化
# ### part1 : sql语句优化 # (1) mysql 执行流程 客户端: 发送链接请求,然后发送sql语句 服务端: 1.连接层: 提供和客户端链接的服务 show processlis ...
- ACM-单向链表的操作
数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出. 输入描述: 先输入键值对的个数然后输入成对的index和value值,以空格隔 ...
- 正睿暑期培训day1考试
链接 A 理解一下题意,然后玩几组样例就能发现,实际上就是\(k\)个\(i\)等价于\(1\)个\(i-1\).所以就类似于\(k\)进制进行进位,如果最后\(0\)位上不是\(0\),那么就存在划 ...