2012-01-17 16 views
1

カーソルの位置Xに縦線を表示しようとしています。私はスライダーコントロールでそれをやろうとしていますが、できませんでした。これは、ユーザーがその上にカーソルを置いている間に表示されます。マウスの上に縦線を表示するにはどうすればよいですか?

私は、テンプレートを変更する必要があることを知っています。それはそれほど難しいですか?そうでない場合は、私を助けることができますか?おかげさまで

+0

この男(質問者)が行っていることの一部を複製する可能性があります。 http://stackoverflow.com/questions/7764421/onmousemove-does-not-fire-on-canvas-in-wpf/7766111#7766111 –

答えて

1

これは、マウスの位置が依存プロパティではなく、マウスの移動がルーティングされたイベントではないため、テンプレートを使用して達成することは容易ではありません。あなたが本当にスライダーそのものに興味がないので、マウスがDanyと賛成であることに同意するかどうかを縦線で表示するだけであれば、これは本当にあなたがしたいことになります。ただし、親指をマウスのどこに移動するかは、添付プロパティを使用します。

コントロールで直接イベントを接続するのではなく、添付プロパティを使用する理由は、モジュール化され再利用可能なコードベースが多く提供され、C#コードを見る必要がなく、XAMLの視覚効果同じように。

は、ここで私は

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