我试图在 ToolStripComboBox 中禁用鼠标滚动,我以为我可以捕获鼠标滚轮事件,但是虽然该事件可用于 ComboBox,但它不适用于 ToolStripComboBox。有任何想法吗?

有帮助吗?

解决方案

ToolStripComboBox 有助于暴露其底层 ComboBox 控制以其恰当的名称 ComboBox 财产. 。这允许我们访问它的属性、方法和事件,这些属性、方法和事件没有被包装到 ToolStripComboBox.

而且,正如您可能知道的,标准 ComboBox 控件暴露了一个 MouseWheel 事件 当组合框具有焦点时,每次滚动鼠标滚轮时都会触发该事件。

将这两件事放在一起,我们可以为 ToolStripComboBox 控制的底层 ComboBox 控制的 MouseWheel 事件,并覆盖其默认行为。

因此,假设您有一个包含以下内容的表单 ToolStrip 和一个 ToolStripComboBox, ,您可以使用类似以下代码的内容:

public partial class Form1 : Form
{
   public Form1()
   {
      InitializeComponent();

      //Attach a handler for the MouseWheel event
      ToolStripComboBox1.ComboBox.MouseWheel += new MouseEventHandler(ToolStripComboBox_MouseWheel);
   }

   private void ToolStripComboBox_MouseWheel(object sender, MouseEventArgs e)
   {
      //Cast the MouseEventArgs to HandledMouseEventArgs
      HandledMouseEventArgs mwe = (HandledMouseEventArgs)e;

      //Indicate that this event was handled
      //(prevents the event from being sent to its parent control)
      mwe.Handled = true;
   }
}

当然,您也可以随时对现有的子类进行分类 ToolStripComboBox 以与上面所示相同的方式控制和覆盖其行为。

其他提示

除了科迪什么建议灰色您可能希望在轮scolling工作时,组合框将被丢弃。只是再检查一下在鼠标滚轮手柄DroppedDown状态:


    public class MyToolStripComboBox : ToolStripComboBox
    {
        public MyToolStripComboBox()
        {
            this.ComboBox.MouseWheel += new MouseEventHandler(ComboBox_MouseWheel);
        }

        void ComboBox_MouseWheel(object sender, MouseEventArgs e)
        {
            if (!this.ComboBox.DroppedDown)
                ((HandledMouseEventArgs)e).Handled = true;
        }
    }

滚动下降与轮组合框不改变选择,所以它可以按预期

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top