簡體   English   中英

如何檢測C#控件名稱更改?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM