我使用C#Windows窗体控件库创建了一个复合控件,当我在测试程序中使用新控件时,我想找到一种方法来检测新控件的名称何时在设计时更改,我应该怎么做?
答案 0 :(得分:2)
您可以使用此示例中的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
事件。
答案 1 :(得分:0)
没有“OnNameChanged”事件,而且Name-Property本身不是虚拟的,因此无法覆盖......我担心,没有确定的方法......
一些建议:
用“new”定义你自己的Name-Property,但是继承的类不会自动超过这个 - 更糟糕的是 - 强制转换为控制和使用Control.Name只会解决你的属性...
定义一个虚拟的“MyName”-Property并仅使用它来写入Control的Name-Property。仍然会对Control.Name进行调用,但至少可以强制使用MyName ...
在构造函数中缓冲Name并定义一个Timer,以便在某些内容发生更改时正常显示
总而言之,我必须承认,我不会使用其中任何一种......我不知道你想要达到的目标,但我会尝试找到一种不同的方法来达到这个目标......
答案 2 :(得分:-1)
public MyControl : UserControl
{
public new string Name
{
get { return base.Name; }
set
{
base.Name = value;
// handle the name change here....
}
}
}