2011-05-10 3 views
2

3 개의 슬라이더 컨트롤을 겹쳐서 "범위 슬라이더"를 만듭니다. 기본 개념은 여기에서 두 개의 슬라이더를 사용합니다.슬라이더의 썸을 찾아 폭을 설정하는 방법

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 
    } 

어떤 아이디어 주셔서 감사합니다,

미치

답변

3

이 그것을 수행해야합니다 그런데

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

(, 나는 이런 식으로하지 않을 것, 내가 적용됩니다 두 개의 다른 슬라이더에 MultiBinding과 너비를 계산하는 변환기)

+0

감사합니다. @ H.B. 그것이 내가 놓친 개념이다. 미래의 독자를위한 예제를 완성하기 위해, 엄지 손가락도 템플리트 화되어 있으므로 동일한 방식으로 표현을 검색해야했습니다. – Mitch

+0

너비 만 설정하고 싶다고 생각했는데? 그 엄지의 템플릿으로 다이빙없이 가능해야합니다. 어쨌든, 귀하의 질문에 대한 답변이 있다면 내 대답의 왼쪽에있는 체크 표시 개요를 사용하여 동의 할 수 있습니다. –

+0

엄지 손가락 폭이 증가함에 따라 엄지가 왼쪽과 오른쪽으로 이동하는 픽셀 수가 감소하기 때문에 두 개의 외측 엄지 손가락 사이의 간격을 채우는 가운데 가운데 엄지 손가락의 너비를 계산하는 것은 복잡합니다. 이는 엄지 손가락의 왼쪽 가장자리가 컨트롤의 왼쪽 가장자리에 도달 할 때 슬라이더가 엄지 손가락을 멈추게하기 때문입니다. 엄지가 더 넓 으면 엄지의 중심이 바뀝니다. 해결 방법은 두 개의 외부 엄지 손가락의 위치를 ​​픽셀 단위로 계산 한 다음 슬라이더를 계산하는 것입니다. 값은 두 개의 외부 엄지 손가락 사이에 가운데 엄지 손가락을 배치합니다. – Mitch

1
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(); 
      } 
     } 
    }