LoginSignup
1
1

More than 3 years have passed since last update.

【WPF】ComboBox上でマウスホイールを回した時に項目が変わらないようにする

Last updated at Posted at 2020-04-01

動機

ComboBoxの標準の挙動って、フォーカスがある状態でマウスカーソルを乗せてホイールを回すと選択項目が順番に変わるんですよね。
これはこれで便利なのですが、無効化したいこともあると思います。なので、その方法を。

Stack Overflowより

Disable MouseWheel in editable ComboBox as ItemTemplate
この回答でほぼ解決なのですが、微妙に惜しいと思うので改良版を作ってみました。

ちなみに、e.Handled = true;以下の部分は親要素にホイールのイベントを発生させています。
これがないとComboBoxの上にカーソルがある時に、ホイールで親要素がスクロールしなくなります。

改良版

class ComboBoxHelper : Behavior<ComboBox>
{
    public static readonly DependencyProperty IsWheelDisabledProperty =
        DependencyProperty.RegisterAttached("IsWheelDisabled", typeof(bool), typeof(ComboBoxHelper), new PropertyMetadata(false, PropertyChanged));

    public static bool GetIsWheelDisabled(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsWheelDisabledProperty);
    }

    public static void SetIsWheelDisabled(DependencyObject obj, bool value)
    {
        obj.SetValue(IsWheelDisabledProperty, value);
    }

    private static void PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var comboBox = (ComboBox)d;

        if ((bool)e.NewValue)
        {
            comboBox.PreviewMouseWheel += ComboBox_PreviewMouseWheel;
        }
        else
        {
            comboBox.PreviewMouseWheel -= ComboBox_PreviewMouseWheel;
        }
    }

    private static void ComboBox_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        var comboBox = (ComboBox)sender;

        if (!comboBox.IsDropDownOpen)
        {
            e.Handled = true;

            var parent = (FrameworkElement)comboBox.Parent;
            var args = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
            {
                RoutedEvent = UIElement.MouseWheelEvent,
                Source = sender,
            };
            parent.RaiseEvent(args);
        }
    }
}

使い方

<ComboBox ComboBoxHelper.IsWheelDisabled="True" />

お手軽にホイールを無効化できますね。依存関係プロパティにしているのでバインディングもできます。便利!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1