using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Text.RegularExpressions;
namespace zl_screensaver
{
public static class TextBoxExtensions
{
public static readonly DependencyProperty IsNumericProperty =
DependencyProperty.RegisterAttached("IsNumeric", typeof(bool), typeof(TextBoxExtensions),
new PropertyMetadata(false, OnIsNumericChanged));
public static bool GetIsNumeric(DependencyObject obj)
{
return (bool)obj.GetValue(IsNumericProperty);
}
public static void SetIsNumeric(DependencyObject obj, bool value)
{
obj.SetValue(IsNumericProperty, value);
}
private static void OnIsNumericChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TextBox textBox = d as TextBox;
if (textBox == null) return;
if ((bool)e.NewValue)
{
textBox.PreviewTextInput += TextBox_PreviewTextInput;
DataObject.AddPastingHandler(textBox, OnPaste);
InputMethod.SetIsInputMethodEnabled(textBox, false); // 禁用输入法
}
else
{
textBox.PreviewTextInput -= TextBox_PreviewTextInput;
DataObject.RemovePastingHandler(textBox, OnPaste);
InputMethod.SetIsInputMethodEnabled(textBox, true); // 启用输入法
}
}
private static void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
if (!IsTextNumeric(e.Text))
{
e.Handled = true;
}
}
private static void OnPaste(object sender, DataObjectPastingEventArgs e)
{
if (e.DataObject.GetDataPresent(typeof(string)))
{
string text = (string)e.DataObject.GetData(typeof(string));
if (!IsTextNumeric(text))
{
e.CancelCommand();
}
}
else
{
e.CancelCommand();
}
}
private static bool IsTextNumeric(string text)
{
Regex regex = new Regex("[^0-9]+"); // 只允许数字
return !regex.IsMatch(text);
}
}
}