Как найти большой палец слайдера, чтобы установить его ширину - PullRequest
2 голосов
/ 11 мая 2011

Я создаю «ползунок диапазона» из трех элементов управления ползунка, расположенных друг над другом.Основная идея заключается в том, что здесь используются два ползунка.

http://www.thejoyofcode.com/Creating_a_Range_Slider_in_WPF_and_other_cool_tips_and_tricks_for_UserControls_.aspx

Я добавляю третий ползунок, большой палец которого заполнит пространство между большими пальцами от другого ползунка.Пользователь сможет перетащить этот центральный большой палец, чтобы переместить два конца и поддерживать постоянное расстояние между двумя концами.

XAML - это просто три ползунка.Секрет того, чтобы сделать его хорошо наслоенным, заключается в использовании шаблона элемента управления (здесь не перепечатано. Вы можете найти его по указанному выше URL).

<Grid VerticalAlignment="Top">
    <Border BorderThickness="0,1,0,0" BorderBrush="Green" VerticalAlignment="Center" Height="1" 
            Margin="5,0,5,0"/>

    <Slider x:Name="LowerSlider"
            Minimum="{Binding ElementName=root, Path=Minimum}"
            Maximum="{Binding ElementName=root, Path=Maximum}"
            Value="{Binding ElementName=root, Path=LowerValue, Mode=TwoWay}"
            Margin="0,0,0,0"
            Template="{StaticResource simpleSlider}"
            />

    <Slider x:Name="MiddleSlider"
            Minimum="{Binding ElementName=root, Path=Minimum}"
            Maximum="{Binding ElementName=root, Path=Maximum}"
            Value="{Binding ElementName=root, Path=MiddleValue, Mode=TwoWay}"
            Margin="10,0,0,0"
            Template="{StaticResource simpleSlider}"
            >
   </Slider>

    <Slider x:Name="UpperSlider"
            Minimum="{Binding ElementName=root, Path=Minimum}"
            Maximum="{Binding ElementName=root, Path=Maximum}"
            Value="{Binding ElementName=root, Path=UpperValue, Mode=TwoWay}"
            Margin="20,0,0,0"
            Template="{StaticResource simpleSlider}"
            />
</Grid>

При перетаскивании любого большого пальца мне нужно изменить размер центрального пальца, чтобы заполнить пространство между двумя концами большого пальца.

В приведенном ниже коде я могу уловить движениебольшой палец, и я могу найти средний ползунок, но я не могу понять, как программно добраться до большого пальца среднего ползунка, чтобы я мог изменить его размер, чтобы заполнить пространство между двумя внешними большими пальцами.

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
    }

Спасибо за любые идеи,

Митч

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Это должно сделать это:

var track = (Track)slider.Template.FindName("PART_Track", slider);
var thumb = track.Thumb;
thumb.Width = fittingWidth;

( Кстати, я бы так не поступил, я бы применил MultiBinding к двум другимползунки и конвертер, который вычисляет ширину от этого )

1 голос
/ 11 мая 2011
    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();
            }
        }
    }
...