专栏首页汪宇杰博客将 WinForms 应用从 .NET Core 3.0 升级到 3.1

将 WinForms 应用从 .NET Core 3.0 升级到 3.1

导语

我作为社区里的“拖控件之王”,拖控件贼心不死,有时候会维护一些老项目,其中包括一个2004年的WinForms 软件。9月份的时候我曾经将它迁移到了 .NET Core 3.0,因为代码实现完全没动,所以基本没领福报。然而 .NET Core 3.1 有一些升级上的变化,需要注意。

背景

这个 WinForms 工程是一个开源的屏幕尺工具,用于测量屏幕上元素的尺寸,由 Jeff Key 在 15 年前开发,至今好用。原作者不维护后,我将源代码接盘维护,继续开源在 GitHub上。

https://github.com/EdiWang/Ruler

虽然我自己也用UWP实现过类似的屏幕尺,公众号里也发文章介绍过《》,可惜后来,UWP这个技术……嗯,不提了,话说这把屏幕尺支持横竖两种排版、固顶显示、透明度调整等常用功能,大家有需要的话欢迎下载使用。

升级到.NET Core 3.1

这个工程最早是 .NET Framework 2.0 的,升级到 .NET Core 3.0 的步骤我不多介绍了,官网或社区都有详细的教程,由于功能简单,并不需要代码实现和逻辑上的修改。但是 .NET Core 3.1 移除了一些老控件,因此这次升级需要修改代码。

先来看看官方的说明:

Windows Forms Controls Removal

The following Windows Forms controls have been removed from .NET Core 3.1:

  • DataGrid
  • ToolBar
  • ContextMenu
  • Menu
  • MainMenu
  • MenuItem

These controls were replaced with more powerful controls in .NET Framework 2.0, back in 2005. They have not been available by default in the Visual Studio Designer Toolbox for many years. As a result, we decided to remove these controls and focus only on the new ones.

官方也给出了这些被删库的老控件的替换方案:

参见 https://devblogs.microsoft.com/dotnet/announcing-net-core-3-1/

在这个Ruler工程中,我需要迁移的主要就是菜单控件。

类型替换

ContextMenu 替换为 ContextMenuStrip

MenuItem 替换为 ToolStripMenuItem

如:

private readonly ContextMenu _menu = new ContextMenu();

private MenuItem _verticalMenuItem;

private MenuItem _toolTipMenuItem;

替换为

private readonly ContextMenuStrip _menu = new ContextMenuStrip();

private ToolStripMenuItem _verticalMenuItem;

private ToolStripMenuItem _toolTipMenuItem;

API 差异

Shortcut 枚举类型被删库,老代码:

private MenuItem AddMenuItem(string text, Shortcut shortcut = Shortcut.None)

{

MenuItem mi = new MenuItem(text);

mi.Click += MenuHandler;

mi.Shortcut = shortcut;

_menu.MenuItems.Add(mi);

return mi;

}

改为

Keys shortcut = Keys.None

...

mi.ShortcutKeys = shortcut;

类似的,MenuItems属性被删库,老代码:

_menu.MenuItems.Add(mi);

改为

_menu.Items.Add(mi);

这段函数升级后的完整代码:

private ToolStripMenuItem AddMenuItem(string text, Keys shortcut = Keys.None)

{

ToolStripMenuItem mi = new ToolStripMenuItem(text);

mi.Click += MenuHandler;

mi.ShortcutKeys = shortcut;

_menu.Items.Add(mi);

return mi;

}

在旧版Menu控件里,“-” 字符串代表分隔符,这个现在也有专门的类型表示,所以老代码:

AddMenuItem("-");

修改为

_menu.Items.Add(new ToolStripSeparator());

现在就能成功编译运行了,新版菜单控件效果如下:

至此,升级.NET Core 3.1的工作全部完成!

本文分享自微信公众号 - 汪宇杰博客(ediwangblog),作者:汪宇杰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 将传统 ASP.NET 应用迁移到 .NET Core

    现在越来越多的人在谈论. NET Core。诚然,.NET Core 是未来, 但是.NET Framework 仍在支持, 因为大量的应用程序无法在短时间内迁...

    Edi Wang
  • 译 | 介绍全新 Microsoft.Data.SqlClient

    本文由 SqlClient 和 SQL 服务器工具上的项目经理 Vicky Harp 撰写。

    Edi Wang
  • 实用帖 | 使用Visual Studio开发.NET Core推荐设置

    首先要搞清楚的一点是,并不是所有版本的Visual Studio都支持.NET Core开发,甚至2017的早期版本也不行。有些童鞋误以为只要安装了.NET C...

    Edi Wang
  • (码友推荐)2018-07-05 .NET及相关开发资讯速递

    4.High-Quality Code- Naming Classes, Interfaces, Enumerations

    Rector
  • .Net Core 会逆袭成为最受欢迎开发平台吗?

    最新.Net Core 热词霸占了各个技术热搜,看来微软近年来发布的 .Net Core 还是成功了引起了大家的热烈讨论。如果您对微软熟悉,肯定是很了解.Net...

    葡萄城控件
  • iOS-集成环信EaseUI报错(SDK版本 V3.2.3 2016-12-29)

    用户1890628
  • Android - ViewDragHelper实现京东、淘宝拖拽详情

    code_horse
  • 有关VIEWSTATE exploit在实战中的应用问题

    相信大家都晓得过 CVE-2020-0688 ,由于部署完Exchange Server后使用了硬编码的 Machine Key ,从而导致篡改 ASP.NET...

    字节脉搏实验室
  • 如何让程序真正地在后台运行?

    如何实现一个守护进程?如何让程序在后台运行?这是后台开发面试常问的一道题,那么守护进程到底是什么?又该如何实现?

    编程珠玑
  • CentOS 7 下安装部署.NET Core多版本环境

    .NET Core作为 .NET的开源版本,可以说是非常拥抱开源了,更新的力度也非常给力。却也从开源世界学了点坏东西,那就是:不再重视向下兼容(比如 .NET ...

    KenTalk

扫码关注云+社区

领取腾讯云代金券