通過.NET源代碼挖後我發現,ControlDesigner
被遮蔽的Control
的Visible
屬性,所以什麼事情序列化/反序列化在InitializeComponent
遠未控制的實際Visible
物業相關。
Designer.Visible
屬性初始化這樣的:
public override void Initialize(IComponent component)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(component.GetType());
PropertyDescriptor descriptor = properties["Visible"];
if (((descriptor == null) || (descriptor.PropertyType != typeof(bool))) || !descriptor.ShouldSerializeValue(component))
{
this.Visible = true;
}
else
{
this.Visible = (bool) descriptor.GetValue(component);
}
...
}
descriptor.ShouldSerializeValue(component)
爲Control.Visible
總是false
在新創建的控制的情況下。
Designer.Visible
屬性:
private bool Visible
{
get
{
return (bool) base.ShadowProperties["Visible"];
}
set
{
base.ShadowProperties["Visible"] = value;
}
}
在Control
的Designer.PreFilterProperties()
實際Visible
屬性是由設計師Visible
財產陰影。
現在,當設計師初始化時(在我創建組件designerHost.CreateComponent
時發生的代碼中)newCmbx.Visible
始終爲true
。
爲什麼是這樣?因爲Control
的Visible
屬性用於控件的繪製(也在設計器表面上)。如果我設置了newCmbx.Visible = false
,它只是從設計表面消失(但仍然從設計器的Visible
序列化) - 這很糟糕,所以通過Control
類的設計,當Control
被實例化時,它始終是Visible
,以便它可以可見在設計表面上。任何後續更改Visible
屬性影響Visible
設計者的財產,而不是控制自己(在設計師模式下工作的情況下)。
所以,我需要的是爲了解決這個問題是Visible
設計師的財產。
正確的代碼如下所示:
foreach (OldCombo oldCmbx in OldCmbxs())
{
bool _visible = GetVisiblePropThroughReflection(designerHost.GetDesigner(oldCmbx));
...
NewCombo newCmbx = designerHost.CreateComponent(NewComboType, oldcmbx.Name) as NewCmbx;
...
SetVisiblePropThroughReflection(designerHost.GetDesigner(newCmbx), _visible);
...
designerHost.DestroyComponent(oldCmbx);
}