如何检测 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
事件。
我使用 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
事件。