Question

J'ai un WinForm avec un BindingSource qui a une propriété int Opacity nommé dans son DataSource. J'ai aussi un TrackBar sur le WinForm que je veux utiliser pour contrôler la Opacity du WinForm.

Je suis lié la propriété Value sur le TrackBar au Opacity et qui fonctionne très bien, faisant glisser le TrackBar va changer la variable de TrackBar.Minimum (0) à TrackBar.Maximum (1).

J'ai aussi lié la propriété Opacity du WinForm à cette valeur, cependant, étant donné que les valeurs de l'TrackBar ne passe du minimum au maximum en +/- 1 au lieu de +/- 0,1 ou si (comme Opacity fait), il ne se décolore pas correctement la WinForm. Au lieu de cela, 0 tournera opaque et 1 tournera pleinement visible.

je besoin d'un moyen de travailler dans l'architecture décrite ci-dessus, mais obtenir le TrackBar pour changer sa valeur de 0 à 1 par incréments définis inférieurs à 1.

Était-ce utile?

La solution

Je pense que la plus propre façon de le faire serait de créer un UserControl qui hérite directement de TrackBar, qui cache les propriétés Value, SmallChange, Minimum, Maximum et TickFrequency ayant des propriétés double même nom:

public partial class DoubleTrackBar : TrackBar
{
    public DoubleTrackBar()
    {
        InitializeComponent();
    }

    private int _multiplier = 100;

    [Browsable(true)]
    public new double TickFrequency
    {
        get
        {
            return (double)base.TickFrequency / _multiplier;
        }
        set
        {
            base.TickFrequency = (int)(value * _multiplier);
        }
    }

    [Browsable(true)]
    public new double Minimum
    {
        get
        {
            return (double)base.Minimum / _multiplier;
        }
        set
        {
            base.Minimum = (int)(value * _multiplier);
        }
    }

    [Browsable(true)]
    public new double Maximum
    {
        get
        {
            return (double)base.Maximum / _multiplier;
        }
        set
        {
            base.Maximum = (int)(value * _multiplier);
        }
    }

    [Browsable(true)]
    public new double Value
    {
        get
        {
            return (double)base.Value / _multiplier;
        }
        set
        {
            base.Value = (int)(value * _multiplier);
        }
    }

    [Browsable(true)]
    public new double SmallChange
    {
        get
        {
            return (double)base.SmallChange / _multiplier;
        }
        set
        {
            base.SmallChange = (int)(value * _multiplier);
        }
    }
}

Autres conseils

Si vous databinding alors vous avez une classe de données qui a un double OpacityForSlider (ou quelque chose de similaire) que vous avez lié le Value du TrackBar à.

Régler les curseurs min et max à 0-100 et ajouter à votre classe de données

public double OpacityForForm
{
    get { return this.OpacityForSlider / 100; } 
}

Rabattre votre WinForms Opacity que, plutôt que OpacityForSlider

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top