我创建了一个组件,我希望能够在组件托盘中进行编辑时更改其名称。我为 name 属性添加了 Designer 操作,但现在我被卡住了。
查看属性网格,我可以看到 name 属性带有括号,表明它不是常规属性。
这可能吗?
我创建了一个组件,我希望能够在组件托盘中进行编辑时更改其名称。我为 name 属性添加了 Designer 操作,但现在我被卡住了。
查看属性网格,我可以看到 name 属性带有括号,表明它不是常规属性。
这可能吗?
您可以Component
在设计时使用Component.Site.Name
. 您应该将代码放在 try/catch 块中,以便在名称重复时处理异常。
代码:
当您为组件实现设计器时,在设计时更改组件名称的手动代码是:
this.Component.Site.Name = "SomeName";
这是组件和组件设计器的完整实现。组件设计器有一个动词,当您右键单击组件时可以访问它,也可以从命令托盘中的属性网格访问它。当您单击Rename
命令时,它将组件的名称设置为SomeName
. 如果存在同名的组件,它还会显示错误消息。在更实际的示例中,您可以覆盖ActionLists
以让用户自己输入新名称。
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms.Design;
[Designer(typeof(MyComponentDesigner))]
public class MyComponent : Component
{
public string SomeProperty { get; set; }
}
public class MyComponentDesigner : ComponentDesigner
{
DesignerVerbCollection verbs;
public MyComponentDesigner() : base() { }
public override DesignerVerbCollection Verbs
{
get
{
if (verbs == null)
{
verbs = new DesignerVerbCollection();
verbs.Add(new DesignerVerb("Rename", (s, e) =>
{
try
{
this.Component.Site.Name = "SomeName";
this.RaiseComponentChanged(null, null, null);
}
catch (Exception ex)
{
var svc = ((IUIService)this.GetService(typeof(IUIService)));
svc.ShowError(ex);
}
}));
}
return verbs;
}
}
}
某些属性在设计环境中是特殊的,您只能通过类型描述符真正设置它们。这可能是名称的情况,但肯定是可见、锁定和启用之类的情况。也许这会给你一些现在看的东西。
SetHiddenValue(control, "Visible", false);
SetHiddenValue(control, "Locked", true);
SetHiddenValue(control, "Enabled", false);
/// <summary>
/// Sets the hidden value - these are held in the type descriptor properties.
/// </summary>
/// <param name="control">The control.</param>
/// <param name="name">The name.</param>
/// <param name="val">The val.</param>
private static void SetHiddenValue(Control control, string name, object val)
{
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(control)[name];
if (descriptor != null)
{
descriptor.SetValue(control, val);
}
}