2016-04-07 11 views
2

カスタムコンテナをUserControlとして作成しようとしています。コンテナUserControl - コントロールの追加と修正

私の目標:デザイナーの内部でコントロールをドラッグし、自分のコントロールのコード内に入ってくるコントロールを処理できるようにします。

例:私は自分のコンテナをどこかに置き、ボタンを追加します。このモーメントでは、私のユーザコントロールがこのボタンの幅と位置を自動的に調整したいと思っています。それは私がついたポイントです。

マイコード:

[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))] 
public partial class ContactList : UserControl 
{ 
    public ContactList() 
    { 
     InitializeComponent(); 
    }   

    private void ContactList_ControlAdded(object sender, ControlEventArgs e) 
    { 
     e.Control.Width = 200; // Nothing happens 
     e.Control.Height = 100; // Nothing happens 

     MessageBox.Show("Test"); // Firing when adding a control 
    } 
} 

enter image description here

enter image description here

MessageBoxがうまく機能しています。セットwidthheightは無視されます。
質問は「なぜですか?」です。ボタンを配置し、ボタンは200x100にリサイズされますF6で再コンパイルするとき、私はただ、気づいた


EDIT。配置時にこれがなぜ機能しないのですか?

つまり、FlowLayoutPanelは、追加したコントロールを右に置くと処理されます。それは、正確な行動を探しています。使用

enter image description here

+1

https://msdn.microsoft.com/en-us/library/system.componentmodel.design.icomponentchangeservice%28v=vs.110%29.aspx –

+0

あなたのコードの主な問題は、それはdoesnのサイズを適用しないでください。サイズを適用するには、 'BeginInvoke'を使用してサイズを設定する必要があります。 –

答えて

1

あなたは、コンテナ上のコントロールをドロップすると、あなたはOnControlAddedでいくつかのプロパティを設定したいときは、このようなサイズの、BeginInvokeを使用してプロパティを設定する必要があり、あなたのコードを修正するに

をOnControlAddedコントロールは変更されますが、サイズハンドルは更新されません。デザイナを更新するには、IComponentChangeService.OnComponentChangedを使用して、コントロールのサイズの変更についてデザイナーに通知する必要があります。

次のコードは、コンテナにコントロールを追加した場合にのみ実行されます。その後、サイズグラブハンドルを使ってコントロールに設定したサイズに従います。設計時に初期化するのに適しています。

protected override void OnControlAdded(ControlEventArgs e) 
{ 
    base.OnControlAdded(e); 
    if (this.IsHandleCreated) 
    { 
     base.BeginInvoke(new Action(() => 
     { 
      e.Control.Size = new Size(100, 100); 
      var svc = this.GetService(typeof(IComponentChangeService)) 
          as IComponentChangeService; 
      if (svc != null) 
       svc.OnComponentChanged(e.Control, 
        TypeDescriptor.GetProperties(e.Control)["Size"], null, null); 
     })); 
    } 
} 
+0

@HansPassantが最初のコメントに投稿したmsdnの例を取り上げました。このアンサーはそれに近いです。 https://msdn.microsoft.com/en-us/library/system.componentmodel.design.icomponentchangeservice%28v=vs.110%29。aspx – C4u

+0

'BeginInvoke'を使用しないと、' Width'と 'Height'では動作しませんが、' Dock'のようなプロパティでは 'BeginInvoke'なしで動作します。これはおそらく' BeginInvokeデザイナーがコントロールによって提供されるデフォルトのサイズを設定してから、それが私たちの提供された値を置き換える前ですが、 'BeginInvoke'を使って、親にコントロールを追加するタスクを終えた後、提供された値を使います。 –

+0

注目していただきありがとうございます。病気は数分後に確認してポストバックします。 – C4u

関連する問題