【发布时间】:2021-07-14 03:56:13
【问题描述】:
我需要显示一个具有负值的进度条,但是当我尝试将值修改为负数时,c# 会出现错误(无效属性错误)。有谁知道创建负值进度条的方法吗?
HPHeroi.Maximum = CriacaoDePersonagem.protagonista.status.Vida;
HPHeroi.Minimum = -20;
【问题讨论】:
标签: c# forms visual-studio winforms
我需要显示一个具有负值的进度条,但是当我尝试将值修改为负数时,c# 会出现错误(无效属性错误)。有谁知道创建负值进度条的方法吗?
HPHeroi.Maximum = CriacaoDePersonagem.protagonista.status.Vida;
HPHeroi.Minimum = -20;
【问题讨论】:
标签: c# forms visual-studio winforms
有谁知道创建负值进度条的方法吗?
你不能。来自the documentation:
例外情况
为属性指定的值小于 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,其他属性相应偏移,无论最小值是负数还是正数。这使代码保持美观和简单,而不是试图分别处理负面和正面的情况。
【讨论】:
ProgressBar,您必须不要尝试为进度条使用负值。时期。如果您有范围将包含负数,则上述内容正是您必须执行的操作。如果您想要一个接受负数的进度条,您需要切换到 WPF,或者您需要从头开始编写自己的进度条实现......
UserControl 完成,它在内部使用 ProgressBar,并执行我上面显示的映射)。
正如彼得所说,进度条不能容纳负数。因此,您不能为此使用进度条。
我的建议是,不要使用进度条,而是使用轨迹栏并禁用它(将其 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的行下方,以便用户知道该值何时为正,何时为负。
【讨论】:
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 会显示这一点。
【讨论】: