zoukankan      html  css  js  c++  java
  • 在.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窗体设计器的限制,而无需等待其一般可用性。

    软件要求

    要继续阅读本文,您必须在系统上安装以下组件:

    1. Microsoft Visual Studio 2019 - 至少版本16.2.0
    2. .NET Core 3.0预览版7(截至编写本文时,将使用预览版7)

    克服限制

    证明问题

    1. 创建一个新的Windows窗体应用程序(.NET Core)。如果您看不到左侧的条目,请使用方便的“ 搜索模板”搜索框并键入“ Windows Forms App(.NET Core) ”。

      图1用于在.NET Core 3.0预览版上使用Windows窗体设计器

    2. 对于这个项目,我们将命名它DotNetCore.WinForms,但你可以任意命名,确保理解这个概念,你会很高兴。
    3. 如果没有进行任何更改,请尝试打开Form1.cs 文件,您应该看到类似的内容。请不要惊慌,这是正常行为,因为我们正在运行.NET Core 3.0的预览版本。我们稍后会解决这个问题。

      图2用于在.NET Core 3.0预览版上使用Windows窗体设计器

    此时,您开始感觉到在.NET Core 3.0预览下无法进行任何类型的用户界面设计。

    解决方案

    为了解决这个限制,我们可以使用一种方法,通过基于功能齐全的.NET Framework创建一个额外的Windows Forms项目,我们可以间接地利用.NET Core项目的设计。请继续直到最后。

    1. 右键单击解决方案名称,然后创建一个名为_TemporaryFixup的新解决方案文件夹

      图3用于在.NET Core 3.0预览版上使用Windows窗体设计器

    2. _TemporaryFixup解决方案文件夹下,创建一个新的Windows窗体应用程序(.NET Framework)项目。如果您看不到左侧的条目,请使用方便的“ 搜索模板 ”搜索框并键入“ Windows Forms App(.NET Framework) ”。

      图4用于在.NET Core 3.0预览版上使用Windows窗体设计器

    3. 对于这个项目,我们将命名为DotNetFramework.WinForms,但您可以将其命名为任何您喜欢的名称。
    4. 删除Form1.cs 文件。
    5. 右键单击该DotNetFramework.WinForms项目,然后单击“ 属性”
    6. 将默认命名空间更改为与.NET Core项目相同; 在我们的例子中,我们将其设置为DotNetCore.WinForms(将在几个中解释)
    7. 创建一个新表单并将其命名为您喜欢的任何名称。

    现在,让我们使用以下命令修改项目中的Program.cs文件DotNetFramework.WinForms

     1 using System;
     2 using System.IO;
     3 using System.Linq;
     4 
     5 namespace DotNetFramework.WinForms
     6 {
     7     static class Program
     8     {
     9         private static string SourceProjectDir = 
    10             @"C:Usersahmadsource
    eposDotNetCore.WinFormsDotNetFramework.WinForms";
    11         private static string TargetProjectDir = 
    12             @"C:Usersahmadsource
    eposDotNetCore.WinFormsDotNetCore.WinForms";
    13 
    14         [STAThread]
    15         static void Main()
    16         {
    17             var directory = new DirectoryInfo(SourceProjectDir);
    18 
    19             var srcFiles = directory.GetFiles("*.Designer.cs", SearchOption.AllDirectories);
    20 
    21             foreach (var srcFile in srcFiles)
    22             {
    23                 // Get the relative directory
    24                 var relativeDirectory = $"{srcFile.DirectoryName.Substring
    25                                 (SourceProjectDir.Length, 
    26                                 srcFile.DirectoryName.Length - SourceProjectDir.Length)}";
    27 
    28                 // Append the determined relative directory to the corresponding designer 
    29                 // & C# source files related to the form.
    30                 var designerFileName = $@"{relativeDirectory}{srcFile.Name}";
    31                 var noDesignerFileName = 
    32                   $@"{relativeDirectory}{srcFile.Name.Replace(".Designer", "")}";
    33 
    34                 var srcDesignerFile = $"{SourceProjectDir}{designerFileName}";
    35                 var srcNoDesignerFile = $"{SourceProjectDir}{noDesignerFileName}";
    36 
    37                 var dstDesignerFile = $"{TargetProjectDir}{designerFileName}";
    38                 var dstNoDesignerFile = $"{TargetProjectDir}{noDesignerFileName}";
    39 
    40                 // Create an array based on the relative location.
    41                 var dirs = relativeDirectory.Split('\').ToList();
    42 
    43                 // Keep track of where were we when we created a directory.
    44                 var currentDir = TargetProjectDir;
    45 
    46                 // Start creating the missing directories in our target project.
    47                 foreach (var dir in dirs)
    48                 {
    49                     currentDir = Path.Combine(currentDir, dir);
    50                     Directory.CreateDirectory(currentDir);
    51                 }
    52 
    53                 // Overwrite the file to the targeted project.
    54                 File.Copy(srcDesignerFile, dstDesignerFile, true);
    55 
    56                 // If our UI logic is unavailable, that means we've created 
    57                 // a new form from the source project.
    58                 // so we copy the form's UI logic code to the target project.
    59                 if (!File.Exists(dstNoDesignerFile) && File.Exists(srcNoDesignerFile))
    60                 {
    61                     File.Copy(srcNoDesignerFile, dstNoDesignerFile, false);
    62                 }
    63             }
    64         }
    65     }
    66 }

    由于我们专注于在.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在“ 预构建事件命令行 ”字段中,粘贴以下内容:

    1 $(TargetPath)

    最后,您可以从.NET Framework项目开始设计用户界面元素,并通过按Ctrl + Shift + B自动反映您对.NET Core项目的更改,然后运行!

    使用代码

    上面提供的代码本质上是一个反射器。它仅反映.NET Framework项目的.NET Framework项目的表单文件。您可以无限制地修改代码,使其按照您的意图执行操作。

    兴趣点

    Windows窗体设计器的便利性已被带回。无论您是计划在.NET Core下使用Windows Forms重新开始,还是迁移现有的基于.NET Framework的传统项目,您现在都可以轻松地继续这样做,而无需等待.NET Core 3.0的一般可用性。

     

  • 相关阅读:
    1、听说过Redis吗?它是什么?
    55、数据库高并发是我们经常会遇到的,你有什么好的解决方案吗?
    54、数据库如何保证持久性?
    53、数据库如何保证原子性?
    52、数据库如何保证一致性?
    注解定义、基本语法和属性
    Macbook 装机必备--开发篇
    http
    python:beaufiful
    python-yield
  • 原文地址:https://www.cnblogs.com/bisslot/p/11324914.html
Copyright © 2011-2022 走看看