我正在使用 ToolStripDropDown
控件来实现自定义 ComboBox 类控件的下拉部分。为了在视觉上吸引人,我在下拉菜单上施加了一个 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
中似乎没有关于滚动偏移量或将特定项目滚动到 View 中的机制的任何方法或属性(例如 上的
).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
,没有边距,最重要的是,不会窃取焦点并且无法接收焦点。
关于c# - 如何在固定大小的 ToolStripDropDown 中滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4051217/