将 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的工作全部完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值