C# - 如何防止我的组合框发生鼠标滚轮滚动?

71

我有一个下拉框,我想防止用户使用鼠标滚轮滚动项目。

有没有简单的方法可以做到这一点?

(C#,VS2008)

4个回答

129

使用 MouseWheel 事件来处理组合框的鼠标滚轮:

void comboBox1_MouseWheel(object sender, MouseEventArgs e) {
    ((HandledMouseEventArgs)e).Handled = true;
}

注意:您将需要在代码中创建事件:

comboBox1.MouseWheel += new MouseEventHandler(comboBox1_MouseWheel);

28
非常好,感谢!附注:如果您希望在ComboBox下拉列表展开时仍然可以滚动,请在“((HandledMouseEventArgs)e).Handled = true”行之前添加以下行:“ComboBox control = (ComboBox)sender;”和“if (!control.DroppedDown)”。 - Riegardt Steyn
3
目前这个在Mono上无法运行。https://bugzilla.xamarin.com/show_bug.cgi?id=25201 - chrish
9
我知道这已经有些过时了,但我喜欢在窗体构造函数的 InitializeComponent(); 后面加上以下代码:comboBox1.MouseWheel += (o, e) => ((HandledMouseEventArgs)e).Handled = true; 这行代码可以阻止鼠标滚轮改变 ComboBox 的值。 - Jeremy Sorensen
这种技术在WPF中的组合框中也适用,但在事件处理程序中使用参数object sender,System.Windows.Input.MouseWheelEventArgs e,而且您不必将e转换为HandledMouseEventArgs。 - chinookf
2
只想提醒一下,这也适用于“NumericUpDown”控件。 - test

7
对于WPF,请处理PreviewMouseWheel事件。
还应考虑ComboBox.IsDropDownOpen,以便用户在展开ComboBox时可以使用鼠标滚动浏览大量选项。
另一件事是在整个应用程序中应用相同的行为。
通常我使用以下代码完成以上所有操作: App.xaml
<Application.Resources>
    <Style TargetType="ComboBox">
        <EventSetter Event="PreviewMouseWheel" Handler="ComboBox_PreviewMouseWheel" />
    </Style>
</Application.Resources>

App.xaml.cs

private void ComboBox_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
    e.Handled = !((System.Windows.Controls.ComboBox)sender).IsDropDownOpen;
}

0

我使用了另一种在Mono上也可行的解决方案。

目标是防止意外滚动(即当用户使用鼠标滚轮时没有看着组合框)。如果他/她滚动到组合框的可见部分之外,则组合框不应滚动,否则应该滚动。

我的解决方案:

  • 在屏幕可见部分之外放置一个只读文本框。在form_load中,我放置了这一行代码:hiddenTextbox.left = -100 ;

  • 当鼠标离开组合框时,将焦点设置到此文本框中,使用鼠标离开事件。在comboBox1_MouseLeave中,我放置了这一行代码:hiddenTextbox.focus();

  • 处理mouseWheel事件:From1.MouseWheel += Form1_MouseWheel;textBoxHidden.MouseWheel += Form1_MouseWheel;


0

我的组合框被放置在一个数据网格中[C#,WPF XAML],就像这样:

    <DataGrid x:Name="dgvFieldsMapping" Grid.Row="1" ItemsSource="{Binding}">
        <DataGrid.Columns>
            ...
            <DataGridTemplateColumn Width="*" Header="Destination Field" >
                <DataGridTemplateColumn.CellTemplate >
                    <DataTemplate >
                        <ComboBox ItemsSource="{Binding Source={StaticResource CustomerDbFields}}" SelectedValue="{Binding destinationField, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            ...
        </DataGrid.Columns>
    </DataGrid>

所以每当下拉菜单在选择值后关闭时,鼠标滚轮会滚动该组合框的项目并修改我的选择。

最终我修改了我的XAML,使其看起来像这样:

    <DataGrid x:Name="dgvFieldsMapping" Grid.Row="1" ItemsSource="{Binding}">
        <DataGrid.Resources>
            <Style x:Key="dgvComboBox_Loaded" TargetType="ComboBox">
                <EventSetter Event="Loaded" Handler="dgvCombobox_Loaded" />
            </Style>
        </DataGrid.Resources>
        <DataGrid.Columns>
            ...
            <DataGridTemplateColumn Width="*" Header="Destination Field" >
                <DataGridTemplateColumn.CellTemplate >
                    <DataTemplate >
                        <ComboBox Style="{StaticResource dgvComboBox_Loaded}" ItemsSource="{Binding Source={StaticResource CustomerDbFields}}" SelectedValue="{Binding destinationField, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            ...
        </DataGrid.Columns>
    </DataGrid>

在代码后端添加这些行
        public void dgvCombobox_Loaded(Object sender, RoutedEventArgs e)
        {
            ((ComboBox)sender).DropDownClosed -= ComboBox_OnDropDownClosed;
            ((ComboBox)sender).DropDownClosed += new System.EventHandler(ComboBox_OnDropDownClosed);
        }

        void ComboBox_OnDropDownClosed(object sender, System.EventArgs e)
        {
            dgvFieldsMapping.Focus();
        }

这样,我只是在关闭相应的下拉菜单后将焦点从ComboBox移开到外部DataGrid,因此我不需要添加任何虚拟的FrameWorkElement。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接