我想将Slider
的值更改为鼠标滚轮:当我向上滚动时,Slider's
Value
属性应该增加,当我向下滚动时,它应该减少。
行为应该与鼠标位置或当前焦点无关。
优选地,解决方案使用绑定并且仅是XAML,但是代码隐藏解决方案也足够。
答案 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
之上时,将触发该事件。MouseWheel
或PreviewMouseWheel
事件。如果有其他控件处理MouseWheel
事件(如ScrollViewer
),则后者更方便。Delta
将保持值120
。因此,您必须除以此值才能获得预期的行为。MySlider.Value
绑定到代码中的属性,则应调整属性的值,而不是直接更改Slider
。