Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9703

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

$
0
0

動機

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

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


Viewing all articles
Browse latest Browse all 9703

Trending Articles