2010-06-25 12 views
6

सेट करना मैं WPF स्क्रॉलबार अंगूठे तत्व के आकार के साथ जुड़े एल्गोरिदम को काम करने का प्रयास कर रहा हूं।स्क्रॉलबार थंब आकार

थंब तत्व को Scrollbar.ViewportSize संपत्ति का उपयोग करके आकार दिया जा सकता है, लेकिन यह बदले में Scrollbar.Minimum और Scrollbar.Maximum मानों से संबंधित है।

क्या मैं अब तक की खोज की है है:

एक न्यूनतम के लिए और के और , की एक ViewportSize अधिकतम:

0 - अंगूठे न्यूनतम आकार
5 - अंगूठे लगभग 25 उपलब्ध ट्रैक का%
10 - उपलब्ध ट्रैक का लगभग 50% अंगूठे
100 - उपलब्ध ट्रैक का लगभग 75% अंगूठे
1000 - थंब लगभग उपलब्ध 90% ट्रैक
10000 - थंब उपलब्ध ट्रैक भरता है।

[टिप्पणी: इन आंकड़ों मेरी किसी न किसी तरह परीक्षण और त्रुटि से ही कर रहे हैं]

आदर्श रूप में मैं चाहता हूँ एक एल्गोरिथ्म जहां स्क्रॉलबार मैं अंगूठे सेट कर सकते हैं के लिए न्यूनतम और अधिकतम मान दिया है करने के लिए सक्षम होने के लिए उपलब्ध ट्रैक का बिल्कुल एक्स% होना आकार।

क्या कोई इससे मदद कर सकता है?

धन्यवाद।

+0

तुम सिर्फ न्यूनतम और अधिकतम से अंगूठे के आकार निर्धारित नहीं कर सकता का एक प्रतिशत को कवर करने के लिए नहीं दिख रहा है ।आपको रिश्तेदार व्यूपोर्ट आकार (व्यूपोर्ट में [मिन, मैक्स] अंतराल से कितना फिट बैठता है) की आवश्यकता है): thumbSizePercent = Min (100, 100 * व्यूपोर्ट साइज/(मैक्सवेल्यू-मिनवैल्यू)) – Andy

उत्तर

11

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

thumbSize = (viewportSize/(अधिकतम-न्यूनतम + viewportSize)) trackLength ×

या viewportSize के लिए फिर से की व्यवस्था:

viewportSize = thumbSize × (अधिकतम-न्यूनतम)/(ट्रैकलेथ-थंब आकार)

आपको पहले से ही यह पता चला है लेकिन सोचा है कि अगर मैं दूसरों को यहां समाप्त कर देता हूं तो मैं पोस्ट करूंगा।

+1

यदि आपको केवल सापेक्ष आकार की आवश्यकता है: 'viewportSize = (अधिकतम - न्यूनतम) * पी/(1 - पी) ', जहां' पी' 0.0 और 1.0 के बीच है। –

4

मेरी तरफ, मैंने न्यूनतम अंगूठे की लंबाई को संरक्षित किया क्योंकि स्पर्श इनपुट को स्पर्श करने के लिए न्यूनतम आकार के अंगूठे की आवश्यकता होती है।

आप एक स्क्रॉलव्यूयर कंट्रोल टेम्पलेट को परिभाषित कर सकते हैं जो टचस्क्रॉलबार को इसके क्षैतिज और लंबवत स्क्रॉलबार के रूप में उपयोग करेगा।

गणित के लिए 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

थंब के मिनविड्थ या मिनहेइट को सेट करने का एक और तरीका यहां दिखाया गया है: http://msdn.microsoft.com/en-us/library/bb613595.aspx – Kolky

+0

@Nadzzz: आपके कोड में कई समस्याएं हैं और नहीं बिल्कुल उम्मीद के रूप में काम करते हैं। सबसे महत्वपूर्ण बात यह है कि आप स्क्रॉलबार के व्यूपोर्ट साइज को बदलते हैं और सूची में आइटम्स की संख्या में बदलाव होने पर इसकी गणना कभी नहीं की जाएगी। यह केवल स्थैतिक लेआउट में स्थिर डेटा के लिए काम कर सकता है, ऐसा कुछ नहीं जो रनटाइम पर थोड़ा सा बदल सकता है। – ygoe

+0

@ कोल्की: माइक्रोसॉफ्ट का यह उदाहरण भी काम नहीं करता है। यह सभी प्रकार के अपवाद फेंकता है। मुझे नहीं पता कि यह सही काम करेगा, अगर यह काम करता है। मैं इसमें कोई मिनीहेइट तर्क नहीं देख सकता हूं। – ygoe

संबंधित मुद्दे