我有一个组合框,我想阻止用户使用鼠标滚轮滚动项目。
有一种简单的方法吗?
(C#,VS2008)
答案 0 :(得分:102)
使用ComboBox的MouseWheel事件:
void comboBox1_MouseWheel(object sender, MouseEventArgs e) {
((HandledMouseEventArgs)e).Handled = true;
}
注意:您必须在代码中创建事件:
comboBox1.MouseWheel += new MouseEventHandler(comboBox1_MouseWheel);
答案 1 :(得分:1)
对于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;
}
答案 2 :(得分:0)
我使用另一种也适用于Mono的解决方案。
目标是防止意外滚动(即用户在使用鼠标滚轮时没有看到comboBox)。如果他/她在comboBox的可见部分之外滚动,则组合框不应滚动,否则应该滚动。
我的解决方案:
在屏幕的可见部分外放置一个只读文本框。在form_load中,我放置了一行:hiddenTextbox.left = -100;
当鼠标离开使用鼠标离开事件的组合框时,将焦点设置为此文本框。在comboBox1_MouseLeave中我放置了一行:hiddenTextbox.focus();
处理mouseWheel事件:From1.MouseWheel + = Form1_MouseWheel; textBoxHidden.MouseWheel + = Form1_MouseWheel;
答案 3 :(得分:0)
我的组合框被放置在DataGrid [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>
因此,每当选择一个值后关闭DropDown时,鼠标滚轮就会滚动该组合框的项目并修改我的选择。
我最终将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();
}
通过这种方式,我只需在关闭其对应的DropDown之后将Focus从ComboBox移到外部DataGrid,所以不需要添加任何虚拟FrameWorkElement