4

如何设置 NumericUpDown 控件以将值显示为百分比?

4

2 回答 2

5

您必须派生自己的自定义控件并覆盖该UpdateEditText()方法。在此过程中,让我们覆盖默认值Minimum、、MaximumIncrement属性值,使其对百分比更加友好。

我们还需要重写基本ParseEditText()方法以将用户生成的输入解释为百分比(除以 100),因为用户希望输入80来表示80%(并且 Decimal 解析器需要忽略百分比符号)。

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

我们可以通过添加一个TextFormat属性来稍微扩展类的范围,我们可以在其中设置我们希望在设计时使用的数字显示格式,以便我们可以支持将值显示为货币,例如。

不过,上面的代码很好,很紧凑,专门针对百分比,利用了现有的DecimalPlaces属性。该Value属性存储为百分比的数学表示(例如,0.5 表示 50%),因此插入公式很简单,无需担心除以 100。

于 2013-02-06T06:05:37.073 回答
2

对这个问题的快速简单的回答:使用DecimalUpDown扩展 WPF 工具包,而不是NumericUpDown(应该注意,NumericUpDown 也被列为过时)。然后,您需要做的就是Maximum="1" Minimum="0.01" Increment="0.01" FormatString="P0"在 XAML 中设置。我假设这个问题是关于扩展 WPF 工具包的,因为上面的答案是针对它的。

例子:

<xctk:DecimalUpDown Maximum="1" Minimum="0.01" Value="0.01" Increment="0.01" FormatString="P0" />

显示:

DecimalUpDown 示例

于 2015-12-02T18:07:01.547 回答