1

フォームに表示されたイベントの後にコントロールを追加しています。私が電話したにもかかわらず、コントロールは一度に1つずつ表示されSuspendLayout()ます。レイアウトを一時停止して、コントロールがすべてロードが完了したときにのみ表示されるようにするにはどうすればよいですか?

 public partial class ControlCreateTest : Form
{
    public ControlCreateTest()
    {
        InitializeComponent();       
    }

    private void AsyncControlCreateTest_Shown(object sender, EventArgs e)
    {
        CreateControls();
    } 

    private void CreateControls()
    {
        SuspendLayout();
        int startPoint= 0;            
        for (int i = 0; i < 4; i++)
        {          
            UserControl control = new UserControl() { Text = i.ToString(), Height = 100, Width = 100 };
            control.Load += control_Load;
            Controls.Add(control);
            control.Top = startPoint;
            startPoint += control.Height;
        }

        ResumeLayout();
        Text = "Loading complete";
    }

    void control_Load(object sender, EventArgs e)
    {
        Thread.Sleep(500);
        RichTextBox newRichTextBox = new RichTextBox() { Height = 100, Width = 100 };
        UserControl control = sender as UserControl;
        control.Controls.Add(newRichTextBox);
        newRichTextBox.Text = "loaded";
    }     
}

更新
これらのフォームの読み込みが開始されると、可視性と一時停止の呼び出しがすぐにウィンドウからスローされるようです。Loadイベントが長時間実行されている場合、これは非常に厄介です。

4

2 に答える 2

1

開発者のあいまいさに少しハッキングされWinformsます。とにかく...コンストラクターでフォームの幅と高さを1ピクセルに設定しました。showが呼び出されたら、ウィンドウを非表示にして、ウィンドウを通常のサイズに戻します。それが隠される前に小さな窓に気付くのは難しいです。

これにより、私のルーチンが起動し、フォームの表示をロードすることができます。

更新
ShowDialogue()を使用する場合、このばかげた小さなトリックは、Form_Shownが呼び出し元に制御を返す前にVisible=trueを設定した場合にのみ機能します。FormでVisible=trueを設定すると、Closingイベントがトリガーされることがわかりました...私はWINFORMSが大好きです...

于 2012-11-02T17:51:14.653 に答える
0

AddRangeを使用して、すべてのコントロールを一度に追加してみてください。

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.addrange.aspx

于 2012-11-02T16:33:24.567 に答える