C# – hoe voorkom ik scrollen met het muiswiel in mijn combobox?

Ik heb een combobox en ik wil voorkomen dat de gebruiker met het muiswiel door de items scrollt.

Is er een gemakkelijke manier om dat te doen?

(C#, VS2008)


Antwoord 1, autoriteit 100%

Gebruik de gebeurtenis MouseWheelvoor uw ComboBox:

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

Opmerking: je moet een evenement in code maken:

comboBox1.MouseWheel += new MouseEventHandler(comboBox1_MouseWheel);

Antwoord 2, autoriteit 4%

Voor WPF, behandel in plaats daarvan de gebeurtenis PreviewMouseWheel.

Het zou ook een goed idee zijn om ComboBox.IsDropDownOpente overwegen, zodat de gebruiker de muis nog steeds kan scrollen als er veel items in de selectie zijn wanneer de ComboBoxis uitgevouwen.

Een ander ding is om hetzelfde gedrag toe te passen in de hele applicatie.

Ik doe meestal al het bovenstaande met de volgende code:

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;
}

Antwoord 3

Ik gebruik een andere oplossing die ook werkt op Mono.

Het doel is om per ongeluk scrollen te voorkomen (dat is wanneer de gebruiker niet naar de comboBox kijkt wanneer hij het muiswiel gebruikt). Als hij / zij buiten het zichtbare gedeelte van comboBox scrolt, zou de combobox niet moeten scrollen, anders zou het moeten.

Mijn oplossing:

  • Plaats een alleen-lezen tekstvak buiten het zichtbare gedeelte van het scherm. In form_load plaatste ik de regel: hiddenTextbox.left = -100 ;

  • Stel de focus in op dit tekstvak wanneer de muis de keuzelijst met invoervak ​​verlaat met behulp van mouse leave-gebeurtenis. In comboBox1_MouseLeave plaatste ik de regel: hiddenTextbox.focus();

  • MouseWheel-gebeurtenis afhandelen: From1.MouseWheel += Form1_MouseWheel;
    textBoxHidden.MouseWheel += Form1_MouseWheel;


Antwoord 4

Mijn Combobox’s werden op de volgende manier in een DataGrid [C#, WPF XAML] geplaatst:

   <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>

Dus wanneer een vervolgkeuzelijst werd gesloten na het selecteren van een waarde, scrolde het muiswiel door de items van die combobox en wijzigde mijn selectie.

Uiteindelijk heb ik mijn XAML aangepast om er zo uit te zien:

   <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>

En het toevoegen van deze regels in codebehind

       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();
        }

Op deze manier verplaats ik de focus gewoon weg van de ComboBox naar de buitenste DataGrid nadat ik de bijbehorende vervolgkeuzelijst heb gesloten, dus ik hoef geen dummy FrameWorkElement toe te voegen

Other episodes