【问题标题】:C# Forms with negative minimum value in progress bar进度条中具有负最小值的 C# 表单
【发布时间】:2021-07-14 03:56:13
【问题描述】:

我需要显示一个具有负值的进度条,但是当我尝试将值修改为负数时,c# 会出现错误(无效属性错误)。有谁知道创建负值进度条的方法吗?

HPHeroi.Maximum = CriacaoDePersonagem.protagonista.status.Vida;
HPHeroi.Minimum = -20;

【问题讨论】:

    标签: c# forms visual-studio winforms


    【解决方案1】:

    有谁知道创建负值进度条的方法吗?

    你不能。来自the documentation

    例外情况

    ArgumentException

    为属性指定的值小于 0。

    相反,您需要做的是偏移进度条的整个范围以解释负值。例如:

    HPHeroi.Maximum = CriacaoDePersonagem.protagonista.status.Vida + 20;
    HPHeroi.Minimum = 0;
    

    那么你在设置ProgressBar的当前值时也需要考虑这一点,例如:

    HPHeroi.Value = CriacaoDePersonagem.protagonista.status.ActualVida + 20;
    

    上述策略可以封装在一个UserControl 中,该ProgressBar 包装了一个ProgressBar,暴露了各种与值相关的属性,但使用偏移量来确保实际的ProgressBar 对象不会看到负值。

    例如:

    public partial class ProgressBarWithNegativeValues : UserControl, INotifyPropertyChanged
    {
        private int _offset;
    
        public ProgressBarWithNegativeValues()
        {
            InitializeComponent();
        }
    
        public int Minimum
        {
            get => progressBar1.Minimum + _offset;
            set
            {
                int offsetChange = value - _offset;
    
                _offset = value;
                progressBar1.Maximum -= offsetChange;
                _RaisePropertyChanged();
            }
        }
    
        public int Maximum
        {
            get => progressBar1.Maximum + _offset;
            set
            {
                progressBar1.Maximum = value - _offset;
                _RaisePropertyChanged();
            }
        }
    
        public int Value
        {
            get => progressBar1.Value + _offset;
            set
            {
                progressBar1.Value = value - _offset;
                _RaisePropertyChanged();
            }
        }
    
        public int Step
        {
            get => progressBar1.Step;
            set
            {
                progressBar1.Step = value;
                _RaisePropertyChanged();
            }
        }
    
        public void Increment(int step) => progressBar1.Increment(step);
    
        public void PerformStep() => progressBar1.PerformStep();
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        private void _RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    我省略了*.Designer.cs 代码,因为这只是一个ProgressBar 对象放到UserControl 上,其Dock 属性设置为Fill

    注意上面ProgressBar.Minimum属性始终为0,其他属性相应偏移,无论最小值是负数还是正数。这使代码保持美观和简单,而不是试图分别处理负面和正面的情况。

    【讨论】:

    • 无济于事,因为我总是使用将进度条减小到 0 以下的命令,程序崩溃 =/
    • 对不起...我不明白您所说的“没有帮助”是什么意思。你别无选择,完全。如果您想使用内置的ProgressBar,您必须不要尝试为进度条使用负值。时期。如果您有范围将包含负数,则上述内容正是您必须执行的操作。如果您想要一个接受负数的进度条,您需要切换到 WPF,或者您需要从头开始编写自己的进度条实现......
    • ...(您可以将后者作为 UserControl 完成,它在内部使用 ProgressBar,并执行我上面显示的映射)。
    【解决方案2】:

    正如彼得所说,进度条不能容纳负数。因此,您不能为此使用进度条。

    我的建议是,不要使用进度条,而是使用轨迹栏并禁用它(将其 Enabled 属性设置为 false)。

    因此,想象HPHeroi 是一个TrackBar 对象:

    HPHeroi.Maximum = CriacaoDePersonagem.protagonista.status.Vida;
    HPHeroi.Minimum = -20;
    

    上面的代码不会导致运行时错误。

    请记住,当您达到最大值和最小值时,可能还会出现另外 2 个运行时错误。为了克服它们,在 HPHeroi 的值的每次减法和加法之前添加一个 if 语句(记住,它现在是一个 TrackBar)。

    减法的If语句示例:

    if (HPHeroi.Value > HPHeroi.Minimum)
        HPHeroi.Value--;
    

    加法的If语句示例:

    if (HPHeroi.Value < HPHeroi.Maximum)
        HPHeroi.Value++;
    

    附:如果你愿意,你可以添加一个以“0”为内容的标签,并将其放在轨迹栏中值为0的行下方,以便用户知道该值何时为正,何时为负。

    【讨论】:

      【解决方案3】:

      ProgressBar 的最小值为 0,但最大值可能非常高。 如果需要它表示负值,只需使用偏移量即可。

      int Offset = 20;
      HPHeroi.Maximum = CriacaoDePersonagem.protagonista.status.Vida + Offset;
      HPHeroi.Minimum = 0;
      

      设置 HPHeroi 的值时,只需将 Offset 添加到新值

      HPHeroi.Value = newvalue + Offset
      
      因此,

      newvalue 可以是从 -20 到 CriacaoDePersonagem.protagonista.status.Vida 的任何值,即您尝试指定的范围,您的 ProgressBar 会显示这一点。

      【讨论】:

        猜你喜欢
        • 2022-07-18
        • 1970-01-01
        • 2012-11-28
        • 2017-11-09
        • 1970-01-01
        • 2023-02-21
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        相关资源
        最近更新 更多