我使用 C# Windows 窗体控件库创建了一个复合控件,当我在测试程序中使用新控件时,我想找到一种方法来检测新控件的名称在设计时何时更改,我该怎么办?
问问题
1052 次
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 回答