2010-06-25 117 views
6

我正在嘗試制定與WPF滾動條大拇指元素大小相關的算法。設置滾動條縮略大小

可以使用Scrollbar.ViewportSize屬性來確定大小元素的大小,但它又與Scrollbar.MinimumScrollbar.Maximum值有關。

我迄今發現的是:

最少和和,的ViewportSize最大:

0 - 拇指最小尺寸
5 - 拇指約25可用軌道的百分比
10 - 大約可用軌道的50%
100 - 大約可用軌道的75%
1000 - 拇指大約90%的可用軌跡
10000 - 拇指填充可用軌跡。

[注:這些數字僅僅是從我粗略的試驗和錯誤]

理想我想能有地方給出的最小值和最大值爲滾動我可以設置拇指的算法大小恰好是可用軌道的x%。

任何人都可以幫忙嗎?

謝謝。

+0

你不能只從最小值和最大值確定拇指大小的百分比。您還需要相對視口大小(視口中[Min,Max]間隔多少):thumbSizePercent = Min(100,100 * ViewportSize /(MaxValue-MinValue)) – Andy 2010-06-25 08:37:28

回答

11

來自: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之間。 – 2012-03-26 08:48:26

4

在我身邊,我保留了最小拇指長度,因爲觸摸輸入需要最小尺寸的拇指進行觸摸優化。

您可以定義一個ScrollViewer ControlTemplate,它將使用TouchScrollBar作爲其水平和垂直ScrollBar。

請參閱數學的UpdateViewPort方法。

對不起,我沒有看到用例明確設置滾動條拇指覆蓋軌道長度

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 
} 

}

+2

另一種設置Thumb的MinWidth或MinHeight的方法如下所示:http://msdn.microsoft.com/en-us/library/bb613595.aspx – Kolky 2012-02-08 12:14:24

+0

@Nadzzz:你的代碼有很多問題,不會按預期工作。最重要的是,您可以更改ScrollBar的ViewportSize,並且當列表中的項目數發生更改時,將永遠不會再計算它。這隻適用於靜態佈局中的靜態數據,而不適用於運行時可能會稍微改變的任何內容。 – ygoe 2014-06-11 08:36:42

+0

@Kolky:微軟的這個例子也不起作用。它拋出各種例外。我不知道它是否會做正確的事情,如果它工作的話。我看不到任何MinHeight邏輯。 – ygoe 2014-06-11 09:06:37