2012-01-17 76 views
1

我想顯示光標位置X的垂直線。我試圖在滑塊控件中這樣做,但我無法做到。這將顯示,而用戶有它的光標。如何在鼠標上顯示垂直線?

我只知道我需要修改模板。這麼做很難嗎?如果沒有,你能幫我嗎? 謝謝。

+0

可能重複改變其值.. 。http://stackoverflow.com/questions/7764421/onmousemove-does-not-fire-on-canvas-in-wpf/7766111#7766111 – 2012-01-18 04:27:23

回答

1

由於鼠標位置不是依賴項屬性,並且鼠標移動不是路由事件,因此使用模板化並不容易。這真的歸結爲你想做什麼,如果它只是顯示一條垂直線,那麼我是否同意Dany使用裝飾者,因爲你對滑動本身並不感興趣。但是,如果要將拇指移到鼠標所在的位置,我將使用附加屬性。

我使用附加屬性而不是直接在控件上掛接事件的原因是它提供了更多的模塊化和可重用的代碼庫,並使它在XAML中的視覺效果更加明顯,而不需要查看C#代碼以及。

這裏就是我會建議

public class SliderHelperPackage 
{ 
    public static readonly DependencyProperty BindThumbToMouseProperty = DependencyProperty.RegisterAttached(
     "BindThumbToMouse", typeof(bool), typeof(SliderHelperPackage), new PropertyMetadata(false, OnBindThumbToMouseChanged)); 

    public static void SetBindThumbToMouse(UIElement element, bool value) 
    { 
     element.SetValue(BindThumbToMouseProperty, value); 
    } 

    public static bool GetBindThumbToMouse(UIElement element) 
    { 
     return (bool)element.GetValue(BindThumbToMouseProperty); 
    } 

    private static void OnBindThumbToMouseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if (e.NewValue.Equals(e.OldValue)) 
      return; 

     var slider = d as Slider; 

     if (slider == null) 
      throw new ArgumentException(@"dependency object must be a slider", "d"); 

     if ((bool) e.NewValue) 
     { 
      slider.MouseMove += SliderMouseMove; 
     } 
     else 
     { 
      slider.MouseMove -= SliderMouseMove; 
     } 
    } 

    static void SliderMouseMove(object sender, MouseEventArgs e) 
    { 
     var slider = (Slider) sender; 
     var position = e.GetPosition(slider); 
     // When the mouse moves, we update the slider's value so it's where the ticker is (we take into account margin's on the track)  
     slider.Value = (slider.Maximum - slider.Minimum)*Math.Max(position.X-5,0)/(slider.ActualWidth-10) + slider.Minimum;   
    } 
} 

然後你就可以用它在你的XAML像這樣。所以,當你設置爲true,我們掛接到滑塊上的鼠標移動事件,因此拇指跟隨鼠標的這傢伙(提問者)做的一小部分的

<Slider SliderPosn:SliderHelperPackage.BindThumbToMouse="True" Margin="5" Height="25" VerticalAlignment="Top"/> 
0

http://www.codeproject.com/KB/WPF/adornedcontrol.aspx

此引用應該給你所有必要的信息,以解決您的問題

喝彩!

+3

只有鏈接的答案不是很好的答案。如果鏈接失效,那麼答案就變得毫無用處。你能否將足夠的信息添加到答案中,以便OP可以決定該鏈接是否值得關注。 – ChrisF 2012-01-17 23:02:23