首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在固定大小的ToolStripDropDown中滚动

如何在固定大小的ToolStripDropDown中滚动
EN

Stack Overflow用户
提问于 2010-10-29 19:07:25
回答 2查看 3.5K关注 0票数 3

我正在使用一个ToolStripDropDown控件来实现一个自定义的类似组合框的控件的下拉部分。为了在视觉上吸引人,我在dropdown上添加了一个MaximumSize,并手动指定其中每个ToolStripButton的宽度-结果是一个弹出式窗口,其宽度与激活它的控件相同,并在下拉部分的高度上有一个上限。

示例(简化):

代码语言:javascript
复制
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的可能性,它的宿主控件仍然可以将焦点从打开它的窗体上移开。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-30 01:55:44

终于破解了这一条。在我看来,ContextMenuStripToolStripDropDownMenu能够提供它们的基类ToolStripDropDown所不能提供的自动滚动行为。最初,我避免使用这些替代控件,因为它们通常会添加较大的边距。这可以通过ShowImageMarginShowCheckMargin删除。即使在这样做之后,仍然有一个很小的(大约5px)的余量。这可以通过覆盖DefaultPadding属性来删除:

代码语言:javascript
复制
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,没有边距,最重要的是,不会偷走焦点,也不能接收焦点。

票数 3
EN

Stack Overflow用户

发布于 2010-10-29 22:41:12

这是你的死对头:

代码语言:javascript
复制
internal virtual bool RequiresScrollButtons
{
    get
    {
        return false;
    }
    set
    {
    }
}

它是内部的,您不能覆盖它。您可以通过修复焦点窃取行为来恢复使用表单的方法。将此内容粘贴到form类中:

代码语言:javascript
复制
protected override bool ShowWithoutActivation
{
    get { return true; }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4051217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档