2012-01-17 7 views
1

J'essaie d'afficher une ligne verticale en position X du curseur. J'essaye de faire cela dans un contrôle de curseur, mais je n'ai pas pu le faire. Cela sera montré pendant que l'utilisateur a son curseur dessus. Je sais seulement que j'ai besoin de modifier le gabarit. Est-ce que c'est tellement difficile de faire ça? Si non, pouvez-vous m'aider? Merci.Comment afficher une ligne verticale sur la souris?

+0

double possible d'une fraction de ce que ce gars-là (questionneur) fait .. http://stackoverflow.com/questions/7764421/onmousemove-does-not-fire-on-canvas-in-wpf/7766111#7766111 –

Répondre

1

Cela n'est pas facile à obtenir en utilisant un modèle parce que la position de la souris n'est pas une propriété de dépendance et que le déplacement de la souris n'est pas un événement routé. Cela revient vraiment à ce que vous voulez faire, si c'est juste pour montrer une ligne verticale si la souris est alors je suis d'accord avec Dany pour utiliser des ornements, car vous n'êtes pas vraiment intéressé par le curseur lui-même. Cependant, si c'est pour déplacer le pouce à l'endroit où se trouve la souris, j'utiliserais une propriété attachée. La raison pour laquelle j'utilise les propriétés attachées plutôt que d'accrocher les événements directement sur le contrôle est qu'il fournit une base de code plus modulaire et réutilisable et rend plus évident l'effet visuel dans le XAML, plutôt que de devoir regarder le code C# ainsi que.

Voici ce que je suggère

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;   
    } 
} 

Et vous pouvez alors l'utiliser dans votre XAML comme si. Ainsi, lorsque vous réglez ce paramètre vrai que nous accrochons à l'événement de déplacement de la souris sur le curseur et changer sa valeur si le pouce suit la souris

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

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

cette référence devrait vous donner toutes les informations nécessaires pour résoudre votre problème

acclamations!

+3

Seules les réponses de lien ne sont pas de bonnes réponses. Si le lien devient vicié alors la réponse devient inutile. Pouvez-vous ajouter suffisamment d'informations à la réponse pour que le PO puisse décider si le lien mérite d'être suivi ou non. – ChrisF

Questions connexes