保持控制';s的默认属性不包含在设计时间序列中

本文关键字:包含 时间序列 属性 默认 控制 | 更新日期: 2023-09-27 18:25:01

我有UserControl,一半在VS Designer中创建,一半在代码中创建。我想从代码中创建这个UserControl的新实例,但每次都将它的一些默认属性设置为不同的值
示例(编辑w真实代码):

// 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值覆盖。我没有找到任何关于创建Designer创建的控件如何工作的信息,所以这当然只是我的猜测。

我的问题是,如何避开它可能有一些简单的方法。

我尝试过的东西:

1-在我的UserControl代码中:

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

从设计时间序列中删除标准特性。但是(编译器说)我只是隐藏了现有的标准属性。另外,它当然不起作用。我还是一个初学者。NET,所以也许我只是做错了?

2-我想我可以订阅每个新控件的(on)Load事件,让它完全反序列化,然后设置我需要的内容。但它在代码中似乎非常麻烦,属性将被不必要地设置两次(或更多)等等。基本上,我认为没有比这更优雅的解决方案了:)

如有任何建议,我们将不胜感激。

保持控制';s的默认属性不包含在设计时间序列中

更新答案:

基于您的新代码:

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

将其更改为:

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

您会注意到该模式也被用于Location。

原始答案:

当更改控件的大小时,您必须创建一个新的size变量,因为它是一个值类型。

您的代码应该是:

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

查看此链接:

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