如何使用鼠标滚轮更改滑块的值?

How to change a Slider's Value with the mouse wheel?

我想将 Slider 的值更改为鼠标滚轮:当我向上滚动时,Slider's Value 属性 应该增加,当我滚动时下来,应该会减少。
该行为应独立于鼠标位置或当前焦点。

该解决方案最好使用绑定并且仅 XAML 但代码隐藏解决方案也足够了。

我找不到使用绑定或 XAML 来完成此操作的方法,但这个相当简单的 code-behind 解决方案有效:

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

一些注意事项:

  • MyPanel 可以是任何 Control。当使用滚轮时鼠标位于此 Control 上方时将触发该事件。
  • 您可以使用 MouseWheelPreviewMouseWheel 事件。如果有其他控件处理 MouseWheel 事件(如 ScrollViewer),则后者更方便。
  • 当您将鼠标滚轮向上移动一个刻度时,
  • Delta 将保持值 120。所以你必须除以这个值才能得到预期的行为。
  • 如果 MySlider.Value 在您的代码中绑定到 属性,您应该调整 属性 的值而不是直接更改 Slider

您可以使用连接父 WindowPreviewMouseWheel 事件并设置 Slider.

的值的附加行为

使用附加行为使您能够封装功能并将其重新用于任何 Slider 控件,而无需修改每个视图的 code-behind 文件。

这里有一个例子供大家参考。

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