using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Aucma.Core.PrintTo.Views.Page
{
///
/// NumUpDown.xaml 的交互逻辑
///
public partial class NumUpDown : UserControl
{
public NumUpDown()
{
InitializeComponent();
}
///
/// 当前值
///
private decimal AvaliableVal = 0;
///
/// Sync Resource
///
private static object lockObj = new object();
///
/// label 显示内容
///
public string LabeContent
{
get { return GetValue(LabeContentProperty).ToString(); }
set { SetValue(LabeContentProperty, value); }
}
///
/// 最小值
///
public decimal MinValue
{
get { return Convert.ToDecimal(GetValue(MinValueProperty)); }
set { SetValue(MinValueProperty, value); }
}
///
/// 最大值
///
public decimal MaxValue
{
get { return Convert.ToDecimal(GetValue(MaxValueProperty)); }
set
{
SetValue(MaxValueProperty, value);
}
}
///
/// 默认值
///
public decimal DefaultValue
{
get { return Convert.ToDecimal(GetValue(DefaultValueProperty)); }
set
{
SetValue(DefaultValueProperty, value);
NumericValue = DefaultValue;
}
}
///
/// 是否整数
///
public bool IsInteger
{
get { return Convert.ToBoolean(GetValue(IsIntegerProperty)); }
set { SetValue(IsIntegerProperty, value); }
}
///
/// 步长
///
public decimal OffsetValue
{
get { return Convert.ToDecimal(GetValue(OffsetValueProperty)); }
set { SetValue(OffsetValueProperty, value); }
}
///
/// 输入框值
///
public decimal NumericValue
{
get { return Convert.ToDecimal(GetValue(NumericValueProperty)); }
set
{
SetValue(NumericValueProperty, value);
}
}
///
/// 左侧的Label的宽度
///
public double LabelWidth
{
get { return Convert.ToDouble(GetValue(LabelWidthValueProperty)); }
set { SetValue(LabelWidthValueProperty, value); }
}
///
/// 标签的可见性
///
public string LabelVisibility
{
get { return Convert.ToString(GetValue(LabelVisibilityValueProperty)); }
set { SetValue(LabelVisibilityValueProperty, value); }
}
public static readonly DependencyProperty LabeContentProperty =
DependencyProperty.Register("LabeContent",
typeof(string),
typeof(NumUpDown),
new PropertyMetadata("", new PropertyChangedCallback(LabelContentCallback))
);
private static void LabelContentCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
NumUpDown control = obj as NumUpDown;
//control.myNumLabelName.Content = e.NewValue.ToString();
}
public static readonly DependencyProperty MinValueProperty =
DependencyProperty.Register("MinValue",
typeof(decimal),
typeof(NumUpDown),
new PropertyMetadata(-1m, null)
);
public static readonly DependencyProperty MaxValueProperty =
DependencyProperty.Register("MaxValue",
typeof(decimal),
typeof(NumUpDown),
new PropertyMetadata(-1m, new PropertyChangedCallback(MaxValueChangedCallback))
);
public static readonly DependencyProperty DefaultValueProperty =
DependencyProperty.Register("DefaultValue",
typeof(decimal),
typeof(NumUpDown)
);
public static readonly DependencyProperty IsIntegerProperty =
DependencyProperty.Register("IsInteger",
typeof(bool),
typeof(NumUpDown), new PropertyMetadata(false)
);
public static readonly DependencyProperty OffsetValueProperty =
DependencyProperty.Register("OffsetValue",
typeof(decimal),
typeof(NumUpDown), new PropertyMetadata(1m)
);
public static readonly DependencyProperty NumericValueProperty =
DependencyProperty.Register("NumericValue",
typeof(decimal),
typeof(NumUpDown),
new PropertyMetadata(new PropertyChangedCallback(NumericValueChangedCallback))
);
public static readonly DependencyProperty LabelWidthValueProperty =
DependencyProperty.Register("LabelWidth",
typeof(double),
typeof(NumUpDown),
new PropertyMetadata(0.0, new PropertyChangedCallback(LabelWidthCallback))
);
public static readonly DependencyProperty LabelVisibilityValueProperty =
DependencyProperty.Register("LabelVisibility",
typeof(string),
typeof(NumUpDown),
new PropertyMetadata("Visible", new PropertyChangedCallback(LabelVisibilityCallback))
);
private static void LabelWidthCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
NumUpDown control = obj as NumUpDown;
//control.myNumLabelName.Width = double.Parse(string.IsNullOrEmpty(e.NewValue.ToString()) ? "0" : e.NewValue.ToString());
}
private static void LabelVisibilityCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
NumUpDown control = obj as NumUpDown;
string visi = e.NewValue.ToString();
//if (visi.Equals(Visibility.Visible.ToString()))
// control.myNumLabelName.Visibility = Visibility.Visible;
//else if (visi.Equals(Visibility.Hidden.ToString()))
// control.myNumLabelName.Visibility = Visibility.Hidden;
//else
// control.myNumLabelName.Visibility = Visibility.Collapsed;
}
private static void MaxValueChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
NumUpDown control = obj as NumUpDown;
control.tbContent.MaxLength = e.NewValue.ToString().Length;
}
private static void NumericValueChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
NumUpDown control = obj as NumUpDown;
control.AvaliableVal = Convert.ToDecimal(e.NewValue);
control.tbContent.Text = e.NewValue.ToString();
control.tbContent.SelectionStart = control.tbContent.Text.Length;
}
///
/// 增加按钮
///
///
///
private void btnAddClick(object sender, RoutedEventArgs e)
{
decimal offsetValue = OffsetValue;
AvaliableVal = Convert.ToDecimal(tbContent.Text);
decimal newValue;
if (AvaliableVal > MaxValue)
{
NumericValue = MaxValue;
return;
}
if (AvaliableVal + offsetValue > MaxValue)
{
NumericValue = MaxValue;
return;
}
newValue = AvaliableVal + offsetValue;
if (newValue < MinValue)
{
NumericValue = MinValue;
return;
}
if (IsInteger)
newValue = decimal.Parse(newValue.ToString("0"));
else
newValue = decimal.Parse(newValue.ToString("0.######"));
tbContent.Text = newValue.ToString();
NumericValue = newValue;
}
///
/// 减少按钮
///
///
///
private void btnSubClick(object sender, RoutedEventArgs e)
{
AvaliableVal = Convert.ToDecimal(tbContent.Text);
if (AvaliableVal < MinValue)
{
NumericValue = MinValue;
return;
}
if (AvaliableVal - OffsetValue < MinValue)
{
NumericValue = MinValue;
return;
}
if (AvaliableVal > MaxValue)
{
NumericValue = MaxValue;
return;
}
decimal newValue;
newValue = AvaliableVal - OffsetValue;
if (IsInteger)
newValue = decimal.Parse(newValue.ToString("0"));
else
newValue = decimal.Parse(newValue.ToString("0.######"));
tbContent.Text = newValue.ToString();
NumericValue = newValue;
}
///
/// 获取焦点
///
///
///
private void tbContentGotFocus(object sender, RoutedEventArgs e)
{
TextBox tb = sender as System.Windows.Controls.TextBox;
this.AvaliableVal = Convert.ToDecimal(tb.Text);
}
///
/// 是否数字
///
///
///
private bool IsNumber(string input)
{
string pattern = "^-?\\d+$|^(-?\\d+)(\\.\\d+)?$";
Regex regex = new Regex(pattern);
return regex.IsMatch(input);
}
///
/// 是否整数
///
///
///
private bool IsWholeNumber(string strNumber)
{
Regex g = new Regex(@"^[0-9]\d*$");
return g.IsMatch(strNumber);
}
///
/// 数字Text变动Event
///
///
///
private void tbContentTextChanged(object sender, TextChangedEventArgs e)
{
lock (lockObj)
{
TextBox tb = sender as TextBox;
if (tb != null)
{
bool isNumeric = IsNumber(tb.Text);
if (isNumeric)
{
var vv = Convert.ToDecimal(tb.Text);
if (vv > MaxValue && MaxValue != -1)
{
//此句为了解决实际应用时数据刷新的问题
NumericValue = MaxValue - 1;
try
{
System.Threading.Thread.Sleep(0);
}
catch { }
NumericValue = MaxValue;
return;
}
NumericValue = vv;
}
else
{
//NumericValue = null;
}
}
}
}
///
/// Lost焦点事件处理
///
///
///
private void tbCntLostFocus(object sender, RoutedEventArgs e)
{
lock (lockObj)
{
TextBox tb = sender as TextBox;
bool isNumeric = IsNumber(tb.Text);
if (isNumeric && IsInteger)
{
isNumeric = IsWholeNumber(tb.Text);
}
decimal oldValue = this.AvaliableVal;
if (isNumeric)
{
decimal ctrlValue = Convert.ToDecimal(tb.Text);
if (ctrlValue < MinValue)
{
if (oldValue <= MaxValue && oldValue >= MinValue)
NumericValue = oldValue;
else
NumericValue = MinValue;
AvaliableVal = NumericValue;
}
else if (ctrlValue > MaxValue)
{
if (oldValue <= MaxValue && oldValue >= MinValue)
NumericValue = oldValue;
else
NumericValue = MaxValue;
AvaliableVal = NumericValue;
}
else
{
AvaliableVal = ctrlValue;
NumericValue = AvaliableVal;
}
}
else
{
if (oldValue > MaxValue || oldValue < MinValue)
oldValue = DefaultValue;
tb.Text = oldValue.ToString();
NumericValue = oldValue;
}
}
}
}
}