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

C# 如何在鼠标上方显示垂直线?,c#,wpf,templates,xaml,slider,C#,Wpf,Templates,Xaml,Slider,我试图在光标的X位置显示一条垂直线。我试着用一个滑动控制来做,但是我做不到。这将在用户将光标放在其上时显示 我只知道我需要修改模板。这么做有那么难吗?如果没有,你能帮我吗? 谢谢。 此参考应为您提供解决问题所需的所有信息 干杯 此参考应为您提供解决问题所需的所有信息 干杯 这不容易使用模板实现,因为鼠标位置不是依赖属性,鼠标移动不是路由事件。这实际上取决于你想做什么,如果它只是显示一条垂直线,那么我同意Dany使用装饰条,因为你对滑块本身并不感兴趣。但是,如果要将拇指移动到鼠标所在的位置,我将

我试图在光标的X位置显示一条垂直线。我试着用一个滑动控制来做,但是我做不到。这将在用户将光标放在其上时显示

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

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

干杯

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


干杯

这不容易使用模板实现,因为鼠标位置不是依赖属性,鼠标移动不是路由事件。这实际上取决于你想做什么,如果它只是显示一条垂直线,那么我同意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"/>

使用模板很难做到这一点,因为鼠标位置不是依赖属性,鼠标移动也不是路由事件。这实际上取决于你想做什么,如果它只是显示一条垂直线,那么我同意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"/>


仅链接的答案不是好答案。如果链接过时了,那么答案就没用了。你能为答案添加足够的信息,以便OP可以决定该链接是否值得关注。仅链接的答案不是好答案。如果链接过时了,那么答案就没用了。你能在答案中添加足够的信息,这样OP就可以决定这个链接是否值得关注。这个人(提问者)正在做的事情的一小部分可能重复。。。这家伙(发问者)正在做的事情的一小部分可能重复。。。