15 votes

Réglage de la taille du pouce de la barre de défilement

Je tente de travailler sur l'algorithme associé au dimensionnement de l'élément de pouce de la barre de défilement WPF.

L'élément de pouce peut être dimensionné en utilisant la propriété Scrollbar.ViewportSize, mais elle est également liée aux valeurs Scrollbar.Minimum et Scrollbar.Maximum.

Voici ce que j'ai découvert jusqu'à présent :

Pour un Minimum et un Maximum de 0 et 10, une ViewportSize de :

0 - Taille minimale du pouce
5 - Pouce environ 25 % de la piste disponible
10 - Pouce environ 50 % de la piste disponible
100 - Pouce environ 75 % de la piste disponible
1000 - Pouce environ 90 % de la piste disponible
10000 - Pouce remplit la piste disponible.

[note : ces chiffres proviennent uniquement de mes essais approximatifs !]

Idéalement, j'aimerais avoir un algorithme où, étant donné les valeurs minimales et maximales de la barre de défilement, je pourrais définir la taille du pouce exactement x % de la piste disponible.

Quelqu'un peut-il m'aider avec ça ?

Merci.

16voto

Gavin S Points 115

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

thumbSize = (viewportSize/(maximum–minimum+viewportSize))×trackLength

ou en réorganisant pour viewportSize:

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

Vous avez probablement déjà trouvé ceci mais j'ai pensé le poster au cas où d'autres arriveraient ici.

4voto

Nadzzz Points 431

De mon côté, j'ai conservé une longueur de pouce minimale car les entrées tactiles nécessitent un pouce d'une taille minimale pour être optimisées pour le toucher.

Vous pouvez définir un ControlTemplate ScrollViewer qui utilisera TouchScrollBar comme sa barre de défilement horizontale et verticale.

Voir la méthode UpdateViewPort pour les calculs.

Désolé, je ne vois pas l'intérêt de définir explicitement la longueur du pouce de la barre de défilement pour couvrir un pourcentage de la longueur de la piste.

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
}

}

4voto

trigger_segfault Points 465

Voici une méthode qui remplacera la largeur minimale du pouce pour tous les ScrollBar. Il y a 2 raisons importantes d'utiliser cette configuration.

1) Cela ne redimensionnera pas les RepeatButton des ScrollBar. (Pourquoi le style remplace Track)

2) Cela ne redimensionnera que les pouces des contrôles Track utilisés dans les ScrollBar. (Pourquoi le style de Track est contenu dans un style ScrollBar).

    <Style.Resources>
        <Style TargetType="{x:Type Track}">
            <Style.Resources>
                <System:Double x:Key="{x:Static SystemParameters.VerticalScrollBarButtonHeightKey}">48</System:Double>
                <System:Double x:Key="{x:Static SystemParameters.HorizontalScrollBarButtonWidthKey}">48</System:Double>
            </Style.Resources>

            <Style.Resources>
                <Style TargetType="{x:Type Track}">
                    <Style.Resources>
                        <System:Double x:Key="{x:Static SystemParameters.VerticalScrollBarButtonHeightKey}">48</System:Double>
                        <System:Double x:Key="{x:Static SystemParameters.HorizontalScrollBarButtonWidthKey}">48</System:Double>
                    </Style.Resources>

1voto

sean Points 129

Si vous cherchez comment définir une hauteur minimale pour le pouce de la barre de défilement :

De Ian (da real MVP) ici :

scrollBar1.Track.ViewportSize = double.NaN;  
scrollBar1.Track.Thumb.Height = Math.Max(minThumbHeight, DataScrollBar.Track.Thumb.ActualHeight);

Ou bien, ajoutez 100+ lignes de code xaml parce que omgDATABINDING!!1!

0voto

hwu Points 1

Taille du pouce de la barre de défilement pour UWP :

    static void SetViewportSize(ScrollBar bar, double size)
    {
        var max = (bar.Maximum - bar.Minimum);
        bar.ViewportSize = size / (max - size) * max;
        bar.IsEnabled = (bar.ViewportSize >= 0 &&
            bar.ViewportSize != double.PositiveInfinity);
        InvalidateScrollBar(bar);
    }

    static void InvalidateScrollBar(ScrollBar bar)
    {
        var v = bar.Value;
        bar.Value = (bar.Value == bar.Maximum) ? bar.Minimum : bar.Maximum;
        bar.Value = v;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X