.NET 7跨平台场景下System.Windows.Forms的替代方案咨询
从.NET Framework迁移到.NET 7后,因项目需要跨平台,无法在.csproj中添加以下配置(会限制项目仅支持Windows):
<UseWindowsForms>true</UseWindowsForms> <ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
此前项目依赖System.Windows.Forms.Design中的PropertyTab类,重写了Bitmap、TabName属性及GetProperties方法,现寻求微软官方的跨平台替代方案。
微软没有直接提供跨平台的PropertyTab替代组件——因为PropertyTab是Windows Forms专属的设计时类型,属于Windows桌面特有的设计器体系,没有跨平台等价物。以下是可行的替代思路:
1. 拆分设计时与运行时代码
如果LocalisedPropertyTab仅用于设计时(比如自定义Visual Studio中PropertyGrid的标签),可以把这部分代码单独放到一个Windows专属类库中,给该类库添加WindowsForms配置。主项目保持跨平台,仅在设计环境中引用这个类库,运行时不依赖它。
2. 改用跨平台的属性逻辑实现
如果需要在运行时实现类似的属性自定义/分组功能:
- 基于
.NET 内置的System.ComponentModel类库(比如PropertyDescriptor、TypeConverter、CategoryAttribute)实现,这些类型是完全跨平台的。可以通过自定义属性、类型转换器来实现属性的本地化、分组等逻辑,不需要依赖Windows Forms的设计器类型。 - 若需要UI层面的属性网格展示,微软的MAUI框架或社区维护的Avalonia等跨平台UI库有各自的属性网格组件,但需要适配对应框架的API,没有直接对应
PropertyTab的类。
3. 跨平台IDE的设计时替代方案
如果是在VS Code等跨平台IDE中需要设计时支持,微软目前没有跨平台的设计器体系对应PropertyTab的功能,建议改用基于Roslyn的代码分析工具或自定义脚本,实现类似的属性自定义逻辑。
可以重构代码,仅使用跨平台的System.ComponentModel类型实现核心逻辑:
using System; using System.ComponentModel; using System.Reflection; namespace MARKEM.LocalisationServices { /// <summary> /// 本地化属性处理类,跨平台兼容 /// </summary> public class LocalisedPropertyProvider { private readonly string _groupName; public LocalisedPropertyProvider(string groupName) { _groupName = groupName; } /// <summary> /// 获取经过本地化处理的属性集合 /// </summary> public PropertyDescriptorCollection GetProperties(object component, Attribute[] attrs) { // 这里迁移原GetProperties中的逻辑,仅使用System.ComponentModel类型 var rawProperties = TypeDescriptor.GetProperties(component, attrs); // 添加你的本地化过滤、排序等逻辑 return rawProperties; } } }
注意:如果需要处理位图,.NET 6+非Windows平台中System.Drawing.Common已被标记为过时,建议使用SkiaSharp等跨平台图形库替代。
内容的提问来源于stack exchange,提问作者Saurav joshi

