Come posso associare un WinForms opacità ad un TrackBar (slider)
-
24-09-2019 - |
Domanda
Ho una WinForm con un BindingSource
che ha una proprietà di nome int Opacity
nella sua DataSource
. Ho anche un TrackBar
sul WinForm che voglio utilizzare per controllare il Opacity
della homepage.
Ho legato la proprietà Value
sul TrackBar
al Opacity
e che funzioni bene, trascinando il TrackBar
cambierà la variabile da TrackBar.Minimum
(0) per TrackBar.Maximum
(1).
Ho anche legato alla proprietà Opacity
del winform a questo valore, tuttavia, dal momento che i valori del TrackBar
solo andare dal minimo al massimo a +/- 1 invece di +/- 0,1 o giù di lì (come Opacity
fa), essa non svanisce correttamente il WinForm. Invece, 0 girerà opaco e 1 si accende completamente visibile.
Ho bisogno di un modo di lavoro all'interno dell'architettura descritta sopra, ma ottenere il TrackBar
per modificarne il valore da 0 a 1 con incrementi definiti minore di 1.
Soluzione
Penso che il modo più pulito per farlo sarebbe quello di creare un UserControl
che eredita direttamente da TrackBar
, che nasconde la proprietà Value
, SmallChange
, Minimum
, Maximum
e TickFrequency
con con lo stesso nome proprietà double
:
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);
}
}
}
Altri suggerimenti
Se stai associazione dati allora avete una classe di dati che ha un double OpacityForSlider
(o qualcosa di simile) che avete vincolato il Value
del TrackBar
a.
Imposta i cursori Min e Max per 0-100 e aggiungere questo alla tua classe di dati
public double OpacityForForm
{
get { return this.OpacityForSlider / 100; }
}
Ora vincolare il proprio WinForms Opacity
a che, piuttosto che OpacityForSlider