[英]How to detect C# control name changed?
我使用C#Windows窗體控件庫創建了一個復合控件,當我在測試程序中使用新控件時,我想找到一種方法來檢測新控件的名稱何時在設計時更改了,我該怎么辦?
您可以像下面的示例一樣使用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
事件。
沒有事件“ OnNameChanged”,並且名稱屬性本身不是虛擬的,因此不能重寫...恐怕,沒有確定的方法...
一些建議:
使用“ new”定義您自己的Name-Property,但是繼承的類將不會自動取代它,更糟糕的是,對Control的強制轉換和Control.Name的用法將僅在您的屬性范圍內起作用...
定義一個虛擬的“ MyName”屬性,並將其僅用於寫入控件的Name-Property。 仍然會繞過Control.Name的調用,但是至少您可以強制使用MyName ...
在構造函數中添加名稱,並定義一個Timer,以便在發生某些更改時可以正常查看
我必須共同承認,我不會使用其中任何一個...我不知道您到底想實現什么,但是我會嘗試找到一種不同的方法來實現這一目標...
public MyControl : UserControl
{
public new string Name
{
get { return base.Name; }
set
{
base.Name = value;
// handle the name change here....
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.