我有一个下拉框,我想防止用户使用鼠标滚轮滚动项目。
有没有简单的方法可以做到这一点?
(C#,VS2008)
我有一个下拉框,我想防止用户使用鼠标滚轮滚动项目。
有没有简单的方法可以做到这一点?
(C#,VS2008)
使用 MouseWheel 事件来处理组合框的鼠标滚轮:
void comboBox1_MouseWheel(object sender, MouseEventArgs e) {
((HandledMouseEventArgs)e).Handled = true;
}
注意:您将需要在代码中创建事件:
comboBox1.MouseWheel += new MouseEventHandler(comboBox1_MouseWheel);
PreviewMouseWheel
事件。ComboBox.IsDropDownOpen
,以便用户在展开ComboBox
时可以使用鼠标滚动浏览大量选项。<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;
}
我使用了另一种在Mono上也可行的解决方案。
目标是防止意外滚动(即当用户使用鼠标滚轮时没有看着组合框)。如果他/她滚动到组合框的可见部分之外,则组合框不应滚动,否则应该滚动。
我的解决方案:
在屏幕可见部分之外放置一个只读文本框。在form_load中,我放置了这一行代码:hiddenTextbox.left = -100 ;
当鼠标离开组合框时,将焦点设置到此文本框中,使用鼠标离开事件。在comboBox1_MouseLeave中,我放置了这一行代码:hiddenTextbox.focus();
处理mouseWheel事件:From1.MouseWheel += Form1_MouseWheel;textBoxHidden.MouseWheel += Form1_MouseWheel;
我的组合框被放置在一个数据网格中[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。
InitializeComponent();
后面加上以下代码:comboBox1.MouseWheel += (o, e) => ((HandledMouseEventArgs)e).Handled = true;
这行代码可以阻止鼠标滚轮改变 ComboBox 的值。 - Jeremy Sorensenobject sender,System.Windows.Input.MouseWheelEventArgs e
,而且您不必将e转换为HandledMouseEventArgs。 - chinookf