0

ファイルのリストで初期化された ListView (in) にアイコンをロードする最良の方法を見つけるのに苦労していView.LargeIconます。

ImageList を使用する必要があると考えたので、ImageList を作成して ListView に割り当てました。各画像からアイコンをロードする面倒な作業を処理する BackgroundWorker を作成しました。

  1. DoWorkの組み合わせを使用して、ListView に項目を追加しました。これはうまくいきましたが、UI が少しちらつき、あまりよく見えませんでした。ワーカー スレッド内からループできないということは、aを引数として渡す必要があることを意味していました。ループ内で呼び出してチェックし、それが true の場合は終了していたにもかかわらず、BackgroundWorker をキャンセルするのに問題がありました。(なぜこれが起こったのかは、現時点では重要ではありません。)InvokeRequiredInvokeListView.ItemsList<ListViewItem>CancelAsyncCancellationPending

  2. ProgressChangedイベントを使用してすべての UI 作業を処理しようとしました。UI スレッドが UI を更新するために使用する情報 (つまり、ListView) のフィールドを含むカスタム クラスのReportProgress(0, obj)場所を呼び出しました。objこのアプローチはより有望に思えました。

ただし、どちらのソリューションも私には特に洗練されているとは感じず、どちらも特に優れたユーザー エクスペリエンスにはなりません。この問題に対する(明白な)解決策が欠けているように感じます。結局のところ、Windows エクスプローラーは、私のアプリケーションよりも画像のサムネイルの読み込みをはるかにうまく処理します。ただし、Windows Explorer はサムネイルを Thumbs.db にキャッシュしていると思います。

おそらく、上記の 2 つのアプローチのいずれか正しい方法です。その場合は教えてください。その特定のソリューションをより詳細に調査して、何が間違っているのかを突き止めます。

編集

ファイルとアイコンのリストがネットワーク パスから読み込まれていることを忘れていました。

4

1 に答える 1

1

ビジネスロジックをUIロジックから切り離すことをお勧めします。ListViewファイルのリストをロードしてそれらのアイコンを取得するコードを、フォームのコントロールで機能するコードと混同しないでください。

たとえば、各ファイルに必要なすべてのデータプロパティを含むクラスを作成することをお勧めします。

class MyFileInfo
{
    public string FileName { get; set; }
    public Image Icon { get; set; }
}

次に、すでに入力されているオブジェクトのリストを返すメソッドを記述します。

public List<MyFileInfo> LoadFileList(string folderPath) { }

次に、UIは別のスレッドでそのメソッドを呼び出すことができ、結果ListViewが返されると、返されたデータからコントロールにデータを入力できます。アイテムの追加または変更中にリストがちらつくのを防ぐには、変更を加える前にコントロールのSuspentLayoutメソッドを呼び出し、すべての変更が完了したら呼び出します。ListViewResumeLayout

于 2012-07-11T15:18:01.400 に答える