2017-09-17 67 views
1

中的屬性「名稱」我想實現Component中的屬性Name,該值與表單中指向組件的字段名稱具有相同的值。С#WinForms。實現組件

private MyComponent myComponent1; 
this.myComponent1.Name = "myComponent1"; 

的WinForms已經Control類實現這樣的屬性,但我不明白它是如何工作的。

private System.Windows.Forms.Button button1; 
this.button1.Name = "button1"; 

我想在MyComponentDesigner中聲明私有字符串Name屬性。 或在IComponentChangeService服務中使用ComponentRename事件。 探索WinForms的源代碼並沒有給出確切的解釋。

回答

1

如果您只想在屬性網格中顯示一個簡單的Name屬性,那麼爲您的組件添加一個微不足道的自動獲取集Name屬性就足夠了。但是,如果你希望你的組件有Name屬性和(Name)財物的行爲像控制(Name)屬性添加Name屬性是這樣的:

string name; 
[Browsable(false)] 
public string Name 
{ 
    get 
    { 
     if (Site != null) 
      name = Site.Name; 
     return name; 
    } 
    set 
    { 
     if (Site != null) 
      Site.Name = value; 
     name = value; 
    } 
} 

這樣,您就可以獲取或使用代碼設置Name財產或財產格。在屬性網格中,當您將值分配給(Name)時,它將分配Name屬性,並且設計器也會生成組件名稱分配。

+0

謝謝你Reza。 它按預期工作。 屬性名稱由指向myComponent的字段的名稱分配。 但是,你能解釋一下爲什麼這會起作用,或者給出一個解釋它的鏈接。 對我來說,它看起來像一個魔法代碼。 我試圖通過調試devenv.exe來調試Names.Set方法。但似乎Names.Set從未在設計時被調用過。 – DmitryB

+0

不客氣:) Windows窗體中的實現基於'Control'的'Name'屬性,'Control'的'Name'屬性和'ControlDesigner'的'PrefilterProperties'方法。我沒有嘗試實現整個模式,但試圖提供一個更簡單的實現,爲我工作。在我的實現中,private'name'字段可以幫助你的組件在運行時擁有名字(如果你可以創建Component而不將容器傳遞給它的構造函數)。同樣設置「Site.Name」可以使設計時所需的行爲與Control類具有相同的行爲。 –

+0

它變得更加清晰,但並不完全。 主要工作是在Name.get方法中完成的。 當VS在代碼 中實現Name方法並從Name屬性獲取值時。 在設計時的網站! = null,那麼代碼名稱= Site.Name將起作用; Site.Name是指向組件的字段的實際屬性名稱。 因此,代碼將被寫下 this.myComponent1.Name = VS.myComponent1.Name.get(return Site.Name)=「myComponent1」; – DmitryB