DropDown меню с полосой прокрутки в.NET
Я пытаюсь сделать пользовательский элемент управления похожим на панель навигации Windows Vista/7, используемую в проводнике Windows.
Однако, когда я показываю выпадающее меню для хлебных крошек со многими подпунктами, я получаю очень длинный список, который иногда превышает размер экрана.
Однако в примере с Windows Vista/7 одновременно отображается не более 18 элементов, а справа появляется полоса прокрутки, когда число вложенных элементов превышает это число (18).
Я хотел знать, знает ли кто-нибудь, как копировать то, что делает Microsoft.
[То есть, как разместить выпадающее меню в элементе управления с возможностью автоматической прокрутки.]
Благодарю.
Alex
3 ответа
Хлебная крошка Windows 7/Vista похожа на представление списка. На следующем рисунке приведен пример (в Windows XP) того, что я имею в виду (список появляется при нажатии на кнопку):
и вот код, чтобы получить это:
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);
}
}
РЕДАКТИРОВАТЬ:
Чтобы получить выбранный элемент, один из следующих способов:
// 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);
}
Я рекомендую взглянуть на это с помощью Spy++. Все состоит из стандартных элементов управления Windows, сильно вложенных. Выпадающий список реализован как, барабанная дробь, поле со списком. Это в значительной степени забытый настроенный, названный ComboBoxEx. Я никогда не видел для этого.NET-оболочки, вероятно потому, что она выполняет работу, которую легко реализовать с помощью простой старой оболочки ComboBox в Windows Forms.
Просто установите для свойства DrawMode значение OwnerDrawFixed и реализуйте событие DrawItem, чтобы отобразить значок и текст. В статье MSDN Library есть очень хороший пример.
Если вы хотите получить доступ к API Vista для рендеринга панели, посмотрите библиотеку Vista Bridge. Вы можете найти образец элемента управления Bread Crumb в одном из образцов.
Однако я не уверен, будет ли он отображаться на WinXP.