web-dev-qa-db-ja.com

C#-コンボボックスでマウスホイールスクロールを防ぐにはどうすればよいですか?

コンボボックスがあり、ユーザーがマウスホイールでアイテムをスクロールできないようにします。

それを行う簡単な方法はありますか?

(C#、VS2008)

56
Pygmy

ComboBoxに MouseWheel イベントを使用します。

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

注:コードでイベントを作成する必要があります。

comboBox1.MouseWheel += new MouseEventHandler(comboBox1_MouseWheel);
103
Jay Riggs

WPFの場合は、代わりにPreviewMouseWheelイベントを処理します。

また、ComboBox.IsDropDownOpenを考慮することをお勧めします。そうすると、ComboBoxが展開されているときに選択範囲に多くのアイテムがある場合、ユーザーはマウススクロールを使用できます。

もう1つは、同じ動作をアプリケーション全体に適用することです。

通常、次のコードを使用して上記のすべてを実行します。

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;
}
1
Jan Paolo Go

Monoでも動作する別のソリューションを使用します。

目標は、誤ってスクロールするのを防ぐことです(つまり、マウスホイールを使用しているときにユーザーがcomboBoxを見ていない場合)。ユーザーがcomboBoxの表示部分の外側にスクロールする場合、コンボボックスはスクロールしません。そうでない場合はスクロールします。

私の解決策:

  • 画面の表示部分の外側に読み取り専用のテキストボックスを配置します。 form_loadに次の行を配置しました:hiddenTextbox.left = -100;

  • Mouse leaveイベントを使用して、マウスがコンボボックスを離れるときにこのテキストボックスにフォーカスを設定します。 comboBox1_MouseLeaveに次の行を配置しました:hiddenTextbox.focus();

  • MouseWheelイベントの処理:From1.MouseWheel + = Form1_MouseWheel; textBoxHidden.MouseWheel + = Form1_MouseWheel;

0
Eduard