在.NET中使用ScrollBar的DropDown菜单

时间:2010-07-03 13:31:35

标签: c# .net vb.net winforms


我正在尝试使用类似于Windows资源管理器中使用的Windows Vista / 7面包屑栏的用户控件。

但是,当我显示包含许多子项目的面包屑的下拉菜单时,我会得到一个很长的列表,有时会超出屏幕尺寸。
但是,在Windows Vista / 7示例中,一次最多显示18个项目,当子项目数超过此数字时,右侧会出现滚动条(18)。

我想知道是否有人知道如何复制微软所做的事情 [也就是说,如何在具有自动滚动功能的控件中放置下拉菜单。]



谢谢。
亚历

3 个答案:

答案 0 :(得分:7)

Windows 7 / Vista breadcrumb看起来类似于列表视图。 下面的图片给出了一个例子(在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);
}

答案 1 :(得分:2)

我建议用Spy ++来看看它。一切都是由标准的Windows控件组成,严重嵌套。下拉列表实现为,drumroll,一个组合框。这是一个很大程度上被遗忘的定制版,名为ComboBoxEx。我从未见过它的.NET包装器,可能是因为它的工作很容易通过Windows Forms中普通的旧ComboBox包装器实现。

只需将其DrawMode属性设置为OwnerDrawFixed,并实现DrawItem事件以显示图标和文本。 MSDN Library article中有一个非常好的示例。

答案 2 :(得分:2)

如果要访问Vista API以呈现栏,请查看Vista Bridge library。您可以在其中一个样品中找到面包屑棒控制样品。

但我不确定它是否会在WinXP上呈现。