2017-02-17 33 views
1

我想將Slider的值更改爲鼠標滾輪:當向上滾動時,應該增加屬性,當向下滾動時,它應該減少。
該行爲應該與鼠標位置或當前焦點無關。如何用鼠標滾輪更改滑塊的值?

優選地,解決方案使用綁定並且僅僅是XAML,但是代碼隱藏解決方案也足夠了。

回答

2

你可以使用附加的行爲掛接了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" /> 
1

我無法找到綁定或XAML做這件事的方式,但這個相當簡單的代碼隱藏解決方案的工作原理:

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

注意一些事情:

  • MyPanel可以是任何Control 。當鼠標在使用輪子時高於此Control時,事件將會觸發。
  • 您可以使用MouseWheelPreviewMouseWheel事件。如果有其他控件處理MouseWheel事件(如ScrollViewer),後者更方便。
  • Delta將保持價值120當您移動鼠標滾輪一滴。所以你必須除以這個值才能得到預期的行爲。
  • 如果MySlider.Value必將在你的代碼的屬性,你應該調整直接更改Slider的屬性值來代替。
+1

你可以使用附加的行爲是掛接父窗口的PreviewMouseWheel事件,並設置Slider的值:https://www.codeproject.com/Articles/28959 /介紹到附-行爲功能於WPF。使用附加的行爲使您能夠封裝的功能和重用它的任何滑塊控制,而無需修改每個視圖的代碼隱藏文件。讓我知道你是否需要一個完整的樣本。 – mm8