如何将NumericUpDown控件设置为以百分比形式显示值?
UpdateEditText()
方法。与此同时,让我们重写默认的Minimum
、Maximum
和Increment
属性值,使它们更加友好地处理百分比。ParseEditText()
方法,将用户生成的输入解释为百分数(除以100),因为用户希望输入80来表示80%(而且十进制解析器需要忽略百分号)。Public Class PercentUpDown
Inherits NumericUpDown
Private Shared ReadOnly DefaultValue As New [Decimal](0.0) ' 0%
Private Shared ReadOnly DefaultMinimum As New [Decimal](0.0) ' 0%
Private Shared ReadOnly DefaultMaximum As New [Decimal](1.0) ' 100%
Private Shared ReadOnly DefaultIncrement As New [Decimal](0.01) ' 1%
Public Sub New()
Value = DefaultValue
Minimum = DefaultMinimum
Maximum = DefaultMaximum
Increment = DefaultIncrement
End Sub
Protected Overrides Sub UpdateEditText()
If UserEdit Then
ParseEditText()
End If
Text = Value.ToString(String.Format("p{0}", DecimalPlaces))
End Sub
Protected Shadows Sub ParseEditText()
Debug.Assert(UserEdit = True, "ParseEditText() - UserEdit == false")
Try
If Not String.IsNullOrWhiteSpace(Text) AndAlso _
Not (Text.Length = 1 AndAlso Text.Equals("-")) Then
Value = Constrain(Decimal.Parse(Text.Replace("%", String.Empty), NumberStyles.Any, CultureInfo.CurrentCulture) / 100)
End If
Catch ex As Exception
' Leave value as it is
Finally
UserEdit = False
End Try
End Sub
Private Function Constrain(origValue As [Decimal]) As [Decimal]
Debug.Assert(Minimum <= Maximum, "minimum > maximum")
If origValue < Minimum Then Return Minimum
If origValue > Maximum Then Return Maximum
Return origValue
End Function
End Class
DecimalUpDown
,而不是NumericUpDown
(需要注意的是,NumericUpDown也被列为过时)。然后你只需要在XAML中设置Maximum="1" Minimum="0.01" Increment="0.01" FormatString="P0"
。我假设这个问题是关于Extended WPF Toolkit的,因为上面的答案就是针对它的。<xctk:DecimalUpDown Maximum="1" Minimum="0.01" Value="0.01" Increment="0.01" FormatString="P0" />