Wpf 如何找到滑块的拇指来设置其宽度

Wpf 如何找到滑块的拇指来设置其宽度,wpf,slider,rangeslider,Wpf,Slider,Rangeslider,我创建了一个“范围滑块”从三个滑块控制堆叠在彼此的顶部。基本思想是从这里开始,它使用两个滑块 我正在添加第三个滑块,它的拇指将填充另一个滑块的拇指之间的空间。用户将能够拖动该中心拇指移动两端,并保持两端之间的恒定间距 XAML只是三个滑块。让它很好地分层的秘密在于使用一个控制模板(这里没有重新划分。你可以在上面的URL中找到它) 当拖动任一外拇指时,我需要调整中心拇指的大小,以填充两个末端拇指之间的空间 在后面的代码中,我可以捕捉到拇指的移动,我可以找到中间滑块控件,但我不知道如何通过编程

我创建了一个“范围滑块”从三个滑块控制堆叠在彼此的顶部。基本思想是从这里开始,它使用两个滑块

我正在添加第三个滑块,它的拇指将填充另一个滑块的拇指之间的空间。用户将能够拖动该中心拇指移动两端,并保持两端之间的恒定间距

XAML只是三个滑块。让它很好地分层的秘密在于使用一个控制模板(这里没有重新划分。你可以在上面的URL中找到它)


当拖动任一外拇指时,我需要调整中心拇指的大小,以填充两个末端拇指之间的空间

在后面的代码中,我可以捕捉到拇指的移动,我可以找到中间滑块控件,但我不知道如何通过编程到达中间滑块的拇指,以便调整其大小以填充两个外部拇指之间的空间

private void UpperSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
         Slider slider= (Slider) this.FindName("MiddleSlider");
        // how to find the middleSlider thumb so I can set
        // it's width to fill the space between the outer thumbs
    }
private void UpperSlider\u值已更改(对象发送方,RoutedPropertyChangedEventArgs e)
{
Slider Slider=(Slider)this.FindName(“MiddleSlider”);
//如何找到中间滑块拇指以便设置
//它的宽度填充外部拇指之间的空间
}
谢谢你的建议

米奇

这应该可以做到:

var track = (Track)slider.Template.FindName("PART_Track", slider);
var thumb = track.Thumb;
thumb.Width = fittingWidth;
(顺便说一句,我不会这样做,我会将a应用于另外两个滑块和一个计算宽度的转换器)

private void UpperSlider\u值已更改(对象发送器,RoutedProperty更改Deventargs e)
{
Slider Slider=(Slider)FindName(“MiddleSlider”);
Track Track=slider.Template.FindName(“PART_Track”,slider)作为轨迹;
如果(磁道!=null)
{
矩形thumbRectangle=track.Thumb.Template.FindName(“Rect1”,track.Thumb)为矩形;
if(拇指矩形!=null)
{
thumbRectangle.Width=CalculateWidth();
}
}
}

谢谢@H.B.这是我所缺少的概念。为了给将来的读者提供完整的示例,thumb也是模板化的,所以我需要以同样的方式检索它的表示形式?这应该是可能的,无需跳入拇指的模板。无论如何,如果这回答了你的问题,你可以接受我答案左边的复选框。我只想补充一点,计算中间拇指的宽度来填充两个外拇指之间的空间是复杂的,因为随着拇指宽度的增加,拇指左右移动的像素数减少。这是因为滑块在拇指的左边缘到达控件的左边缘时停止拇指。拇指较宽时,拇指的中心移动。解决方案是计算两个外拇指的位置(以像素为单位),然后计算滑块.Value,该值将中间拇指定位在两个外拇指之间。
轨迹
位于
System.Windows.Controls.Primitives
命名空间中。
var track = (Track)slider.Template.FindName("PART_Track", slider);
var thumb = track.Thumb;
thumb.Width = fittingWidth;
    private void UpperSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        Slider slider = (Slider) FindName("MiddleSlider");
        Track track = slider.Template.FindName("PART_Track", slider) as Track;
        if (track != null)
        {
            Rectangle thumbRectangle = track.Thumb.Template.FindName("Rect1", track.Thumb) as Rectangle;
            if (thumbRectangle != null)
            {
                thumbRectangle.Width = CalculateWidth();
            }
        }
    }