我有UserControl,在VS Designer中創建了一半,在代碼中創建了一半。 我想從代碼創建此UserControl的新實例,但每次都將它的一些默認屬性設置爲不同的值。
例(編輯w爲實碼):Keep Control的默認屬性不包含在設計時序列化中
// in my Main Form..
var newFrame = new RPictureFrame(); // my UserControl
newFrame.Width = 50;
newFrame.Height = 50;
newFrame.Location = new Point(0,0);
this.Controls.Add(newFrame);
newFrame = new RPictureFrame();
newFrame.Width = 200;
newFrame.Height = 400;
newFrame.Location = new Point(0,150);
this.Controls.Add(newFrame);
原始錯誤例如:
var newMyUserControl1 = new MyUserControl();
newMyUserControl1.size.Width = 50;
var newMyUserControl2 = new MyUserControl();
newMyUserControl2.size.Width = 200;
什麼雖然有時會發生創建控件的新實例之後是我設置的新的價值似乎被忽略。
我唯一的解釋是,由於我的UserControl是在Designer中設計的,所以它的所有默認屬性實際上都保持在.resx文件(?)中的序列化。當我在運行時創建新實例時,反序列化在單獨的線程中啓動(我無法控制)。當我在將某些屬性設置爲反序列化之前意外設置某些屬性時,我的價值會被隨後的ser'd值覆蓋。 我沒有找到任何關於Designer創建的控件如何創建的信息,所以這當然只是我的猜測。
我的問題是,如何解決它?可能有一些簡單的方法。
我嘗試的事情:
1-在我的用戶代碼:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Size size;
..to要從設計時序列化的標準屬性。 但(編譯器說)我只隱藏現有的標準屬性。 加上它當然不起作用。 我還是一個初學者在c#& .NET所以也許我只是做錯了嗎?
2-我認爲我可以訂閱每個新控件的(上)Load事件,讓它完全反序列化,然後設置我所需要的。但似乎在代碼非常繁瑣,性能會得到不必要設置兩次(或更多)等 基本上我不相信有沒有更好的解決方法:)
會很高興爲任何意見
你落入一個標準的.NET陷阱,每一個程序員落入遲早的事。您的「大小」屬性返回該值的*副本*。因爲Size是一個值類型。分配Width屬性只會更新該副本。更加關注格倫的回答,他展示了設置它的正確方法。 –
@Hans Passant&Glenn Cuevas: 你們倆的確是對的。大小類型是一個結構,其值不能改變我在上面的例子中的方式。 - 正如我寫的,雖然我的例子只是解釋,並沒有顯示我的真實代碼。我認爲這不是一個好方法(下次注意:)。 我編輯了OP示例以使其有意義。 - 雖然我的問題仍然存在,因爲問題仍然存在,如果我以正確的方式分配控件的屬性(在新示例中)。即我設置的房產價值不會增加。 – Riva
那麼,你發現在SO問題中發佈虛假代碼總是一個非常糟糕的主意。發佈真實的代碼。 –