Slider
の値をマウスホイールに変更したい:スクロールアップすると、Slider's
Value
プロパティが増加し、スクロールダウンすると減少するはずです。
この動作は、マウスの位置または現在のフォーカスに依存しないようにする必要があります。マウスホイールでスライダの値を変更する方法は?
好ましくは、このソリューションはバインディングを使用し、XAMLのみですが、コードビハインドソリューションでも十分です。
Slider
の値をマウスホイールに変更したい:スクロールアップすると、Slider's
Value
プロパティが増加し、スクロールダウンすると減少するはずです。
この動作は、マウスの位置または現在のフォーカスに依存しないようにする必要があります。マウスホイールでスライダの値を変更する方法は?
好ましくは、このソリューションはバインディングを使用し、XAMLのみですが、コードビハインドソリューションでも十分です。
あなたは親Window
のPreviewMouseWheel
イベントをフックし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" />
私はバインディングまたはXAMLでそれを行うための方法を見つけることができませんでしたが、これはかなり単純なコードビハインドソリューションは、動作します:
MyPanel.PreviewMouseWheel += (sender, e)
=> MySlider.Value += MySlider.SmallChange * e.Delta/120;
ノートのいくつかの点:
MyPanel
は任意のControl
することができ。ホイールを使用しているときにマウスがControl
を超えるとイベントが発生します。MouseWheel
またはPreviewMouseWheel
のいずれかのイベントを使用できます。後者の場合、のようにMouseWheel
イベントを処理する他のコントロールがあると便利です。Delta
は、マウスホイールを1チックアップすると値120
を保持します。したがって、予想される動作を得るには、この値で除算する必要があります。MySlider.Value
がコード内のプロパティにバインドされている場合は、Slider
を直接変更するのではなく、プロパティの値を調整する必要があります。
あなたは親ウィンドウのPreviewMouseWheelイベントをフックし、スライダーの値を設定し、付属の行動を使用することができます。https://www.codeproject.com/Articles/28959/WPFでのアタッチメントビヘイビアの導入添付されたビヘイビアを使用すると、各ビューのコードビハインドファイルを変更することなく、機能をカプセル化して任意のSliderコントロールに再利用することができます。完全なサンプルが必要な場合はお知らせください。 – mm8