2010-06-25 30 views
6

Tôi đang cố gắng tìm ra thuật toán liên quan đến việc định kích thước của phần tử thumbbar Scrollbar WPF.Đặt kích thước Thumbbar Thumbbar

Yếu tố ngón tay cái có thể được định kích thước bằng thuộc tính Scrollbar.ViewportSize, nhưng lần lượt nó có liên quan đến các giá trị Scrollbar.MinimumScrollbar.Maximum.

Những gì tôi đã phát hiện ra cho đến nay là:

Đối với một giá tối thiểu và tối đa của và , một ViewportSize của:

0 - Thumb kích thước tối thiểu
5 - Thumb khoảng 25 % bài hát có sẵn
10 - Ngón tay cái khoảng 50% số bản nhạc có sẵn
100 - Ngón tay cái xấp xỉ 75% bản nhạc khả dụng
1000 - Ngón tay cái khoảng 90% số bản nhạc có sẵn
10000 - Ngón tay cái sẽ điền vào bản nhạc khả dụng.

[lưu ý: những con số này chỉ là thử nghiệm từ thô của tôi và lỗi]

Lý tưởng nhất là tôi muốn để có thể có một thuật toán mà đưa ra tối thiểu và giá trị tối đa cho Scrollbar tôi có thể thiết lập các ngón tay cái kích thước chính xác là x% của bản nhạc khả dụng.

Có ai có thể trợ giúp việc này không?

Cảm ơn.

+0

Bạn không thể xác định kích thước ngón tay cái từ Min và Max .Bạn cũng cần kích thước khung nhìn tương đối (bao nhiêu từ khoảng [Min, Max] vừa với khung nhìn): thumbSizePercent = Min (100, 100 * ViewportSize/(MaxValue-MinValue)) – Andy

Trả lời

11

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

thumbSize = (viewportSize/(lớn nhất- nhỏ nhất + viewportSize)) × trackLength

hoặc tái sắp xếp cho viewportSize:

viewportSize = thumbSize × (tối đa tối thiểu)/(trackLength-thumbSize)

Bạn đã tìm thấy điều này nhưng tôi nghĩ rằng tôi sẽ đăng trong trường hợp những người khác kết thúc ở đây.

+1

Nếu bạn chỉ cần kích thước tương đối: 'viewportSize = (tối đa - tối thiểu) * p/(1 - p) ', trong đó' p' nằm trong khoảng từ 0.0 đến 1.0. –

4

Về phía tôi, tôi giữ nguyên độ dài ngón tay cái tối thiểu vì đầu vào cảm ứng yêu cầu ngón tay cái có kích thước tối thiểu để được chạm tối ưu.

Bạn có thể xác định Bảng điều khiển ScrollViewer sẽ sử dụng TouchScrollBar làm ScrollBar horisontal và dọc của nó.

Xem phương thức UpdateViewPort cho phép tính.

Xin lỗi, tôi không thấy trường hợp sử dụng để thiết lập một cách rõ ràng ngón tay cái thanh cuộn để trang trải một phần trăm của chiều dài theo dõi

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

Một cách khác để đặt MinWidth hoặc MinHeight của Thumb được hiển thị tại đây: http://msdn.microsoft.com/en-us/library/bb613595.aspx – Kolky

+0

@Nadzzz: Mã của bạn có một số vấn đề và sẽ không làm việc như mong đợi ở tất cả. Quan trọng nhất, bạn thay đổi ViewportSize của ScrollBar và nó sẽ không bao giờ được tính lại khi số lượng các mục trong danh sách thay đổi. Điều này chỉ có thể làm việc cho dữ liệu tĩnh trong một sơ đồ bố trí tĩnh, không phải bất kỳ thứ gì có thể thay đổi một chút khi chạy. – ygoe

+0

@Kolky: Ví dụ đó từ Microsoft cũng không hoạt động. Nó ném tất cả các loại ngoại lệ. Tôi không biết liệu nó có làm đúng hay không, nếu nó hoạt động. Tôi không thể thấy bất kỳ logic MinHeight nào trong đó. – ygoe

Các vấn đề liên quan