動機
ComboBoxの標準の挙動って、フォーカスがある状態でマウスカーソルを乗せてホイールを回すと選択項目が順番に変わるんですよね。
これはこれで便利なのですが、無効化したいこともあると思います。なので、その方法を。
Stack Overflowより
Disable MouseWheel in editable ComboBox as ItemTemplate
この回答でほぼ解決なのですが、微妙に惜しいと思うので改良版を作ってみました。
ちなみに、e.Handled = true;以下の部分は親要素にホイールのイベントを発生させています。
これがないとComboBoxの上にカーソルがある時に、ホイールで親要素がスクロールしなくなります。
改良版
classComboBoxHelper:Behavior<ComboBox>{publicstaticreadonlyDependencyPropertyIsWheelDisabledProperty=DependencyProperty.RegisterAttached("IsWheelDisabled",typeof(bool),typeof(ComboBoxBehavior),newPropertyMetadata(false,PropertyChanged));publicstaticboolGetIsWheelDisabled(DependencyObjectobj){return(bool)obj.GetValue(IsWheelDisabledProperty);}publicstaticvoidSetIsWheelDisabled(DependencyObjectobj,boolvalue){obj.SetValue(IsWheelDisabledProperty,value);}privatestaticvoidPropertyChanged(DependencyObjectd,DependencyPropertyChangedEventArgse){varcomboBox=(ComboBox)d;if((bool)e.NewValue){comboBox.PreviewMouseWheel+=ComboBox_PreviewMouseWheel;}elseif(!(bool)e.NewValue){comboBox.PreviewMouseWheel-=ComboBox_PreviewMouseWheel;}}privatestaticvoidComboBox_PreviewMouseWheel(objectsender,MouseWheelEventArgse){varcomboBox=(ComboBox)sender;if(!comboBox.IsDropDownOpen){e.Handled=true;varparent=(FrameworkElement)comboBox.Parent;varargs=newMouseWheelEventArgs(e.MouseDevice,e.Timestamp,e.Delta){RoutedEvent=UIElement.MouseWheelEvent,Source=sender,};parent.RaiseEvent(args);}}}使い方
<ComboBoxComboBoxHelper.IsWheelDisabled="True"/>お手軽にホイールを無効化できますね。依存関係プロパティにしているのでバインディングもできます。便利!