具有十进制格式的 WPF 自定义文本框
WPF Custom TextBox with Decimal Formatting
我是 WPF 新手。
我有一个要求,我需要开发一个自定义文本框控件,它应该支持如下功能:
应该只接受十进制值。
通过代码或用户分配值时应四舍五入到小数点后 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;
}
}
我是 WPF 新手。 我有一个要求,我需要开发一个自定义文本框控件,它应该支持如下功能:
应该只接受十进制值。
通过代码或用户分配值时应四舍五入到小数点后 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;
}
}