Tôi đã sử dụng thuộc tính được đính kèm để cho phép người dùng sử dụng các phím lên và xuống để thay đổi các giá trị trong hộp văn bản. Để sử dụng nó, bạn chỉ cần sử dụng
<TextBox local:TextBoxNumbers.SingleDelta="1">100</TextBox>
Điều này không thực sự giải quyết các vấn đề xác thực được đề cập trong câu hỏi này, nhưng nó giải quyết những gì tôi làm về việc không có điều khiển tăng/giảm số. Sử dụng nó cho một chút, tôi nghĩ rằng tôi thực sự có thể thích nó tốt hơn so với điều khiển lên/xuống số cũ.
Mã này không phải là hoàn hảo, nhưng nó xử lý các trường hợp tôi cần nó để xử lý:
Up
mũi tên, mũi tên Down
Shift + Up
mũi tên, mũi tên Shift + Down
Page Up
, Page Down
- Ràng buộc
Converter
trên thuộc tính văn bản
Code behind
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
namespace Helpers
{
public class TextBoxNumbers
{
public static Decimal GetSingleDelta(DependencyObject obj)
{
return (Decimal)obj.GetValue(SingleDeltaProperty);
}
public static void SetSingleDelta(DependencyObject obj, Decimal value)
{
obj.SetValue(SingleDeltaProperty, value);
}
// Using a DependencyProperty as the backing store for SingleValue. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SingleDeltaProperty =
DependencyProperty.RegisterAttached("SingleDelta", typeof(Decimal), typeof(TextBoxNumbers), new UIPropertyMetadata(0.0m, new PropertyChangedCallback(f)));
public static void f(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
TextBox t = o as TextBox;
if (t == null)
return;
t.PreviewKeyDown += new System.Windows.Input.KeyEventHandler(t_PreviewKeyDown);
}
private static Decimal GetSingleValue(DependencyObject obj)
{
return GetSingleDelta(obj);
}
private static Decimal GetDoubleValue(DependencyObject obj)
{
return GetSingleValue(obj) * 10;
}
private static Decimal GetTripleValue(DependencyObject obj)
{
return GetSingleValue(obj) * 100;
}
static void t_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
TextBox t = sender as TextBox;
Decimal i;
if (t == null)
return;
if (!Decimal.TryParse(t.Text, out i))
return;
switch (e.Key)
{
case System.Windows.Input.Key.Up:
if (Keyboard.Modifiers == ModifierKeys.Shift)
i += GetDoubleValue(t);
else
i += GetSingleValue(t);
break;
case System.Windows.Input.Key.Down:
if (Keyboard.Modifiers == ModifierKeys.Shift)
i -= GetDoubleValue(t);
else
i -= GetSingleValue(t);
break;
case System.Windows.Input.Key.PageUp:
i += GetTripleValue(t);
break;
case System.Windows.Input.Key.PageDown:
i -= GetTripleValue(t);
break;
default:
return;
}
if (BindingOperations.IsDataBound(t, TextBox.TextProperty))
{
try
{
Binding binding = BindingOperations.GetBinding(t, TextBox.TextProperty);
t.Text = (string)binding.Converter.Convert(i, null, binding.ConverterParameter, binding.ConverterCulture);
}
catch
{
t.Text = i.ToString();
}
}
else
t.Text = i.ToString();
}
}
}
Đó là tốt hơn so với cách tiếp cận của tôi ở chỗ nó ít mã hơn và vẫn cho phép các phím điều khiển như các phím mũi tên và backspace vv –
Tôi vừa nhận ra rằng không cách tiếp cận nào sẽ ngăn người dùng dán các ký tự không phải số vào điều khiển, nhưng đó không phải là vấn đề ngay bây giờ. Tôi sẽ đánh dấu phản ứng của bạn là câu trả lời 'coz nó gần như chúng ta có thể nhận được, tôi nghĩ. Cảm ơn! –
Điều này sẽ không thành công trên số thập phân. Nếu người dùng nhập 5.3. Nó cũng sẽ thất bại về số âm vì "-" không phải là số. Dễ sửa nhưng chỉ nghĩ rằng tôi sẽ ném cảnh cáo đó vào đó. – Kelly