views:

201

answers:

2

I've got a winform with a BindingSource that has an int property named Opacity in its DataSource. I also have a TrackBar on the winform that I want to use to control the Opacity of the winform.

I've bound the Value property on the TrackBar to the Opacity and that functions just fine, sliding the TrackBar will change the variable from TrackBar.Minimum (0) to TrackBar.Maximum (1).

I've also bound the Opacity property of the winform to this value, however, since the TrackBar's values only go from Minimum to Maximum in +/-1 rather than +/- .1 or so (like Opacity does), it doesn't properly fade the winform. Instead, 0 will turn it opaque and 1 will turn it fully visible.

I need a way to work within the architecture described above, but get the TrackBar to change its value from 0 to 1 in defined increments smaller than 1.

+2  A: 

If you're databinding then you have a data class that has a double OpacityForSlider (or something similar) that you've bound the Value of the TrackBar to.

Set the sliders min and max to 0-100 and add this to your data class

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

Now bind your winforms Opacity to that, rather than OpacityForSlider

Allen
+1 I like yours better.
MusiGenesis
Wait a second - you're you!
MusiGenesis
Yah I figured out this approach right as I posted the question, though I like your approach because you really get at the meat of the question, "How do I get values I want from the `TrackBar`". Yours is more flexible and could be re-used alot
Allen
+1  A: 

I think the cleanest way to do this would be to create a UserControl that inherits directly from TrackBar, that hides the Value, SmallChange, Minimum, Maximum and TickFrequency properties with same-named double properties:

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);
        }
    }
}
MusiGenesis
That could be pretty clean! +1 I was avoiding that because for some reason I was thinking "write your own TrackBar" rather than just "extend the existing TrackBar"
Allen
Well this is sexier than my approach so I'm marking it as the answer :)
Allen