【问题标题】:How can I show a vertical line on mouse over?如何在鼠标悬停时显示垂直线?
【发布时间】:2012-01-17 22:38:20
【问题描述】:

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

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

【问题讨论】:

标签: c# wpf templates xaml slider


【解决方案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"/>

【讨论】:

    【解决方案2】:

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

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

    干杯!

    【讨论】:

    • 仅链接的答案不是好的答案。如果链接失效,那么答案将变得毫无用处。您能否在答案中添加足够的信息,以便 OP 决定该链接是否值得关注。
    猜你喜欢
    • 1970-01-01
    • 2020-01-05
    • 2017-03-06
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2013-12-12
    相关资源
    最近更新 更多