3

良い一日!

古いコントロールを新しいコントロールに置き換える .vsix を作成しています。現在のデザイナー インスタンスである designerHost があります。次に、次のように変換を開始します。

 foreach (OldCombo oldCmbx in OldCmbxs())
 {
      ...
      NewCombo newCmbx = designerHost.CreateComponent(NewComboType, oldcmbx.Name) as NewCmbx;
      ...
      newCmbx.Visible = oldCmbx.Visible;
      ...
      designerHost.DestroyComponent(oldCmbx);
 }

designer.cs ファイルにどのように記述されていても、-oldCmbx常にです。Visible=true私は常にVisible=truenewCmbxを作成しています。newCmbx を強制的に にするとVisible=false、デザイナーは変換後に newCmbx を表示しませんが、visible プロパティはまだ true であるため、Visible プロパティは間違いなく私が探しているものではありません。では、newCmbx を強制的Visible=falseに designer.cs に入れるにはどうすればよいでしょうか?

4

1 に答える 1

1

.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.CreateComponentnewCmbx.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);
}
于 2012-11-01T10:52:21.620 に答える