我正在使用一个ToolStripDropDown控件来实现一个自定义的类似组合框的控件的下拉部分。为了在视觉上吸引人,我在dropdown上添加了一个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中似乎没有任何关于滚动偏移量的方法或属性,也没有用于将特定项滚动到视图中的机制(如ListViewItem上的EnsureVisible() )。
那么,我怎样才能让下拉菜单滚动呢?任何方法都足够了,可以是滚动条,滚动按钮,甚至是鼠标滚轮。
(顺便说一句,我已经多次尝试使用下拉部分的Form来制作类似的控件-尽管尝试了几十种解决方案来防止弹出窗口在其控件被单击时偷走焦点或获得焦点,但这似乎是一个死胡同。我还排除了使用ToolStripControlHost的可能性,它的宿主控件仍然可以将焦点从打开它的窗体上移开。)
发布于 2010-10-30 01:55:44
终于破解了这一条。在我看来,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,没有边距,最重要的是,不会偷走焦点,也不能接收焦点。
发布于 2010-10-29 22:41:12
这是你的死对头:
internal virtual bool RequiresScrollButtons
{
get
{
return false;
}
set
{
}
}它是内部的,您不能覆盖它。您可以通过修复焦点窃取行为来恢复使用表单的方法。将此内容粘贴到form类中:
protected override bool ShowWithoutActivation
{
get { return true; }
}https://stackoverflow.com/questions/4051217
复制相似问题