6

ImageListBoxPicasa が使用するような、多数のサムネイルを表示する一種のコントロールを作成しようとしています。

これは私のデザインです:

4,000 など、FlowLayoutPanel多くのオブジェクトが取り込まれた があります。UserControlそれぞれにイベントUserControlの代理人が割り当てられます。Paintイベントが呼び出されると、Paintサムネイルのメモリ キャッシュがチェックされ、イメージがキャッシュにない場合はディスクから取得されます。

私が解決しようとしている2つの問題があります。

  1. が表示されていなくても、WinForms はPaintイベントをトリガーするようUserControlです。実際に表示されているのは 10 程度のコントロールだけで、残りは表示されていません (FlowLayoutPanel.AutoScrollは に設定されていtrueます)。その結果、すべての画像のサムネイルを取得しようとするため、時間がかかります。

  2. UserControlにオブジェクトを追加するにFlowLayoutPanelは、2 ~ 3 秒ほど時間がかかります。私はそれで暮らすことができますが、それを行うためのより良い方法があるかどうか疑問に思っています:

    UserControl[] boxes = new UserControl[N];
    // populate array
    panel.SuspendLayout();
    panel.Controls.AddRange(boxes);
    panel.ResumeLayout();
    
4

3 に答える 3

7

FlowLayoutPanel にユーザー コントロールを設定する速度を向上させるには、コントロールを追加する間、レイアウトの更新を無効にします。

ループの直前に呼び出しSuspendLayout()、最後に呼び出しますResumeLayout()ResumeLayout()例外が発生した場合でも実行を保証するために、try-finally を必ず使用してください。

于 2009-01-24T20:29:01.680 に答える
3

それほど多くのユーザー コントロールは追加しません。むしろ、使用するサムネイル、配置などに関する情報を格納する一連のデータ構造を用意し、必要な各サムネイルのレンダリングを処理します。

もちろん、コントロール内のペイント イベント引数をチェックし、表示されていてレンダリングが必要なサムネイルをレンダリングすることにより、必要なものだけをレンダリングします。

于 2009-01-22T21:32:53.783 に答える
1

あはは!私は何かを見つけました。

UserControl がビューになく、Paint イベントを受け取ると、e.ClipRectangle.IsEmpty は true になります。

于 2009-01-22T22:16:43.630 に答える