2010-06-25 4 views
6

WPF 스크롤 막대 썸 요소의 크기 조정과 관련된 알고리즘을 시도하고 있습니다.스크롤 막대 설정 엄지 손가락 크기

엄지 요소는 Scrollbar.ViewportSize 속성을 사용하여 크기를 지정할 수 있지만 차례로 Scrollbar.MinimumScrollbar.Maximum 값과 관련됩니다. 내가 지금까지 발견 한 무엇

은 다음과 같습니다

최소

010의 ViewportSize 최대 :

0 - 엄지 손가락의 최소 크기
5 - 엄지 약 25 사용 가능한 트랙의 %
10 - 사용 가능한 트랙의 약 50 % 가용
100 - 사용 가능한 트랙의 약 75 % Thumb 약 1000 - 사용 가능한 트랙의 Thumb 약 90 %
10000 - Thumb이 사용 가능한 트랙을 채 웁니다.

[참고 :!이 수치는 내 거친 시행 착오에서 전용]

가 이상적으로 내가 좋아하는 것은 스크롤 막대 나는 엄지 손가락을 설정할 수의 최소 및 최대 값을 부여하는 알고리즘을 가질 수 있도록 크기는 사용 가능한 트랙의 정확히 x %가됩니다.

사람이 함께 도와 드릴까요?

감사합니다.

+0

트랙 길이

public class TouchScrollBar : System.Windows.Controls.Primitives.ScrollBar { #region Fields #region Dependency properties public static readonly DependencyProperty MinThumbLengthProperty = DependencyProperty.Register ("MinThumbLength", typeof(double), typeof(TouchScrollBar), new UIPropertyMetadata((double)0, OnMinThumbLengthPropertyChanged)); #endregion private double? m_originalViewportSize; #endregion #region Properties public double MinThumbLength { get { return (double)GetValue(MinThumbLengthProperty); } set { SetValue(MinThumbLengthProperty, value); } } #endregion #region Constructors public TouchScrollBar() { SizeChanged += OnSizeChanged; } private bool m_trackSubscribed; void OnSizeChanged(object sender, SizeChangedEventArgs e) { SubscribeTrack(); } private void SubscribeTrack() { if (!m_trackSubscribed && Track != null) { Track.SizeChanged += OnTrackSizeChanged; m_trackSubscribed = true; } } #endregion #region Protected and private methods #region Event handlers #region Dependency properties event handlers private void OnMinThumbLengthPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { TouchScrollBar instance = d as TouchScrollBar; if(instance != null) { instance.OnMinThumbLengthChanged(e); } } #endregion protected void OnTrackSizeChanged(object sender, SizeChangedEventArgs e) { SubscribeTrack(); UpdateViewPort(); } protected override void OnMaximumChanged(double oldMaximum, double newMaximum) { base.OnMaximumChanged(oldMaximum, newMaximum); SubscribeTrack(); UpdateViewPort(); } protected override void OnMinimumChanged(double oldMinimum, double newMinimum) { base.OnMinimumChanged(oldMinimum, newMinimum); SubscribeTrack(); UpdateViewPort(); } protected void OnMinThumbLengthChanged(DependencyPropertyChangedEventArgs e) { SubscribeTrack(); UpdateViewPort(); } #endregion private void UpdateViewPort() { if(Track != null) { if(m_originalViewportSize == null) { m_originalViewportSize = ViewportSize; } double trackLength = Orientation == Orientation.Vertical ? Track.ActualHeight : Track.ActualWidth; double thumbHeight = m_originalViewportSize.Value/(Maximum - Minimum + m_originalViewportSize.Value) * trackLength; if (thumbHeight < MinThumbLength && !double.IsNaN(thumbHeight)) { ViewportSize = (MinThumbLength * (Maximum - Minimum))/(trackLength + MinThumbLength); } } } #endregion } 

}의 비율을 충당하기 위해 스크롤 엄지를 설정하기위한 유스 케이스를 볼 수 없습니다 .thumbSizePercent = Min (100, 100 * ViewportSize/(MaxValue-MinValue)) – Andy

답변

11

가입일 : trackLength × http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.track(VS.90).aspx

thumbSize = (viewportSize/(최대 - 최소 + viewportSize))

또는 viewportSize 피 배열 재 :

viewportSize = thumbSize × (최대 최소값)/(trackLength-thumbSize)

당신은 이미 이것을 발견했지만 다른 사람들이 여기에 올 경우를 대비하여 게시 할 것이라고 생각했습니다.

+1

상대 크기가 필요하면 다음을 수행하십시오.'viewportSize = (최대 - 최소) * p/(1 - p)', 여기서'p'는 0.0과 1.0 사이입니다. –

4

터치 입력에 터치 최적화를 위해 최소 크기의 엄지 손가락이 필요하기 때문에 저의 경우 엄지 최소 길이를 보존했습니다.

TouchScrollBar를 horisontal 및 vertical ScrollBar로 사용하는 ScrollViewer ControlTemplate을 정의 할 수 있습니다.

수학에 대한 UpdateViewPort 방법을 참조하십시오.

죄송합니다, 명시 적으로 당신은 단지 최소 및 최대에서 엄지 손가락 크기를 판별 할 수 없습니다

+2

Thumb의 MinWidth 또는 MinHeight를 설정하는 또 다른 방법은 다음과 같습니다. http://msdn.microsoft.com/en-us/library/bb613595.aspx – Kolky

+0

@Nadzzz : 코드에는 여러 가지 문제가 있으며 예상대로 작동합니다. 가장 중요한 점은 ScrollBar의 ViewportSize를 변경하면 목록의 항목 수가 변경 될 때 다시 계산되지 않습니다. 정적 레이아웃의 정적 데이터에만 사용할 수 있으며 런타임에 조금씩 바뀔 수있는 것은 아닙니다. – ygoe

+0

@Kolky : Microsoft의 사례도 효과가 없습니다. 그것은 모든 종류의 예외를 던집니다. 그것이 효과가 있다면 그것이 올바른 일을 할 것인지 아닌지 나는 모른다. 거기에 MinHeight 논리를 볼 수 없습니다. – ygoe

관련 문제