DOBON.NET DOBON.NETプログラミング掲示板過去ログ

TreeView.ImageList について

環境/言語:[Windows2000 SP4 / VisualStudio.NET 2003 / C#]
分類:[.NET]

こんにちは。表題の件につきまして質問させてください。

以下私が行なって、現在ハマっていることを説明します。

1. Form1 に treeView1 と imageList1 と button1 を配置します
2. imageList1 の images コレクションに2〜3適当な画像を読み込みます
3. ツリーで大きな画像を表示させたいので imageList1 の ImageSize
  プロパティを 120,90 のように変更します
4. treeView1.ImageList プロパティに imageList1 を適用します。
5. treeView1 の Nodes コレクションに2〜3適当にノードをつくります
6. ツリーでは画像を小さくしたい時のために、 button1 の Click イベントに
  以下のようなコードを書きます
  imageList1.ImageSize = new Size(40, 30);
7. 実行します

長々書きましたが、実行すると期待通りツリー内に画像が 120x90 のサイズで
展開されて表示されます。
しかし画像が小さくなるよう button1 を押すと imageList1.ImageSize1 や
treeView1.Indent プロパティは更新されるのに、実際の treeView1 には
画像が表示されず真っ白になってしまいます。
Click イベント内のコードに treeView1.Invalidate(); を書いても変わりませんでした。

どうすればサイズを変えたりしても画像が表示されるようになるでしょうか?
  • 題名: Re[1]: TreeView.ImageList について
  • 著者: ピラルク
  • 日時: 2004/02/19 0:26:08
  • ID: 2580
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
こんばんは、満腹さん。ピラルクです。

imageList1.ImageSize = new Size(40, 30);

をするとimageが消えてしまうようですね。

Console.WriteLine(imageList1.Images.Count); // 3 と表示
imageList1.ImageSize = new Size(40, 30);
Console.WriteLine(imageList1.Images.Count); // 0 と表示

あらかじめ2種類のimageListを用意しておけば
ImageListのすげかえでOKなようですが、
Memory食いそうですね。それを避けるには...何か策あるかなぁ。。。
> 6. ツリーでは画像を小さくしたい時のために、 button1 の Click イベントに
>   以下のようなコードを書きます
>   imageList1.ImageSize = new Size(40, 30);

偶然にも私がつい昨日、引っかかたところで同じ悩みを持つ人がおられたようで...。ピラルクさんが示している通り、サイズをnewで書き換える際に納めている画像もクリアしてしまうようですので、これは仕様だと思われます。

で解決策としては
画像の種類が多くないのなら、サイズ変更後に再度画像をセットする方法もありかと思います。
Me.ImageList1.Images.Add(Image.FromFile("ファイルのパス"))

私の場合はImageListにセットする画像が30個ぐらいになるので切替の度に一々処理にかかる時間が長くなるため、2種類のimageListを用意してその都度切替で回避しました。
ピラルクさん、ひろさん、ありがとうございます。
やっぱり仕様ぽいですか・・・
画像サイズは頻繁に変更されないですが、ImageList.Images の中は頻繁に更新されるので、
めんどくさがりな私は強引に以下の方法で乗り切ることにしました。(単純に imageList1.ImageStream をコピーするだけだと当然ですがうまくいきませんので・・・)

System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
ImageList il = new ImageList(this.components);
il.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));

imageList1.ImageSize = new System.Drawing.Size(40, 30);
imageList1.Images.Clear();

foreach(Image i in il.Images) {
  imageList1.Images.Add(i);
}

自分の他にも悩まれた方のお話が聞けてとてもすっきりしました。
ありがとうございました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板