我使用的是ToolStripDropDown控制实现自定义组合框状控制的下拉部分。为了在视觉上吸引人的,我的下拉强加MaximumSize和手动指定在其内的每个ToolStripButton的宽度 - 的结果是一个弹出其是相同的宽度,激活它的控制,具有上的高度的帽高度的下拉部分。

实施例(简化的):

ToolStripDropDown dropDown = new ToolStripDropDown();
dropDown.MaximumSize = new Size(200, 100);
dropDown.RenderMode = ToolStripRenderMode.System;
dropDown.AutoSize = true;

for (int i = 0; i < 50; i++) {
    ToolStripButton dropDownItem = (ToolStripButton)dropDown.Items.Add("Item " + i);
    dropDownItem.AutoSize = false;
    dropDownItem.Size = new Size(200, 20);
}

dropDown.Show(owningControl, new Point(0, owningControl.Height - 1));

正如你所看到的,施加在弹出窗口的大小的限制,但上/下不显示滚动按钮,并似乎有没有办法让他们出现。似乎没有成为关于滚动偏移或滚动的特定项目到视图(如上ToolStripDropDown EnsureVisible())的机构。

ListViewItem内的任何方法或属性

那么,如何能我得到的下拉菜单滚动?任何方法将是足够的,无论是一个滚动条,滚动按钮甚至鼠标滚轮。

(顺便说一句,我已经试过很多次使用Form的下拉部分做出类似的管制 - 尽管尝试几十个解决方案,以阻止弹出窗口偷焦点或者点击它的控制时获得焦点,这似乎是一个死端。我已经使用ToolStripControlHost,其托管控制仍然可以从打开它的形式聚焦远也排除了。)

有帮助吗?

解决方案

最后裂化这一个。它发生,我认为ContextMenuStripToolStripDropDownMenu能够自动滚动行为,他们的基类,ToolStripDropDown,不能提供的。起初,我避免这些替代性的控制,因为它们通常加大幅度。这可以通过ShowImageMarginShowCheckMargin被删除。即使在这样的小(大约为5px)保证金遗体。这可以通过重写DefaultPadding属性中删除:

public class MyDropDown : ToolStripDropDownMenu {

    protected override Padding DefaultPadding {
        get { return Padding.Empty; }
    }

    public MyDropDown() {
        ShowImageMargin = ShowCheckMargin = false;
        RenderMode = ToolStripRenderMode.System;
        MaximumSize = new Size(200, 150);
    }
}

// adding items and calling Show() remains the same as in the question

这导致在一个弹出窗口,其可以包含任何类型的ToolStrip项目,强制MaximumSize,没有余量,而最重要的是,不偷焦点和不能接收焦点。

其他提示

这是您的克星:

internal virtual bool RequiresScrollButtons
{
    get
    {
        return false;
    }
    set
    {
    }
}

有内部,则不能将其覆盖。你可以恢复你的使用形式,通过固定焦点窃电行为的方法。粘贴到表单类:

protected override bool ShowWithoutActivation
{
    get { return true; }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top