2010-07-03 40 views
7


Tôi đang cố gắng kiểm soát người dùng tương tự như thanh breadcrumb của Windows Vista/7 được sử dụng trong trình khám phá cửa sổ.Menu thả xuống với thanh cuộn trong .NET

Tuy nhiên, khi tôi hiển thị trình đơn thả xuống cho đường dẫn với nhiều mục con, tôi nhận được danh sách rất dài đôi khi vượt quá kích thước màn hình.
Tuy nhiên, trong ví dụ Windows Vista/7, có tối đa 18 mục được hiển thị tại một thời điểm và một thanh cuộn xuất hiện ở bên phải khi số lượng mục con vượt quá con số này (18).

Tôi muốn biết nếu có ai đó biết cách sao chép những gì Microsoft làm.
[Tức là, cách đặt menu thả xuống trong điều khiển với khả năng cuộn tự động.]



Cảm ơn.
Alex

+0

Ý của bạn là chính xác cho menu thả xuống? Điều khiển .net nào? (một DropDownButton trên thanh công cụ?) – digEmAll

+0

Tôi có nghĩa là một ToolStripDropDown. Loại bạn nhận được khi bạn chạy ContextMenu.Show hoặc khi bạn bấm vào một ToolStripMenuItem. –

Trả lời

7

Đường dẫn Windows 7/Vista trông giống như chế độ xem danh sách. Bức tranh sau đây đưa ra một ví dụ (trên cửa sổ xp) về những gì tôi có nghĩa là (danh sách xuất hiện nhấp vào nút):

Windows 7 breadcrumb sample

và đây là đoạn code để có được nó:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     var button = sender as Button; 

     // create fake items list 
     List<string> strings = new List<string>(); 
     for (int i = 0; i < 36; i++) 
      strings.Add("ITEM " + (i+1)); 
     var listViewItems = strings.Select(x => new ListViewItem(x, 0)).ToArray(); 

     // create a new list view 
     ListView listView = new ListView(); 
     listView.View = View.SmallIcon; 
     listView.SmallImageList = imageList1; 
     listView.MultiSelect = false; 

     // add items to listview 
     listView.Items.AddRange(listViewItems); 

     // calculate size of list from the listViewItems' height 
     int itemToShow = 18; 
     var lastItemToShow = listViewItems.Take(itemToShow).Last(); 
     int height = lastItemToShow.Bounds.Bottom + listView.Margin.Top; 
     listView.Height = height; 

     // create a new popup and add the list view to it 
     var popup = new ToolStripDropDown(); 
     popup.AutoSize = false; 
     popup.Margin = Padding.Empty; 
     popup.Padding = Padding.Empty; 
     ToolStripControlHost host = new ToolStripControlHost(listView); 
     host.Margin = Padding.Empty; 
     host.Padding = Padding.Empty; 
     host.AutoSize = false; 
     host.Size = listView.Size; 
     popup.Size = listView.Size; 
     popup.Items.Add(host); 

     // show the popup 
     popup.Show(this, button.Left, button.Bottom); 
    } 
} 

EDIT:

Để có được mục đã chọn, một trong những cách như sau:

// change some properties (for selection) and subscribe the ItemActivate 
// event of the listView 
listView.HotTracking = true; 
listView.Activation = ItemActivation.OneClick; 
listView.ItemActivate += new EventHandler(listView_ItemActivate); 


// the click on the item invokes this method 
void listView_ItemActivate(object sender, EventArgs e) 
{ 
    var listview = sender as ListView; 
    var item = listview.SelectedItems[0].ToString(); 
    var dropdown = listview.Parent as ToolStripDropDown; 
    // unsubscribe the event (to avoid memory leaks) 
    listview.SelectedIndexChanged -= listView_ItemActivate; 
    // close the dropdown (if you want) 
    dropdown.Close(); 

    // do whatever you want with the item 
    MessageBox.Show("Selected item is: " + item); 
} 
+0

Cảm ơn! Tôi không bao giờ biết bạn có thể nhúng một Control [hoặc dẫn xuất của nó] trong một ToolStripDropDown dễ dàng như vậy. Bạn đã thực sự hữu ích. –

+0

Tại sao chọn một ListView thay vì một ComboBox? –

+0

@Cody: vì OP cần thiết để hiển thị ListBox bằng cách nhấp chuột phải. Sử dụng một combo sẽ có slighlty khác nhau ... – digEmAll

2

Tôi khuyên bạn nên xem nó bằng Spy ++. Tất cả mọi thứ được cấu tạo từ các điều khiển Windows tiêu chuẩn, được lồng ghép rất nhiều. Trình đơn thả xuống được triển khai dưới dạng, drumroll, một hộp tổ hợp. Nó là một phần tùy chỉnh bị lãng quên, có tên là ComboBoxEx. Tôi chưa bao giờ nhìn thấy một wrapper NET cho nó, có lẽ bởi vì nó không một công việc đó là dễ dàng thực hiện bởi các wrapper ComboBox cũ đồng bằng trong Windows Forms.

Chỉ cần đặt thuộc tính DrawMode thành OwnerDrawFixed và triển khai sự kiện DrawItem để hiển thị biểu tượng và văn bản. Có một ví dụ rất tốt có sẵn trong MSDN Library article cho nó.

2

Nếu bạn muốn truy cập API Vista để hiển thị thanh, hãy xem Vista Bridge library. Bạn có thể tìm thấy một mẫu của một điều khiển thanh Crumb bánh mì trong một trong các mẫu.

Tôi không chắc chắn nếu nó sẽ hiển thị trên WinXP, tuy nhiên.

+0

 Your answer provided me with the Microsoft-built breadcrumb and I thank you for that. The solution, however did not take into account the scrollbar issue so I'll have to combine the your suggestion with digEmAll's Thanks. 

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