動機
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" />
お手軽にホイールを無効化できますね。依存関係プロパティにしているのでバインディングもできます。便利!