0

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

4

3 回答 3

2

您可以在此示例中使用IComponentChangeService(in ) :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事件。

于 2016-01-20T08:11:20.713 回答
0

没有事件“OnNameChanged”并且名称属性本身不是虚拟的,因此不可覆盖......恐怕,没有确定的方法......

一些建议:

  • 用“new”定义你自己的 Name-Property,但继承的类不会自动超越它,更糟糕的是,强制转换为 Control 和 Control.Name 的使用只会围绕你的属性工作......

  • 定义一个虚拟的“MyName”-Property,并仅使用它来写入控件的 Name-Property。仍然会调用 Control.Name,但至少您可以强制使用 MyName...

  • 在您的构造函数中添加名称并定义一个 Timer 以在某些情况发生变化时定期查看

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

于 2016-01-20T08:07:27.003 回答
-1
public MyControl : UserControl
{
     public new string Name 
     {
         get  { return base.Name; }

         set  
         {
            base.Name = value;

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

}
于 2016-01-20T08:08:42.927 回答