我需要使用 .net 库版本 6.0 下的组件创建 WinForms 项目。但是当我创建项目和 ControlLibrary 时,Visual Studio 窗体设计器不使用 ControlDesigners
我需要使用 .net 库版本 6.0 下的组件创建 WinForms 项目。但是当我创建项目和 ControlLibrary 时,Visual Studio 窗体设计器不使用 ControlLibrary 中的 ControlDesigners,即使我正确地将设计器绑定到组件。
[Designer(typeof(MyControlDesigner))]
[ToolboxItem(true)]
public class MyControl : Control
{
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.FillRectangle(SystemBrushes.Info, new Rectangle(0, 0, Width, Height));
e.Graphics.DrawString("MyControl", Font, SystemBrushes.InfoText, new PointF(0, 0));
}
}
我已经创建了一些 ActionLists 但它们在设计时没有显示在组件中。
namespace WinFormsControlLibrary1
{
internal class MyControlDesigner : ControlDesigner
{
private DesignerActionListCollection actionLists;
public override DesignerActionListCollection ActionLists
{
get
{
if (actionLists == null)
{
actionLists = new DesignerActionListCollection();
actionLists.Add(new DataAxisGridActionList(Component));
actionLists.AddRange(base.ActionLists);
}
return actionLists;
}
}
}
public class DataAxisGridActionList : DesignerActionList
{
public DataAxisGridActionList(IComponent component) : base(component)
{
}
public override DesignerActionItemCollection GetSortedActionItems()
{
DesignerActionItemCollection items = new DesignerActionItemCollection();
items.Add(new DesignerActionMethodItem(this, "Action1", " Action 1", true));
items.Add(new DesignerActionMethodItem(this, "Action2", "Action 2", true));
return items;
}
public void Action1()
{
MessageBox.Show("Action 1");
}
public void Action2()
{
MessageBox.Show("Action 2");
}
}
}
为了测试,我在 .NET Framework 4.7.2 下创建了一个类似的项目和库,设计器在那里运行正常。
我还附加了演示项目的链接。
https://github.com/dmitrybv/WinForms-Net5-Designers
https://github.com/dmitrybv/WinForms-Net-Framework-4.7.2-Designers
目前,鉴于 WinForms Designer 的新进程外架构中设计时支持性质尚未完全确定,可能更简单的解决方案是安装 WinForms Designer 扩展 SDK。
它可通过 NuGet 包管理器获取,使用名称: Microsoft.WinForms.Designer.SDK
或者粘贴到程序包管理器控制台中:
NuGet\Install-Package Microsoft.WinForms.Designer.SDK -Version 1.6.0
的 <ItemGroup>
项目配置文件中 <PackageReference>
(或创建一个新的):
<PackageReference Include="Microsoft.WinForms.Designer.SDK" Version="1.6.0" />
关于 Designer 支持的当前状态的描述可以在这里找到:
.NET 应用程序的 Windows 窗体设计器的状态
和 ControlDesigner
的代码文件中添加所需的使用指令 DocumentDesigner
:
using Microsoft.DotNet.DesignTools.Designers;
对于可以接收命中测试和绘制消息的行为服务和装饰器(字形):
using Microsoft.DotNet.DesignTools.Designers.Behaviors