2013-07-25 30 views
1

我有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事件,讓它完全反序列化,然後設置我所需要的。但似乎在代碼非常繁瑣,性能會得到不必要設置兩次(或更多)等 基本上我不相信有沒有更好的解決方法:)

會很高興爲任何意見

+0

你落入一個標準的.NET陷阱,每一個程序員落入遲早的事。您的「大小」屬性返回該值的*副本*。因爲Size是一個值類型。分配Width屬性只會更新該副本。更加關注格倫的回答,他展示了設置它的正確方法。 –

+0

@Hans Passant&Glenn Cuevas: 你們倆的確是對的。大小類型是一個結構,其值不能改變我在上面的例子中的方式。 - 正如我寫的,雖然我的例子只是解釋,並沒有顯示我的真實代碼。我認爲這不是一個好方法(下次注意:)。 我編輯了OP示例以使其有意義。 - 雖然我的問題仍然存在,因爲問題仍然存在,如果我以正確的方式分配控件的屬性(在新示例中)。即我設置的房產價值不會增加。 – Riva

+0

那麼,你發現在SO問題中發佈虛假代碼總是一個非常糟糕的主意。發佈真實的代碼。 –

回答

2

更新答:

根據您的新代碼:

newFrame.Width = 50; 
newFrame.Height = 50; 

修改成:

newFrame.Size = new Size(50, 50); 

您會注意到該模式也用於位置。

原來的答案:

當改變控件的大小,你必須d新的大小可變的,因爲它是一個值類型。

你的代碼應該是:

newMyUserControl1.size = new Size(50, newMyUserControl1.size.Height); 

退房此鏈接:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.size.aspx

+0

我在OP中的例子只是一個例子來解釋我的方法在一個堅果,而不是我的確切代碼。無論如何,如果你看它,你會看到我沒有分配Size(結構),只是size.Width,一個int。所以如果我沒有錯過任何東西,我的例子其實是對的?無論如何,我怕你的答案不能解決我的問題。 – Riva

+0

除非我錯過了某些東西,否則您有一個名爲尺寸類型爲Size的公共成員。如果你看看我給你的鏈接,它有這樣的一段:「因爲Size類是一個值類型,它是通過值返回的,這意味着訪問該屬性返回控件大小的副本。所以,調整Width或從此屬性返回的大小的高度屬性不會影響控件的寬度或高度。要調整控件的寬度或高度,您必須設置控件的寬度或高度屬性,或者使用新大小設置大小屬性。 「 –

+0

對不起,我昨天累了,錯過了你的觀點。 你確實是對的。大小類型是一個結構,其值不能改變我在上面的例子中的方式。 - 正如我寫的,雖然我的例子只是解釋,並沒有顯示我的真實代碼。我認爲這不是一個好方法(下次注意:)。 我編輯了OP示例以使其有意義。 - 雖然我的問題仍然存在,因爲問題仍然存在,如果我以正確的方式分配控件的屬性。即我設置的房產價值不會增加。 – Riva

相關問題