2017-02-17 118 views
1

Sliderの値をマウスホイールに変更したい:スクロールアップすると、Slider'sValueプロパティが増加し、スクロールダウンすると減少するはずです。
この動作は、マウスの位置または現在のフォーカスに依存しないようにする必要があります。マウスホイールでスライダの値を変更する方法は?

好ましくは、このソリューションはバインディングを使用し、XAMLのみですが、コードビハインドソリューションでも十分です。

答えて

2

あなたは親WindowPreviewMouseWheelイベントをフックしSliderの値を設定し、付属の行動を使用することができます。

添付の動作を使用すると、各ビューのコードビハインドファイルを変更することなく、機能をカプセル化して任意のSliderコントロールで再利用できます。

参考のための例です。

public class MouseWheelBehavior 
{ 
    public static double GetValue(Slider slider) 
    { 
     return (double)slider.GetValue(ValueProperty); 
    } 

    public static void SetValue(Slider slider, double value) 
    { 
     slider.SetValue(ValueProperty, value); 
    } 

    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.RegisterAttached(
     "Value", 
     typeof(double), 
     typeof(MouseWheelBehavior), 
     new UIPropertyMetadata(0.0, OnValueChanged)); 

    public static Slider GetSlider(UIElement parentElement) 
    { 
     return (Slider)parentElement.GetValue(SliderProperty); 
    } 

    public static void SetSlider(UIElement parentElement, Slider value) 
    { 
     parentElement.SetValue(SliderProperty, value); 
    } 

    public static readonly DependencyProperty SliderProperty = 
     DependencyProperty.RegisterAttached(
     "Slider", 
     typeof(Slider), 
     typeof(MouseWheelBehavior)); 


    private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     Slider slider = d as Slider; 
     slider.Loaded += (ss, ee) => 
     { 
      Window window = Window.GetWindow(slider); 
      if (window != null) 
      { 
       SetSlider(window, slider); 
       window.PreviewMouseWheel += Window_PreviewMouseWheel; 
      } 
     }; 
     slider.Unloaded += (ss, ee) => 
     { 
      Window window = Window.GetWindow(slider); 
      if(window != null) 
      { 
       SetSlider(window, null); 
       window.PreviewMouseWheel -= Window_PreviewMouseWheel; 
      } 
     }; 
    } 

    private static void Window_PreviewMouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     Window window = sender as Window; 
     Slider slider = GetSlider(window); 
     double value = GetValue(slider); 
     if(slider != null && value != 0) 
     { 
      slider.Value += slider.SmallChange * e.Delta/value; 
     } 
    } 
} 

使用法:

<Slider local:MouseWheelBehavior.Value="120" /> 
1

私はバインディングまたはXAMLでそれを行うための方法を見つけることができませんでしたが、これはかなり単純なコードビハインドソリューションは、動作します:

MyPanel.PreviewMouseWheel += (sender, e) 
    => MySlider.Value += MySlider.SmallChange * e.Delta/120; 

ノートのいくつかの点:

  • MyPanelは任意のControlすることができ。ホイールを使用しているときにマウスがControlを超えるとイベントが発生します。
  • MouseWheelまたはPreviewMouseWheelのいずれかのイベントを使用できます。後者の場合、のようにMouseWheelイベントを処理する他のコントロールがあると便利です。
  • Deltaは、マウスホイールを1チックアップすると値120を保持します。したがって、予想される動作を得るには、この値で除算する必要があります。
  • MySlider.Valueがコード内のプロパティにバインドされている場合は、Sliderを直接変更するのではなく、プロパティの値を調整する必要があります。
+1

あなたは親ウィンドウのPreviewMouseWheelイベントをフックし、スライダーの値を設定し、付属の行動を使用することができます。https://www.codeproject.com/Articles/28959/WPFでのアタッチメントビヘイビアの導入添付されたビヘイビアを使用すると、各ビューのコードビハインドファイルを変更することなく、機能をカプセル化して任意のSliderコントロールに再利用することができます。完全なサンプルが必要な場合はお知らせください。 – mm8

関連する問題