2010-06-25 14 views
6

Sto tentando di elaborare l'algoritmo associato al ridimensionamento dell'elemento pollice della barra di scorrimento WPF.Impostazione della barra di scorrimento Dimensioni pollice

L'elemento pollice può essere dimensionata utilizzando la proprietà Scrollbar.ViewportSize, ma a sua volta è correlato ai valori Scrollbar.Minimum e Scrollbar.Maximum.

Quello che ho scoperto finora è:

per un minimo e un massimo di e , un ViewportSize di:

0 - Thumb dimensione minima
5 - Thumb circa 25 % la traccia disponibile
10 - Thumb circa il 50% della traccia disponibile
100 - Thumb circa il 75% della traccia disponibile
1000 - Pollice circa il 90% della traccia disponibile
10000 - Il pollice riempie la traccia disponibile.

[Nota: queste cifre sono solo dal mio processo di massima ed errori]

Idealmente mi piacerebbe essere in grado di avere un algoritmo in cui dati i valori minimo e massimo per la barra di scorrimento è possibile impostare il pollice la dimensione deve essere esattamente x% della traccia disponibile.

Qualcuno può aiutare con questo?

Grazie.

+0

Non è possibile determinare la dimensione del pollice da solo Min e Max .È inoltre necessaria la dimensione relativa della vista (quanto dall'intervallo [Min, Max] si adatta alla vista): thumbSizePercent = Min (100, 100 * ViewportSize/(MaxValue-MinValue)) – Andy

risposta

11

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

THUMBSIZE = (ViewportSize/(minima o massima + ViewportSize)) × trackLength

o ri-disponendone ViewportSize:

ViewportSize = thumbSize × (valore massimo minimo)/(trackLength-thumbSize)

Hai già trovato questo problema ma ho pensato di postare nel caso in cui altri finissero qui.

+1

Se è necessaria solo la dimensione relativa: 'viewportSize = (massimo - minimo) * p/(1 - p) ', dove' p' è compreso tra 0.0 e 1.0. –

4

Da parte mia, ho conservato una lunghezza minima del pollice perché gli input touch richiedono un pollice di una dimensione minima per essere ottimizzati al tocco.

È possibile definire un ControlTemplate ScrollViewer che utilizzerà il TouchScrollBar come barra di scorrimento orizzontale e verticale.

Vedere Metodo UpdateViewPort per la matematica.

Siamo spiacenti, non vedo il caso d'uso per impostare in modo esplicito il pollice barra di scorrimento per coprire una percentuale della lunghezza della pista

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

Qui viene mostrato un altro modo per impostare MinWidth o MinHeight of Thumb: http://msdn.microsoft.com/en-us/library/bb613595.aspx – Kolky

+0

@Nadzzz: il tuo codice ha un numero di problemi e non funziona come previsto a tutti. Più importante, si modifica ViewportSize della ScrollBar e non verrà mai più calcolato quando il numero di elementi nell'elenco cambia. Questo può funzionare solo per i dati statici in un layout statico, non tutto ciò che potrebbe cambiare un po 'in fase di esecuzione. – ygoe

+0

@Kolky: anche questo esempio di Microsoft non funziona. Genera ogni tipo di eccezione. Non so se farebbe la cosa giusta, se funzionasse. Non riesco a vedere alcuna logica di MinHeight. – ygoe

Problemi correlati