在Visual Studio 2008中,
如果您创建一个表单并对其进行控制,则
您可以通过“属性”窗口编辑控件的属性。
某些控件可以通过其他方式更改其属性,
除了属性窗口。
看起来像这样:
似乎所有具有此窗格的控件都具有相同的样式,
这意味着它是Visual Studio提供的东西,
并且控制器的制造者只选择要包括在内的物品,
比如Fields,以及打开一些窗口的Clickable Links。
所以我的问题:
这个窗格控件的名称是什么,
以及如何创建一个?
答案 0 :(得分:2)
该菜单称为智能标记,您可以将智能标记添加到控件中。为此,您需要为控件创建自定义Designer
,并在设计器中覆盖其ActionLists
属性。
示例强>
假设我们创建了一个具有某些属性的控件,我们希望在智能标记窗口中显示out控件的以下属性:
public Color SomeColorProperty { get; set; }
public string[] Items { get; set; }
我们的预期结果是:
<强> MyControl 强>
这里我们使用Designer
属性来装饰控件以注册自定义设计器:
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using System.Windows.Forms.Design;
[Designer(typeof(MyControlDesigner))]
public partial class MyControl : UserControl
{
public MyControl()
{
InitializeComponent();
}
void InitializeComponent() { }
public Color SomeColorProperty { get; set; }
public string[] Items { get; set; }
}
<强> MyControlDesigner 强>
我们在此处覆盖ActionLists
并返回包含我们需要的操作列表项的新DesignerActionListCollection
:
public class MyControlDesigner : ControlDesigner
{
private DesignerActionListCollection actionList;
public override DesignerActionListCollection ActionLists
{
get
{
if (actionList == null)
actionList = new DesignerActionListCollection(new[] {
new MyControlActionList(this) });
return actionList;
}
}
}
<强> MyControlActionList 强>
这里我们创建获取/设置控件属性的属性。我们还创建了一些方法,负责显示某些属性的自定义编辑器或执行某些操作。然后通过覆盖GetSortedActionItems
:
public class MyControlActionList : DesignerActionList
{
ControlDesigner designer;
MyControl control;
public MyControlActionList(ControlDesigner designer) : base(designer.Component)
{
this.designer = designer;
control = (MyControl)designer.Control;
}
public Color SomeColorProperty
{
get { return control.SomeColorProperty; }
set {
TypeDescriptor.GetProperties(
(object)this.Component)["SomeColorProperty"]
.SetValue((object)this.Component, (object)value);
}
}
public void EditItems()
{
var editorServiceContext = typeof(ControlDesigner).Assembly.GetTypes()
.Where(x => x.Name == "EditorServiceContext").FirstOrDefault();
var editValue = editorServiceContext.GetMethod("EditValue",
System.Reflection.BindingFlags.Static |
System.Reflection.BindingFlags.Public);
editValue.Invoke(null, new object[] { designer, this.Component, "Items" });
}
public override DesignerActionItemCollection GetSortedActionItems()
{
return new DesignerActionItemCollection() {
new DesignerActionMethodItem(this, "EditItems", "Edit Items", true),
new DesignerActionPropertyItem("SomeColorProperty", "Some Color"),
};
}
}
有关此主题的更多信息,请查看this MSDN Walkthrough。
下载示例
您可以从以下存储库下载工作示例:
答案 1 :(得分:0)
这称为'DesignerActionList'或SmartTag。智能标签是类似菜单的用户界面(UI)元素,提供常用的设计时选项。
步骤:
您必须添加对设计时程序集System.Design.dll
的引用创建DesignerActionList类并获取构造函数中对control的引用。
public class MyControlTasks : System.ComponentModel.Design.DesignerActionList
{
private MyControl myControl;
private DesignerActionUIService designerActionUISvc = null;
public MyControlTasks( IComponent component ) : base(component)
{
this.myControl = component as MyControl;
this.designerActionUISvc =
GetService(typeof(DesignerActionUIService))
as DesignerActionUIService;
}
}
添加要与智能标记项关联的方法和属性
为控件
创建基础designerpublic interface IDesigner {
void Dispose();
void Initialize(IComponent component);
IComponent Component {
get;
}
}
返回您之前创建的MyControlTasks类的新实例。
public override DesignerActionListCollection ActionLists
{
get
{
var actionLists = new DesignerActionListCollection();
actionLists.Add(new MyControlTasks(this.Component));
return actionLists;
}
}