c# - 如何在固定大小的 ToolStripDropDown 中滚动

标签 c# winforms toolstripdropdown

我正在使用 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 的可能性,它的托管控件仍然可以将焦点从打开它的窗体上移开。)

最佳答案

终于破解了这个。我突然想到 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,没有边距,最重要的是,不会窃取焦点并且无法接收焦点。

关于c# - 如何在固定大小的 ToolStripDropDown 中滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4051217/

相关文章:

c# - Winforms 服务器套接字应用程序

c# - 如何将两个 ToolStripComboBox 和 Separator 水平添加到一个 ToolStripDropMenuItem 中?

c# - 禁用工具条下拉按钮的选择和下拉符号

c# - 使用 PLINQ 计算和更新机箱内的值不起作用

c# - RichTextBox.Select 与 SubString 方法之间的行为不一致

c# - 从另一个进程更新 TextBox 文本

winforms - ToolStripSplitButton 行为覆盖

c# - 在不触发 TextChanged 事件的情况下更改文本框文本

c# - 如何在属性中存储 Linq where 条件

c# - 使用带有终结器的 C++/CLI 定义类时 C# 中的内存泄漏