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

时间:2017-02-17 09:34:20

标签: c# .net wpf slider mousewheel

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

优选地,解决方案使用绑定并且仅是XAML,但是代码隐藏解决方案也足够。

2 个答案:

答案 0 :(得分:4)

您可以使用附加行为来挂接父PreviewMouseWheel的{​​{1}}事件,并设置Window的值。

使用附加行为使您可以封装功能并将其重用于任何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;
        }
    }
}

答案 1 :(得分:1)

我找不到使用绑定或XAML的方法,但这个相当简单的代码隐藏解决方案有效:

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

有些注意事项:

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