簡體   English   中英

避免將Control的默認屬性包含在設計時序列化中

[英]Keep Control's default property from being included into Design-time serialisation

我有UserControl,在VS Designer中創建了一半,在代碼中創建了一半。 我想通過代碼創建此UserControl的新實例,但每次都將其某些默認屬性設置為不同的值。
示例(用真實代碼編輯):

// 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-在我的UserControl代碼中:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public Size size;

..從設計時序列化中刪除標准屬性。 但是(編譯器說)我只是隱藏現有的標准屬性。 加上它當然是行不通的。 我仍然是C#和.NET的初學者,所以也許我只是做錯了?

2-我想我可以訂閱每個新控件的(on)Load事件,讓它完全反序列化,然后設置我需要的內容。 但是在代碼中看起來非常麻煩,屬性將被不必要地設置兩次(或更多),等等。基本上我不相信沒有更優雅的解決方案了:)

任何建議都會很高興

更新的答案:

根據您的新代碼:

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

更改為:

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

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

原始答案:

更改控件的大小時,您必須設置一個新的Size變量,因為它是一個值類型。

您的代碼應為:

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

查看此鏈接:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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