为什么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);
}

为什么ProgressBar.SetValue引发具有有效值的ArgumentException

如果链接到windows窗体等效项,在WPF中它是一个double,这意味着如果使用SetValue,则需要使用该确切类型,因为没有隐式转换。

来自SetValue:

如果提供的类型与最初注册时为依赖项属性声明的类型不匹配,则会引发异常。值参数应始终作为适当的类型提供。

(为什么不使用包装器呢?即prgProgress.Value = fracDone