TreeView
ウィンドウフォームコントロールとImageList
があり、一部のノードに画像を表示させたいが、他のノードには画像を表示させたくない。
I しないでください画像があるべき場所に空白が必要です。 I しない ImageListがない場合にTreeViewが描画する線のような画像が必要です。そのような不器用なハックに頼ることなく、他のアイテムではなく一部のアイテムの画像を描画するにはどうすればよいですか?
私はこれを一度試しましたが、それは不可能だと思います。
ImageKey
とImageIndex
の両方を「未設定」の値に設定しようとすると、コントロールはデフォルトでImageIndex
を0に設定します。次のコード:
treeView.ImageKey = "Value";
Debug.WriteLine(treeView.ImageIndex);
treeView.ImageKey = null;
Debug.WriteLine(treeView.ImageIndex);
treeView.ImageIndex = -1;
Debug.WriteLine(treeView.ImageIndex);
出力を生成します:
-1
0
0
この種のことは、コントロール開発者が常にデフォルトのイメージが存在することを確認したかったことを示しています。それは私が恐れているハックオプションをあなたに残すだけです。
ImageIndex
とSelectedImageIndex
を、ImageList
の値の数よりも大きい数に設定する必要があります。たとえば、このノードを作成してTreeView
に追加すると、次のようになります。
TreeNode node1 = new TreeNode(string.Empty, 12, 12); // imageList1.Count = 5
目に見えないTreeNode
がTreeView
に挿入されます。 TreeView
の背景色を変更しましたが、まだ見えませんでした。
(私はしばらくの間これをグーグルで検索しました、そして私は最終的にここで答えを見つけました: http://www.tech-archive.net/Archive/DotNet/Microsoft.public.dotnet.framework.windowsforms/2006-09/ msg00322.html )
私が選択したのは、画像を持たないはずのTreeView
ノードにドットの画像を使用することです。
この画像をリストの最後の画像として追加し、アイテムに画像が含まれていない場合は、ImageList.Images.Count-1
に設定します。
ImageListの代わりにTreeViewでStateImageListを使用すると、TreeNodeのStateImageIndexが0以上の場合にのみ画像が表示されることがわかりました。
これにより、画像があるべき場所にTreeNode
テキストが描画され、空白が削除されます。
TreeView
のDrawMode
プロパティをOwnerDrawText
に設定する必要があります。 DrawMode
プロパティはプロパティパネルにあります。
次にノードを追加するときは、ノードをImageIndex
およびSelectedImageIndex
がyourImageListName.Images.Count
値の値よりも大きく設定します。これは画像が描画されないようにするためですが、不要な空白は残ります。
さて、空白を取り除きます。 treeviews DrawNode
イベントのハンドルを追加します。これを行うには、treeviewsプロパティパネルに移動し、照明ボルトのように見えるパネルのアイコンをクリックしてから、テキストDrawNode
が表示されるまでスクロールし、ダブルクリックします。
これをコピーして、作成したメソッドに貼り付けるだけです。
if (e.Node.ImageIndex >= e.Node.TreeView.ImageList.Images.Count) // if there is no image
{
int imagewidths = e.Node.TreeView.ImageList.ImageSize.Width;
int textheight = TextRenderer.MeasureText(e.Node.Text, e.Node.NodeFont).Height;
int x = e.Node.Bounds.Left - 3 - imagewidths / 2;
int y = (e.Bounds.Top + e.Bounds.Bottom) / 2+1;
Point point = new Point(x - imagewidths/2, y - textheight/2); // the new location for the text to be drawn
TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, point, e.Node.ForeColor);
}
else // drawn at the default location
TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.TreeView.Font, e.Bounds, e.Node.ForeColor);
ヘイブロ、私は方法を見つけました。このように、最初の画像を空の画像として設定します...
TreeView treeView = new TreeView();
treeView.ImageList.Images.Add(new Bitmap(1,1));
したがって、インデックス0は空のイメージです。これがお役に立てば幸いです