.NET ソース コードを掘り下げた後、.NETのControlDesignerシャドウVisibleプロパティであることがわかりました。そのControlため、シリアル化/逆シリアル化される内容は、ControlInitializeComponentの実際のプロパティとはかけ離れています。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)forControl.Visibleは常にfalse、新しく作成されたコントロールの場合です。
Designer.Visible財産:
private bool Visible
{
get
{
return (bool) base.ShadowProperties["Visible"];
}
set
{
base.ShadowProperties["Visible"] = value;
}
}
のDesigner.PreFilterProperties()実際のVisibleプロパティでは、設計者のプロパティControlによって影が付けられます。Visible
今、デザイナーが初期化されているとき(コンポーネントを作成しているときに起こっている私のコードではdesignerHost.CreateComponent)newCmbx.Visibleは常にtrueです。
なぜそうなのですか?Visibleのプロパティがコントロールの描画に使用されるためControl(デザイナー サーフェイスでも)。私が設定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);
}