【问题标题】:Is it possible to change a component name in a component designer in WinForms .Net是否可以在 WinForms .Net 的组件设计器中更改组件名称
【发布时间】:2010-01-08 13:26:18
【问题描述】:

我创建了一个组件,我希望能够在组件托盘中进行编辑时更改其名称。 我为 name 属性添加了 Designer 操作,但现在我卡住了。

查看属性网格,可以看到name属性是带括号的,说明它不是常规属性。

这可能吗?

【问题讨论】:

  • 您想更改控件的名称吗?有一个为什么你需要这样做的例子吗?可能有一个更简单的解决方案,而不是按照这些思路思考。
  • 我的组件是用于增强消息框控件的皮肤\主题。如果我从托盘中设计一个新皮肤,最好在同一个地方命名它,比如“Office Style”,而不必转到属性网格。

标签: c# .net vb.net winforms windows-forms-designer


【解决方案1】:

您可以在设计时使用Component.Site.Name 更改Component 的名称。您应该将代码放在 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;
        }
    }
}

【讨论】:

    【解决方案2】:

    某些属性在设计环境中是特殊的,您只能通过类型描述符真正设置它们。这可能是名称的情况,但肯定是可见、锁定和启用之类的情况。也许这会给你一些东西来看看。

    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);
            }
        }
    

    【讨论】:

    • 这个答案表明对 OP 的问题缺乏理解,并提供了一个不合适的解决方案。 Reza 的回答是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2023-03-16
    • 2011-01-22
    • 2011-01-01
    相关资源
    最近更新 更多