2012-04-20 52 views
6

Tôi đang tạo biểu mẫu trong ứng dụng C# WinRT và tôi muốn hạn chế các ký tự trong một trong các thành phần TextBox thành chữ số. (TextBox này sẽ dành cho người dùng nhập một năm vào.)Hạn chế các ký tự trong một TextBox

Tôi đã tìm kiếm một lúc nhưng chưa thể tìm ra điều này mà không cần thiết lập trình xử lý sự kiện trên sự kiện TextChanged và kiểm tra thuộc tính text trên mỗi lần nhấn phím. Có cách nào để chỉ đơn giản nói rằng một người dùng chỉ có thể nhập các ký tự cụ thể vào một TextBox?

Trả lời

8

Điều đơn giản nhất mà có thể có thể làm việc là để ràng buộc vào sự kiện OnTextChanged và sửa đổi các văn bản theo quy tắc của bạn.

<TextBox x:Name="TheText" TextChanged="OnTextChanged" MaxLength="4"/> 
private void OnTextChanged(object sender, TextChangedEventArgs e) 
    { 
     if (TheText.Text.Length == 0) return; 

     var text = TheText.Text; 

     int result; 
     var isValid = int.TryParse(text, out result); 
     if (isValid) return; 

     TheText.Text = text.Remove(text.Length - 1); 
     TheText.SelectionStart = text.Length; 
    } 

Tuy nhiên, tôi muốn né tránh phương pháp này kể từ khi câu thần chú của Metro là touch UI đầu tiên và bạn dễ dàng có thể làm điều đó một cách đầu tiên liên lạc với một điều khiển FlipView.

+0

Đánh dấu đây là câu trả lời vì nó chủ yếu giải quyết được vấn đề tôi đang gặp phải. Điều này sẽ hạn chế TextBox chỉ hiển thị số. Tuy nhiên, tôi đã từ khi xem lại phần này của ứng dụng của tôi và thay thế trường năm bằng ComboBox, để tránh hoàn toàn vấn đề. (Tôi đã có một phạm vi cố định của năm có thể, vì vậy tôi không biết tại sao tôi đã không sử dụng một ComboBox ở nơi đầu tiên.) –

-2

Sử dụng điều khiển MaskedTextBox. Chỉ đối với các chữ số, chỉ cần sử dụng thuộc tính Mặt nạ để chỉ định các ký tự và độ dài, nếu có. ví dụ. nếu bạn chỉ muốn nhập năm số, bạn đặt thuộc tính mặt nạ thành "00000". Đơn giản như thế. Windows xử lý hạn chế cho bạn.

+1

Có một MaskedTextBox cho WinRT không? –

+0

@RitchMelton Tôi không biết hiện tại. Tôi đoán câu trả lời nên là có. – olatunjee

+0

Các tài liệu hiện tại nói không. http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.aspx –

0

trị Năm

DateTime newDate; 
var validYear = DateTime.TryParseExact("2012", "yyyy", CultureInfo.InvariantCulture, 
DateTimeStyles.None, out newDate); //valid 

Invalid Năm

var validYear = DateTime.TryParseExact("0000", "yyyy", CultureInfo.InvariantCulture, 
DateTimeStyles.None, out newDate); //invalid 
+0

http://stackoverflow.com/editing-help#code –

6

Thử đặt TextBox.InputScope thuộc tính thành InputScopeNameValue.Number, như được đề cập trong Guidelines and checklist for text input trong MSDN.

+0

Điều này là mát mẻ, và (sắp xếp) tồn tại trong WPF là tốt. Không biết về điều này. Cảm ơn! –

+0

+1 cho một tính năng gọn gàng –

+1

Loại này hoạt động, nhưng sẽ không thực hiện chính xác những gì tôi đang cố gắng hoàn thành. Có vẻ như thuộc tính InputScope phục vụ nhiều hơn như một gợi ý cho hệ thống mà bàn phím mềm mà hệ thống sẽ hiển thị, nhưng nó sẽ không tạo ra một TextBox đeo mặt nạ giới hạn đầu vào. (Cuối cùng tìm thấy chủ đề này trong diễn đàn MSDN - liên kết bên dưới, xem bài đăng từ Chipalo Street, từ Thứ Năm, 22 tháng 3, 2012 5:49 CH). http://social.msdn.microsoft.com/Diễn đàn/en-US/winappswithcsharp/thread/d746d7d7-91c7-4429-8efa-a748b4ce6a03 –

0

Điều này dường như làm việc cho tôi:

private void TextBox_KeyDown(object sender, KeyRoutedEventArgs e) 
    { 
     if ((e.Key < VirtualKey.Number0) || (e.Key > VirtualKey.Number9)) 
     { 
      // If it's not a numeric character, prevent the TextBox from handling the keystroke 
      e.Handled = true; 
     } 
    } 

Xem tài liệu cho các VirtualKey enumeration cho tất cả các giá trị.

0

Dựa trên bài đăng tại link, thêm tab để cho phép điều hướng.

private void decimalTextBox_KeyDown(object sender, KeyRoutedEventArgs e) 
    { 
     bool isGoodData; // flag to make the flow clearer. 
     TextBox theTextBox = (TextBox)sender; // the sender is a textbox 

     if (e.Key>= Windows.System.VirtualKey.Number0 && e.Key <= Windows.System.VirtualKey.Number9) // allow digits 
      isGoodData = true; 
     else if (e.Key == Windows.System.VirtualKey.Tab) 
      isGoodData = true; 
     else if (e.Key >= Windows.System.VirtualKey.NumberPad0 && e.Key <= Windows.System.VirtualKey.NumberPad9) // allow digits 
      isGoodData = true; 
     else if (e.Key == Windows.System.VirtualKey.Decimal || (int)e.Key == 190) // character is a decimal point, 190 is the keyboard period code 
                        // which is not in the VirtualKey enumeration 
     { 
      if (theTextBox.Text.Contains(".")) // search for a current point 
       isGoodData = false; // only 1 decimal point allowed 
      else 
       isGoodData = true;  // this is the only one. 
     } 
     else if (e.Key == Windows.System.VirtualKey.Back) // allow backspace 
      isGoodData = true; 
     else 
      isGoodData = false; // everything else is bad 
     if (!isGoodData)   // mark bad data as handled 
      e.Handled = true; 
    } 
+1

Shift-4, phải là ký hiệu đô la, không được lọc với mã này. Khóa 4 được xem và được chấp nhận dưới dạng chữ số. Xem câu hỏi này: http://stackoverflow.com/questions/13001215/detect-if-modifier-key-is-pressed-in-keyroutedeventargs-event nơi các phương pháp khác nhau được hiển thị để phát hiện sự thay đổi, kiểm soát, v.v. ., phím. –

Các vấn đề liên quan