2008-11-04 33 views
19

Tôi có một kiểm soát biểu mẫu cửa sổ TreeView cửa sổ với một ImageList và tôi muốn một số nút hiển thị hình ảnh, nhưng những người khác không có hình ảnh.Làm cách nào để đặt hình ảnh cho một số nhưng không phải tất cả các nút trong TreeView?

I không muốn có khoảng trống trong đó hình ảnh nên ở đó. Tôi không muốn một hình ảnh trông giống như các dòng mà TreeView sẽ vẽ nếu nó không có một ImageList. Làm cách nào để tôi vẽ hình ảnh cho một số mặt hàng chứ không phải những thứ khác, mà không phải dùng đến những vụ hack vụng về như thế?

+0

bạn có thể xác định nếu điều này được sử dụng trong một trang web hay ứng dụng winforms, xin vui lòng? – splattne

+0

Xong - winforms. – Simon

Trả lời

7

Tôi đã thử điều này một lần và tôi không nghĩ rằng điều đó là có thể.

Nếu bạn cố gắng đặt cả ImageKeyImageIndex để "not set" giá trị kiểm soát chỉ mặc định ImageIndex để 0. Các mã sau đây:

treeView.ImageKey = "Value"; 
Debug.WriteLine(treeView.ImageIndex); 
treeView.ImageKey = null; 
Debug.WriteLine(treeView.ImageIndex); 
treeView.ImageIndex = -1; 
Debug.WriteLine(treeView.ImageIndex); 

Tạo đầu ra:

-1 
0 
0 

Kiểu này cho bạn biết rằng các nhà phát triển kiểm soát muốn đảm bảo rằng luôn có một hình ảnh mặc định. Điều đó chỉ để lại cho bạn các tùy chọn hack tôi sợ.

+1

Thats bởi vì setView treeView.ImageIndex chứa này (tôi đã sử dụng ILSpy): if (value == -1) value = 0; if (value <0) ném ArgumentOutOfRangeException mới ("ImageIndex", SR.GetString ("InvalidLowBoundArgumentEx", đối tượng mới [] {"ImageIndex", value.ToString (CultureInfo.CurrentCulture), 0.ToString (CultureInfo.CurrentCulture)})); .... – toong

+0

Chỉ cần bao gồm biểu tượng 1 pixel x 1 pixel trống và tải các nút mà bạn không muốn biểu tượng, với điều này. –

12

Bạn cần đặt ImageIndexSelectedImageIndex thành số cao hơn số giá trị trong số ImageList của mình. Ví dụ, nếu bạn tạo nút này và thêm nó vào TreeView của bạn:

TreeNode node1 = new TreeNode(string.Empty, 12, 12); // imageList1.Count = 5 

bạn sẽ có một vô hình TreeNode đưa vào TreeView của bạn. Tôi đã thay đổi màu nền của số TreeView và nó vẫn vô hình.

(Tôi googled này một thời gian, và tôi cuối cùng đã tìm thấy câu trả lời ở đây: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.windowsforms/2006-09/msg00322.html)

+2

Đây có phải là tài liệu của MS ở đâu đó không? Tôi sẽ thận trọng khi sử dụng loại kỹ thuật này giống như loại điều có thể không được giữ tương thích trong các phiên bản tương lai của khuôn khổ. –

+1

Nút vô hình không hữu ích lắm. Nếu có văn bản, bạn sẽ thấy rằng không gian cho hình ảnh vẫn được đặt trước, trống hay không. –

+0

Tôi nghĩ rằng đây phải là câu trả lời được chấp nhận :) –

2

này sẽ rút ra những TreeNode văn bản, nơi hình ảnh cần phải có được, loại bỏ các khoảng trắng.

Bạn cần đặt thuộc tính's DrawMode thành OwnerDrawText. Bạn có thể tìm thấy thuộc tính DrawMode trong bảng thuộc tính.

Tiếp theo khi bạn thêm nút, hãy đặt số đó là ImageIndexSelectedImageIndex lớn hơn giá trị yourImageListName.Images.Count giá trị của bạn. Điều này là không có hình ảnh sẽ được rút ra, nhưng vẫn sẽ có không gian màu trắng mà bạn không muốn.

Bây giờ để loại bỏ khoảng trắng. Thêm một xử lý cho sự kiện treeview DrawNode. Điều này có thể được thực hiện bằng cách vào bảng thuộc tính treeviews và nhấp vào biểu tượng trong bảng điều khiển trông giống như một tia sáng, sau đó cuộn cho đến khi bạn thấy văn bản DrawNode, nhấp đúp vào nó.

Bây giờ bạn chỉ cần sao chép và dán vào những phương pháp tạo

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); 
+0

Không hoàn toàn hoạt động. Lựa chọn vẫn được vẽ trên vị trí ban đầu của nó (bị trật khớp đến bên phải liên quan đến các nút không có hình ảnh). –

+0

Câu trả lời của bạn đã giúp tôi, nhưng tôi đã dọn dẹp logic. Nó chỉ là 'Bounds.Left' mà bạn cần thao tác để ẩn khoảng trắng. –

9

Những gì tôi đã chọn để làm là sử dụng một hình ảnh của dấu chấm cho những TreeView nút mà không phải là nghĩa vụ phải có một hình ảnh.

TreeNode with image dots

tôi thêm hình ảnh này là hình ảnh cuối cùng trong danh sách, và nếu mặt hàng đó là không được phép có một hình ảnh tôi đặt nó vào ImageList.Images.Count-1

+0

Tôi không cho rằng bạn có hình ảnh này ở đâu đó? :-) –

+1

Chụp ảnh màn hình và sửa đổi nó cho phù hợp với mục đích của bạn – MtnManChris

+0

Đó là những gì tôi đã làm, chỉ là lười biếng trong trường hợp bạn có một người nói dối :-) –

1

Hei bro, tôi tìm ra cách. Đặt hình ảnh đầu tiên làm hình ảnh trống, như thế này ...

TreeView treeView = new TreeView(); 
treeView.ImageList.Images.Add(new Bitmap(1,1)); 

Vì vậy, chỉ mục 0 là một hình ảnh trống. Tôi hy vọng điều này sẽ giúp

2

tôi thấy rằng việc sử dụng StateImageList trên TreeView thay vì ImageList sẽ chỉ hiển thị hình ảnh khi StateImageIndex trên TreeNode là bằng hoặc lớn hơn 0

+0

điều này có vẻ hoạt động tốt. –

Các vấn đề liên quan