2010-06-25 15 views
6

WPF Kaydırma Çubuğu başparmak öğesinin boyutlandırmasıyla ilişkili algoritmayı çalıştırmaya çalışıyorum.Kaydırma Çubuğunu Ayarlama Başparmak boyutu

Başparmak öğesi Scrollbar.ViewportSize özelliği kullanılarak boyutlandırılabilir, ancak bu, Scrollbar.Minimum ve Scrollbar.Maximum değerleriyle ilgilidir. Şimdiye kadar keşfettiler Ne

geçerli:

minimum

ve ve , bir ViewportSize Maksimum:

0 - Başparmak minimum boyut
5 - Başparmak yaklaşık 25 Kullanılabilir parçanın% 100'ü
10 - Mevcut parçadaki başparmak yaklaşık% 50 ...
100 - Şu anki parça yaklaşık olarak% 75 ...
1000 - Thumb mevcut parçanın yaklaşık% 90'ı
10000 - Başparmak mevcut parçayı doldurur.

[not:! Bu rakamlar benim kaba deneme yanılma kullanmıyor]

İdeal İsterdim Scrollbar ben başparmak ayarlayabilirsiniz için minimum ve maksimum değerleri verilen bir algoritma var edebilmek için boyut, mevcut parçanın tam olarak% x'i olacak.

Bu konuda yardımcı olabilecek herhangi biri var mı?

Teşekkürler.

+0

hat uzunluğu

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 } 

} yüzdesi kapsayacak şekilde kaydırma çubuğu başparmak ayarlama kullanım örneğini görmüyorum .Göreceli görüntü boyutuna da ihtiyacınız vardır ([Min, Maks] aralığından ne kadarının görünüm penceresine sığacağı): thumbSizePercent = Min (100, 100 * ViewportSize/(MaxValue-MinValue)) – Andy

cevap

11

kaynaktan: trackLength x http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.track(VS.90).aspx

thumbSize = (viewportSize/(maksimum minimum + viewportSize))

veya viewportSize için düzenlenmesi yeniden:

viewportSize = thumbSize × (maksimum minimum)/(trackLength-thumbSize)

Bunu zaten bulmuşsunuzdur, ancak başkalarının buraya gelmesi durumunda postalayacağımı düşündünüz.

+1

Sadece göreceli boyutlara ihtiyacınız varsa: 'viewportSize = (maksimum - minimum) * p/(1 - p) ', burada' p' 0.0 ile 1.0 arasındadır. –

4

Benim için, dokunmatik girişler, dokunma optimize edilecek minimum boyutta bir başparmak gerektirdiğinden, minimum başparmak uzunluğunu korudum.

TouchScrollBar'ı yatay ve dikey ScrollBar olarak kullanacak bir ScrollViewer ControlTemplate tanımlayabilirsiniz.

Matematik için UpdateViewPort yöntemine bakın.

Üzgünüm, açıkça sadece Min ve Max başparmak boyutunu belirleyemez

+2

Başparmak MinWidth veya MinHeight ayarlamak için başka bir yol burada gösterilmiştir: http://msdn.microsoft.com/en-us/library/bb613595.aspx – Kolky

+0

@Nadzzz: Kodunuz bir dizi sorun var ve olmaz hiç beklendiği gibi çalışın. En önemlisi, ScrollBar'ın ViewportSize'sini değiştirirsiniz ve listedeki öğe sayısı değiştiğinde bir daha asla hesaplanmayacaktır. Bu, statik bir düzende sadece statik veriler için çalışabilir, çalışma zamanında biraz değişebilecek bir şey değil. – ygoe

+0

@Kolky: Microsoft'tan gelen örnek de çalışmıyor. Her türlü istisna atar. Çalışırsa, doğru olanı yapıp yapmayacağını bilmiyorum. İçinde MinHeight mantığı göremiyorum. – ygoe