Как я могу показать вертикальную линию при наведении мыши? - PullRequest
1 голос
/ 18 января 2012

Я пытаюсь показать вертикальную линию в позиции X курсора.Я пытаюсь сделать это с помощью ползунка, но я не смог этого сделать.Это будет показано, пока пользователь наведет на него курсор.

Я знаю только то, что мне нужно изменить шаблон.Это так сложно сделать?Если нет, можете ли вы помочь мне?Спасибо.

Ответы [ 2 ]

1 голос
/ 18 января 2012

Нелегко достичь с помощью шаблонов, потому что положение мыши не является свойством зависимости, а перемещение мыши не является перенаправленным событием.Это действительно сводится к тому, что вы хотите сделать, если просто показать вертикальную линию, если мышь, тогда я согласен с Дэни использовать украшения, так как вы на самом деле не заинтересованы в самом слайдере.Однако, если он перемещает большой палец туда, где находится мышь, я бы использовал прикрепленное свойство.

Причина, по которой я использую вложенные свойства вместо того, чтобы подключать события непосредственно к элементу управления, заключается в том, что он обеспечивает более модульную и многоразовую работукодовая база и делает его более очевидным из визуального эффекта в 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 голосов
/ 18 января 2012

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

эта ссылка должна предоставить вам всю необходимую информацию для решения вашей проблемы

ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...