为什么ProgressBar.SetValue引发具有有效值的ArgumentException
本文关键字:有效值 ArgumentException ProgressBar SetValue 为什么 | 更新日期: 2023-09-27 18:22:08
我使用的是WPF的ProgressBar对象,它有一个Value属性,我可以向它传递一个常量int或十进制值,它不会抱怨,但如果我向它传递浮点(或int或字符串)变量值,它会向我发出ArgumentException(例如"Message='0.02380952' is not a valid value for property 'Value'."
),这对我来说似乎很荒谬,让我不知所措。下面的MS示例使用常量浮点值。然而,MS文档对Value属性的引用说它是一个int,这似乎是错误的,因为我可以将它传递为常量.1或.5并获得正确的行为,而我的MS示例使用0和1以及最小值和最大值。那么,我需要在这里做什么?
我的代码:
xaml:
<ProgressBar x:Name="prgProgress" Width="200" Height="20" Minimum="0" Maximum="100" />
c#:
float numMems = ListToShow.Count;
float numDone = 0.0f;
int fracDone = 0;
string sProgress = "0%";
foreach (RAM_Member mem in ListToShow)
{
if (isCanceled == true) break;
mem.CalculateValues();
numDone++;
fracDone = (int)(100.0 * numDone / numMems);
sProgress = (100 * numDone / numMems).ToString("0.") + "%";
Dispatcher.BeginInvoke(DispatcherPriority.Background, (SendOrPostCallback)delegate { prgProgress.SetValue(ProgressBar.ValueProperty, fracDone); }, null);
Dispatcher.BeginInvoke(DispatcherPriority.Background, (SendOrPostCallback)delegate { txtProgress.SetValue(TextBlock.TextProperty, sProgress); }, null);
}
如果链接到windows窗体等效项,在WPF中它是一个double,这意味着如果使用SetValue
,则需要使用该确切类型,因为没有隐式转换。
来自SetValue
:
如果提供的类型与最初注册时为依赖项属性声明的类型不匹配,则会引发异常。值参数应始终作为适当的类型提供。
(为什么不使用包装器呢?即prgProgress.Value = fracDone
)