我想將Slider
的值更改爲鼠標滾輪:當向上滾動時,應該增加屬性,當向下滾動時,它應該減少。
該行爲應該與鼠標位置或當前焦點無關。如何用鼠標滾輪更改滑塊的值?
優選地,解決方案使用綁定並且僅僅是XAML,但是代碼隱藏解決方案也足夠了。
我想將Slider
的值更改爲鼠標滾輪:當向上滾動時,應該增加屬性,當向下滾動時,它應該減少。
該行爲應該與鼠標位置或當前焦點無關。如何用鼠標滾輪更改滑塊的值?
優選地,解決方案使用綁定並且僅僅是XAML,但是代碼隱藏解決方案也足夠了。
你可以使用附加的行爲掛接了PreviewMouseWheel
事件父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;
}
}
}
用法:
<Slider local:MouseWheelBehavior.Value="120" />
我無法找到綁定或XAML做這件事的方式,但這個相當簡單的代碼隱藏解決方案的工作原理:
MyPanel.PreviewMouseWheel += (sender, e)
=> MySlider.Value += MySlider.SmallChange * e.Delta/120;
注意一些事情:
MyPanel
可以是任何Control
。當鼠標在使用輪子時高於此Control
時,事件將會觸發。MouseWheel
或PreviewMouseWheel
事件。如果有其他控件處理MouseWheel
事件(如ScrollViewer
),後者更方便。Delta
將保持價值120
當您移動鼠標滾輪一滴。所以你必須除以這個值才能得到預期的行爲。MySlider.Value
必將在你的代碼的屬性,你應該調整直接更改Slider
的屬性值來代替。
你可以使用附加的行爲是掛接父窗口的PreviewMouseWheel事件,並設置Slider的值:https://www.codeproject.com/Articles/28959 /介紹到附-行爲功能於WPF。使用附加的行爲使您能夠封裝的功能和重用它的任何滑塊控制,而無需修改每個視圖的代碼隱藏文件。讓我知道你是否需要一個完整的樣本。 – mm8