如何在一个固定大小的ToolStripDropDown滚动
-
27-09-2019 - |
题
我使用的是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
,其托管控制仍然可以从打开它的形式聚焦远也排除了。)
解决方案
最后裂化这一个。它发生,我认为ContextMenuStrip
和ToolStripDropDownMenu
能够自动滚动行为,他们的基类,ToolStripDropDown
,不能提供的。起初,我避免这些替代性的控制,因为它们通常加大幅度。这可以通过ShowImageMargin
和ShowCheckMargin
被删除。即使在这样的小(大约为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; }
}