具有十进制格式的 WPF 自定义文本框

WPF Custom TextBox with Decimal Formatting

我是 WPF 新手。 我有一个要求,我需要开发一个自定义文本框控件,它应该支持如下功能:

  1. 应该只接受十进制值。

  2. 通过代码或用户分配值时应四舍五入到小数点后 3 位。

  3. 应在焦点上显示完整值(无格式)。

例如:

如果将 2.21457 分配给文本框(通过代码或用户),它应该显示 2.215。当用户单击它进行编辑时,它必须显示完整值 2.21457。 在用户将值编辑为 5.42235 并跳出后,它应该再次四舍五入为 5.422。

试过了,没有成功。所以需要一些帮助。 在此先感谢您的帮助。

谢谢

我已经编写了一个自定义控件,它将具有名为 ActualText 的依赖项 属性。将您的值绑定到该 ActualText 属性 并在 gotfocus 和 lostfocus 事件期间操纵文本框的 Text 属性。还在 PreviewTextInput 事件中验证十进制数。参考下面的代码。

 class TextBoxEx:TextBox
{
    public string ActualText
    {
        get { return (string)GetValue(ActualTextProperty); }
        set { SetValue(ActualTextProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ActualText.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ActualTextProperty =
        DependencyProperty.Register("ActualText", typeof(string), typeof(TextBoxEx), new PropertyMetadata(string.Empty, OnActualTextChanged));

    private static void OnActualTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TextBox tx = d as TextBox;
        tx.Text = (string)e.NewValue;
        string str = tx.Text;            
        double dbl = Convert.ToDouble(str);
        str = string.Format("{0:0.###}", dbl);
        tx.Text = str;
    }

    public TextBoxEx()
    {
        this.GotFocus += TextBoxEx_GotFocus;
        this.LostFocus += TextBoxEx_LostFocus;
        this.PreviewTextInput += TextBoxEx_PreviewTextInput;
    }

    void TextBoxEx_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
    {
        decimal d;
        if(!decimal.TryParse(e.Text,out d))
        {
            e.Handled = true;
        }
    }        

    void TextBoxEx_LostFocus(object sender, System.Windows.RoutedEventArgs e)
    {
        ConvertText();
    }

    void TextBoxEx_GotFocus(object sender, System.Windows.RoutedEventArgs e)
    {
        this.Text = ActualText;
    }

    private void ConvertText()
    {
        string str = this.Text;
        ActualText = str;
        double dbl = Convert.ToDouble(str);
        str = string.Format("{0:0.###}", dbl);
        this.Text = str;
    }
}