如何使用鼠标滚轮更改滑块的值?
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
上方时将触发该事件。
- 您可以使用
MouseWheel
或 PreviewMouseWheel
事件。如果有其他控件处理 MouseWheel
事件(如 ScrollViewer
),则后者更方便。
当您将鼠标滚轮向上移动一个刻度时,Delta
将保持值 120
。所以你必须除以这个值才能得到预期的行为。
- 如果
MySlider.Value
在您的代码中绑定到 属性,您应该调整 属性 的值而不是直接更改 Slider
。
您可以使用连接父 Window
的 PreviewMouseWheel
事件并设置 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" />
我想将 Slider
的值更改为鼠标滚轮:当我向上滚动时,Slider's
Value
属性 应该增加,当我滚动时下来,应该会减少。
该行为应独立于鼠标位置或当前焦点。
该解决方案最好使用绑定并且仅 XAML 但代码隐藏解决方案也足够了。
我找不到使用绑定或 XAML 来完成此操作的方法,但这个相当简单的 code-behind 解决方案有效:
MyPanel.PreviewMouseWheel += (sender, e)
=> MySlider.Value += MySlider.SmallChange * e.Delta / 120;
一些注意事项:
MyPanel
可以是任何Control
。当使用滚轮时鼠标位于此Control
上方时将触发该事件。- 您可以使用
MouseWheel
或PreviewMouseWheel
事件。如果有其他控件处理MouseWheel
事件(如ScrollViewer
),则后者更方便。
当您将鼠标滚轮向上移动一个刻度时, Delta
将保持值120
。所以你必须除以这个值才能得到预期的行为。- 如果
MySlider.Value
在您的代码中绑定到 属性,您应该调整 属性 的值而不是直接更改Slider
。
您可以使用连接父 Window
的 PreviewMouseWheel
事件并设置 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" />