c# - Visual Studio 风格的撤消下拉按钮 - 自定义 ToolStripSplitButton

标签 c# winforms

我希望实现一个 Visual Studio 风格的撤消下拉按钮:

Undo drop-down

我在整个互联网上都看过了,似乎找不到任何真正的实现。

我从 ToolStripSplitButton 开始,但真的不知道从那里去哪里。它的 DropDown 属性是一个 ToolStripDropDown ,但这似乎与选择的多个项目没有任何关系,更不用说滚动和底部的文本了。

所以我想也许整个下拉部分应该是一个基于组合框的自定义控件,而不是默认的 ToolStripDropDown。接下来的问题是,如何使右侧(下拉箭头)按钮执行除显示其默认下拉菜单之外的其他操作?

我走在正确的轨道上吗?谢谢!

最佳答案

是的,我认为您的方向是正确的。在这种情况下,ToolStripControlHost 是您的 friend 。

您不一定需要从它派生(除非您正在制作自己的控件),但请尝试订阅 ToolStripSplitButton 的 DropDownOpening 事件:

工作示例:

private ListBox listBox1;

public Form1()
{
  InitializeComponent();

  listBox1 = new ListBox();
  listBox1.IntegralHeight = false;
  listBox1.MinimumSize = new Size(120, 120);  \\ <- important
  listBox1.Items.Add("Item 1");
  listBox1.Items.Add("Item 2");
}

private void toolStripSplitButton1_DropDownOpening(object sender, EventArgs e) {
  ToolStripControlHost toolHost = new ToolStripControlHost(listBox1);
  toolHost.Size = new Size(120, 120);
  toolHost.Margin = new Padding(0);
  ToolStripDropDown toolDrop = new ToolStripDropDown();
  toolDrop.Padding = new Padding(0);
  toolDrop.Items.Add(toolHost);
  toolDrop.Show(this, new Point(toolStripSplitButton1.Bounds.Left,
                                toolStripSplitButton1.Bounds.Bottom));
}

结果如下:

enter image description here

对于您的应用程序,您需要将 ListBox 替换为您自己的 UserControl,这样您就可以在其中包含任何您想要的内容。 ToolStripControlHost 只能容纳一个控件,设置 MinimumSize 属性很重要,否则放置的控件大小不正确。

关于c# - Visual Studio 风格的撤消下拉按钮 - 自定义 ToolStripSplitButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8075040/

相关文章:

c# - 控制台应用程序中的异步

c# - RichTextBox 在有趣的地方找到我的搜索词

c# - 列表框选定的项目

winforms - 你如何处理 Winforms 中临时无用的控件(隐藏与禁用)?

C#:在我的 exe 旁边复制 native 依赖项的优雅方式

c# - 如何从另一个类中的一个类访问变量? [C#]

c# - 调试由另一个 exe 运行的 exe

c# - 将子控件 MouseMove 事件无缝转发给父控件

c# - 跳过 Aero 窗口动画

c# - 如何区分Enter事件是由键盘还是鼠标点击引发的?