首页 > 解决方案 > 进度条中具有负最小值的 C# 表单

问题描述

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

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

标签: c#formsvisual-studiowinforms

解决方案


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

你不能。从文档中

例外

参数异常

为属性指定的值小于 0。

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

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

然后,当您设置 的当前值时,您还需要考虑这一点ProgressBar,例如:

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

上述策略可以封装在UserControl包装 a 的 a 中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,并且其他属性相应地偏移,无论最小值是负数还是正数。这使代码保持美观和简单,而不是试图分别处理消极和积极的情况。


推荐阅读