【问题标题】:How can I bind a winforms Opacity to a TrackBar (slider)如何将 winforms Opacity 绑定到 TrackBar(滑块)
【发布时间】:2010-04-02 16:29:48
【问题描述】:

我有一个带有BindingSource 的winform,它的DataSource 中有一个名为Opacity 的int 属性。我在winform 上还有一个TrackBar,我想用它来控制winform 的Opacity

我已经将TrackBar 上的Value 属性绑定到Opacity 并且功能正常,滑动TrackBar 会将变量从TrackBar.Minimum (0) 更改为TrackBar.Maximum (1 )。

我还将 winform 的 Opacity 属性绑定到此值,但是,因为 TrackBar 的值仅在 +/-1 而不是 +/- .1 中从最小值变为最大值(就像Opacity 一样),它没有正确淡化winform。相反,0 将使其不透明,1 将使其完全可见。

我需要一种在上述架构中工作的方法,但要让 TrackBar 以小于 1 的定义增量将其值从 0 更改为 1。

【问题讨论】:

    标签: c# winforms data-binding trackbar


    【解决方案1】:

    我认为最干净的方法是创建一个直接从TrackBar 继承的UserControl,它隐藏了ValueSmallChangeMinimumMaximumTickFrequency 属性具有同名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);
            }
        }
    }
    

    【讨论】:

    • 那可能很干净! +1 我避免这样做,因为出于某种原因,我在想“编写自己的 TrackBar”,而不仅仅是“扩展现有的 TrackBar”
    • 嗯,这比我的方法更性感,所以我将其标记为答案:)
    【解决方案2】:

    如果你是数据绑定,那么你有一个数据类,它有一个 double OpacityForSlider(或类似的东西),你已经将 TrackBarValue 绑定到。

    将滑块的最小值和最大值设置为 0-100 并将其添加到您的数据类中

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

    现在将您的 Winform 绑定到 Opacity,而不是 OpacityForSlider

    【讨论】:

    • 是的,我在发布问题时就想出了这种方法,尽管我喜欢你的方法,因为你真的明白了问题的核心,“我如何从TrackBar 获得我想要的值”。你的更灵活,可以重复使用很多
    猜你喜欢
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多