我添加了一个扩展的 WPF 工具包 DoubleUpDown 控件。行为是,如果您键入 5.35 就可以了。然后假设您键入 4.3errortext7 并按 Tab 将其恢复为 5.35(因为 4.3errortext7 不是有效数字)。
但是,在这种情况下,我希望它只是转到 4.37(并忽略无效字符。有没有一种优雅的方法来获得我所需的行为?
我能想到的最好的方法是使用 PreviewTextInput 事件并检查有效输入,不幸的是它仍然允许数字之间有空格,但会阻止输入所有其他文本。
private void doubleUpDown1_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
if (!(char.IsNumber(e.Text[0]) || e.Text== "." ))
{
e.Handled = true;
}
}
也许有点晚了,但我昨天遇到了同样的问题,而且我也不想每次使用控件时都注册一个处理程序。我将 Mark Hall 的解决方案与Attached Behavior
(受这篇文章的启发:http: //www.codeproject.com/Articles/28959/Introduction-to-Attached-Behaviors-in-WPF)混合:
public static class DoubleUpDownBehavior
{
public static readonly DependencyProperty RestrictInputProperty =
DependencyProperty.RegisterAttached("RestrictInput", typeof(bool),
typeof(DoubleUpDownBehavior),
new UIPropertyMetadata(false, OnRestrictInputChanged));
public static bool GetRestrictInput(DoubleUpDown ctrl)
{
return (bool)ctrl.GetValue(RestrictInputProperty);
}
public static void SetRestrictInput(DoubleUpDown ctrl, bool value)
{
ctrl.SetValue(RestrictInputProperty, value);
}
private static void OnRestrictInputChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
DoubleUpDown item = depObj as DoubleUpDown;
if (item == null)
return;
if (e.NewValue is bool == false)
return;
if ((bool)e.NewValue)
item.PreviewTextInput += OnPreviewTextInput;
else
item.PreviewTextInput -= OnPreviewTextInput;
}
private static void OnPreviewTextInput(object sender, TextCompositionEventArgs e)
{
if (!(char.IsNumber(e.Text[0]) ||
e.Text == CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator))
{
e.Handled = true;
}
}
}
然后你可以像这样简单地设置默认样式DoubleUpDown
:
<Style TargetType="xctk:DoubleUpDown">
<Setter Property="behaviors:DoubleUpDownBehavior.RestrictInput" Value="True" />
</Style>
就我而言,使用正则表达式要好得多。
private void UpDownBox_OnPreviewTextInput(object sender, TextCompositionEventArgs e)
{
var upDownBox = (sender as DoubleUpDown);
TextBox textBoxInTemplate = (TextBox)upDownBox.Template.FindName("PART_TextBox", upDownBox);
Regex regex = new Regex("^[.][0-9]+$|^[0-9]*[.]{0,1}[0-9]*$");
e.Handled = !regex.IsMatch(upDownBox.Text.Insert((textBoxInTemplate).SelectionStart, e.Text));
}