获取滑块的拇指

7
我正在尝试找出一种在WPF中获取滑块拇指的方法,类似于以下内容:
Slider mySlider = new Slider();

Thumb thumb = slider.Thumb;

现在我知道这并不像这么简单;但一定有一个解决方法。如果你知道任何方法,请告诉我。

谢谢!

3个回答

12

Slider有一个TemplatePartAttribute,声明它应该有一个名为PART_Track的模板部分,类型为TrackTrack可以给我们提供对Thumb的引用。请记住,有可能给Slider应用没有Track的模板,在这种情况下将没有Thumb

private static Thumb GetThumb(Slider slider)
{
    var track = slider.Template.FindName("PART_Track", slider) as Track;
    return track == null ? null : track.Thumb;
}

3
在我的情况下,slider.Template == null,我现在该怎么做? - Cuero
当滑块的模板为空时,有什么解决方案吗? - deathrace

3

如果您只想向拇指添加事件处理程序,并且不想等待或强制呈现以避免slider.Templatenull,则可以执行以下操作:

slider.AddHandler(Thumb.DragStartedEvent, new DragStartedEventHandler((sender, e) =>
{
    // Handling code
}));

这在包含滑块的自定义控件的OnApplyTemplate中运行良好。我尝试过的其他所有鼠标事件都适用于整个自定义控件 - 而不仅仅是滑块。 :) - Alan Wayne

2

我自己找到了解决方案,稍微借助了一下VisualTreeHelper。非常感谢任何优化建议:

private Thumb Thumb
{
    get
    {
        return GetThumb(this /* the slider */ ) as Thumb;;
    }
}

private DependencyObject GetThumb(DependencyObject root)
{
    if (root is Thumb)
        return root;

    DependencyObject thumb = null;

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
    {
        thumb = GetThumb(VisualTreeHelper.GetChild(root, i));

        if (thumb is Thumb)
            return thumb;
    }

    return thumb;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接