如何在鼠标上显示垂直线?

时间:2012-01-17 22:38:21

标签: c# wpf templates xaml slider

我正试图在光标的X位置显示一条垂直线。我试图在滑块控件中这样做,但我无法做到。这将在用户将光标放在其上时显示。

我只知道我需要修改模板。这么难吗?如果没有,你能帮助我吗? 感谢。

2 个答案:

答案 0 :(得分: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"/>

答案 1 :(得分:0)

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

此引用应为您提供解决问题所需的所有信息

喝彩!