1

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

我的问题是,如何绕过它?可能是一些简单的方法。

我尝试过的事情:

1-在我的用户控制代码中:

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

..从设计时序列化中删除标准属性。但是(编译器说)我只是隐藏了现有的标准属性。加上它当然不起作用。我仍然是 c# & .NET 的初学者,所以也许我做错了?

2-我想我可以订阅每个新控件的 (on)Load 事件,让它完全反序列化,然后设置我需要的。但是代码看起来很麻烦,属性将不必要地设置两次(或更多)等。基本上我不相信没有更优雅的解决方案:)

很高兴有任何建议

4

1 回答 1

2

更新答案:

根据您的新代码:

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

于 2013-07-25T18:37:42.823 回答