如何检测 C# 控件名称更改?

How to detect C# control name changed?

我使用 C# 创建了一个复合控件 Windows Forms 控件库,当我在测试程序中使用新控件时,我想找到一种方法来检测新控件的名称在设计时何时更改时间,我该怎么办?

没有事件 "OnNameChanged" 并且 Name-Property 本身不是虚拟的,因此不可覆盖...恐怕没有确定的方法...

一些建议:

  • 用 "new" 定义您自己的 Name-Property,但继承的 类 不会自动超越它,而且 - 更糟糕的是 - 强制转换为 Control 并使用 Control.Name 将围绕您的 属性...

  • 定义一个虚拟 "MyName"-属性 并仅使用它写入控件的 Name-Property。对 Control.Name 的调用仍然会飞过,但至少你可以强制使用 MyName...

  • 在你的构造函数中填充 Name 并定义一个 Timer 以在发生变化时定期查看

总而言之,我必须承认,我不会使用这些中的任何一个...我不知道你到底想达到什么目的,但我会尝试找到一种不同的方法来实现这个目标...

public MyControl : UserControl
{
     public new string Name 
     {
         get  { return base.Name; }

         set  
         {
            base.Name = value;

            // handle the name change here....
         }
    }

}

您可以像本例中那样使用 IComponentChangeService(在 System.ComponentModel.Design 中):

public class MyControl : UserControl
{
    public event EventHandler NameChanged;
    protected virtual void OnNameChanged()
    {
        EventHandler handler = NameChanged;
        if (handler != null) handler(this, EventArgs.Empty);
    }

    protected override void OnCreateControl()
    {
        base.OnCreateControl();

        IComponentChangeService changeService = (IComponentChangeService)GetService(typeof(IComponentChangeService));
        if (changeService == null) return; // not provided at runtime, only design mode

        changeService.ComponentChanged -= OnComponentChanged; // to avoid multiple subscriptions
        changeService.ComponentChanged += OnComponentChanged;
    }

    private void OnComponentChanged(object sender, ComponentChangedEventArgs e)
    {
        if (e.Component == this && e.Member.Name == "Name")
            OnNameChanged();            
    }
}

此服务仅在设计模式下提供,不在运行时提供。
我取消订阅并再次订阅 ComponentChanged 事件(以避免多次订阅)。

在事件处理程序中 OnComponentChanged 我检查我的名字是否已更改并引发 NameChanged 事件。