我正在寻找一个自定义的 ContextMenu 项目,它仅由一个包含标签和组合框的 FlowLayoutPanel 组成。我希望能够在设计时在 Visual Studio 2013 的设计器中访问我的自定义控件的属性和事件。我希望能够在 MenuStrip、ToolStripMenuItem 或 ContextMenu 中使用我的自定义控件。我的实际问题是,如果我将控件直接插入到 MenuStrip 中,一切正常,但当控件位于 ToolStripMenuItem 或 ContextMenu 中时,我无法访问控件的属性窗口。属性窗口全是白色的,并且设计器中的控件出现故障。
所以这是我的代码(我还没有实现任何属性或任何事件,但无论如何我应该可以在属性窗口中访问继承的属性和事件。事实上,当我将控件插入到 MenuStrip 而不是在另一个二。)
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace CustomControlLib
{
[ToolStripItemDesignerAvailabilityAttribute(ToolStripItemDesignerAvailability.MenuStrip | ToolStripItemDesignerAvailability.ToolStrip | ToolStripItemDesignerAvailability.ContextMenuStrip)]
public class LblCboxStripControl : ToolStripControlHost
{
private Label controlName;
private ComboBox controlComboBox;
private FlowLayoutPanel controlPanel;
public LblCboxStripControl()
: base(CreateControlInstance())
{
controlPanel = (FlowLayoutPanel)base.Control;
controlPanel.AutoSize = true;
controlPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
controlPanel.BackColor = Color.Transparent;
controlName = new Label();
controlName.BackColor = Color.Transparent;
controlName.AutoSize = true;
controlName.Dock = DockStyle.None;
controlName.Text = "Control name";
controlComboBox = new ComboBox();
controlPanel.Controls.Add(controlName);
controlPanel.Controls.Add(controlComboBox);
}
public static FlowLayoutPanel CreateControlInstance()
{
FlowLayoutPanel flp = new FlowLayoutPanel();
return flp;
}
}
}
我在这里看到过类似的帖子: .NET Custom Control (ToolStripControlHost) Wreaks Havoc on Designer
但唯一的解决方案是创建一个继承自 ToolStripControlHost 并提供不带参数的构造函数的类,这根本不能解决我的问题。我还尝试创建新的空项目,重新启动 VS 并将类放入表单项目或外部库中也不能解决它。我还要补充一点,Form.designer 文件中没有什么不寻常的地方。