DropDown меню с полосой прокрутки в .NET - PullRequest
7 голосов
/ 03 июля 2010

Я пытаюсь сделать пользовательский элемент управления похожим на панель хлебных крошек Windows Vista / 7, используемую в проводнике Windows.

Однако, когда я показываю выпадающее меню для хлебных крошек со многими подпунктами, ядлинный список, который иногда превышает размер экрана.Однако в примере с Windows Vista / 7 одновременно отображается не более 18 элементов, а справа появляется полоса прокрутки, когда количество вложенных элементов превышает это число (18).

Я хотел знатьесли кто-нибудь знает способ повторить то, что делает Microsoft.[То есть, как разместить выпадающее меню в элементе управления с возможностью автоматической прокрутки.]Благодарю.Alex

Ответы [ 3 ]

7 голосов
/ 03 июля 2010

Хлебная крошка Windows 7 / Vista похожа на представление списка. На следующем рисунке приведен пример (в Windows XP) того, что я имею в виду (появляется список, нажав на кнопку):

Windows 7 breadcrumb sample

и вот код для его получения:

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);
}
2 голосов
/ 03 июля 2010

Если вы хотите получить доступ к API Vista для рендеринга панели, посмотрите библиотеку Vista Bridge .Вы можете найти образец элемента управления Bread Crumb в одном из примеров.

Однако я не уверен, будет ли он отображаться на WinXP.

2 голосов
/ 03 июля 2010

Я рекомендую взглянуть на это с помощью Spy ++. Все состоит из стандартных элементов управления Windows, сильно вложенных. Выпадающий список реализован как, барабанная дробь, поле со списком. Это в значительной степени забытый настроенный, названный ComboBoxEx . Я никогда не видел для этого .NET-оболочки, возможно потому, что она выполняет работу, которую легко реализовать с помощью простой старой оболочки ComboBox в Windows Forms.

Просто установите для свойства DrawMode значение OwnerDrawFixed и реализуйте событие DrawItem, чтобы отобразить значок и текст. В статье MSDN Library есть очень хороший пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...