3

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

4

2 回答 2

3

有用地在其恰当命名的属性ToolStripComboBox中公开其底层控制。这允许我们访问它的属性、方法和事件,这些属性、方法和事件没有被包装到.ComboBoxComboBoxToolStripComboBox

而且,您可能知道,标准ComboBox控件公开了一个MouseWheel事件,该事件在组合框获得焦点时每次滚动鼠标滚轮时触发。

把这两件事放在一起,我们可以为ToolStripComboBox控件的底层ComboBox控件的MouseWheel事件添加一个处理程序,并覆盖它的默认行为。

因此,假设您有一个包含 aToolStrip和 a的表单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控件子类化并以与上面所示相同的方式覆盖其行为。

于 2010-11-24T08:29:01.740 回答
0

除了 Cody Gray 建议的内容之外,您可能还希望在组合框被丢弃时轮子可以工作。只需检查 MouseWheel 句柄中的 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;
        }
    }

使用滚轮滚动下拉组合框不会更改选择,因此可以按预期工作

于 2011-09-10T15:45:54.740 回答