2012-11-05 22 views
8

Tôi đang cố gắng tìm một giải pháp thay thế tốt cho Numericbox trong ứng dụng lát gạch cửa sổ 8. Tôi đã thử sử dụng cùng một hộp số tồn tại cho các hình thức cửa sổ nhưng có một lỗi nói rằng đây không phải là hỗ trợ (?) Bởi các ứng dụng windows 8. Tôi nhận thấy rằng các yếu tố TextBox cho các ứng dụng gạch có một InputScope có thể được thiết lập để "Số", nhưng nó vẫn cho phép người dùng gõ bất cứ ký tự nào anh ta muốn. Tôi cho rằng InputScope không làm những gì tôi nghĩ.Các lựa chọn thay thế cho Numericbox trong các ứng dụng Windows 8?

Tôi hiện đang quản lý với hộp văn bản, nhưng vì tôi tính toán văn bản phải liên tục được chuyển đổi sang thập phân và sau đó quay lại văn bản khi tôi muốn cập nhật giao diện, ngoài việc phải thực hiện một số kiểm tra để thực hiện chắc chắn người dùng không nhập các ký tự không phải là số. Điều này là cực kỳ tẻ nhạt và rất quen thuộc với Windows Form này có vẻ là một bước đi sai hướng. Tôi phải thiếu một cái gì đó hiển nhiên?

+0

'InputScope' được sử dụng cho loại bàn phím nhập cảm ứng. – BrunoLM

Trả lời

3

Tôi không quen thuộc với NumericTextBox, nhưng đây là triển khai C#/XAML đơn giản chỉ cho phép các chữ số và ký tự thập phân.

Tất cả điều đó là ghi đè sự kiện OnKeyDown; dựa trên khóa đang được nhấn, nó cho phép hoặc không cho phép sự kiện này đạt được lớp cơ sở TextBox.

Tôi nên lưu ý rằng triển khai này là dành cho các ứng dụng Windows Store - Tôi tin rằng câu hỏi của bạn là về loại ứng dụng đó, nhưng tôi không chắc chắn 100%.

public class MyNumericTextBox : TextBox 
{ 
    protected override void OnKeyDown(KeyRoutedEventArgs e) 
    { 
     HandleKey(e); 

     if (!e.Handled) 
      base.OnKeyDown(e); 
    } 

    bool _hasDecimal = false; 
    private void HandleKey(KeyRoutedEventArgs e) 
    { 
     switch (e.Key) 
     { 
      // allow digits 
      // TODO: keypad numeric digits here 
      case Windows.System.VirtualKey.Number0: 
      case Windows.System.VirtualKey.Number1: 
      case Windows.System.VirtualKey.Number2: 
      case Windows.System.VirtualKey.Number3: 
      case Windows.System.VirtualKey.Number4: 
      case Windows.System.VirtualKey.Number5: 
      case Windows.System.VirtualKey.Number6: 
      case Windows.System.VirtualKey.Number7: 
      case Windows.System.VirtualKey.Number8: 
      case Windows.System.VirtualKey.Number9: 
       e.Handled = false; 
       break; 

      // only allow one decimal 
      // TODO: handle deletion of decimal... 
      case (Windows.System.VirtualKey)190: // decimal (next to comma) 
      case Windows.System.VirtualKey.Decimal: // decimal on key pad 
       e.Handled = (_hasDecimal == true); 
       _hasDecimal = true; 
       break; 

      // pass various control keys to base 
      case Windows.System.VirtualKey.Up: 
      case Windows.System.VirtualKey.Down: 
      case Windows.System.VirtualKey.Left: 
      case Windows.System.VirtualKey.Right: 
      case Windows.System.VirtualKey.Delete: 
      case Windows.System.VirtualKey.Back: 
      case Windows.System.VirtualKey.Tab: 
       e.Handled = false; 
       break; 

      default: 
       // default is to not pass key to base 
       e.Handled = true; 
       break; 
     } 
    } 
} 

Đây là một số mẫu XAML. Lưu ý rằng nó giả định MyNumericTextBox nằm trong vùng tên dự án.

<StackPanel Background="Black"> 
    <!-- custom numeric textbox --> 
    <local:MyNumericTextBox /> 
    <!-- normal textbox --> 
    <TextBox /> 
</StackPanel> 
+0

Chỉ cần một lưu ý, ví dụ này không phục vụ cho Shift + số, và do đó nó cho phép các ký tự đặc biệt lẻn qua, cũng chỉ có thể thêm dấu thập phân một lần, nếu không thể xóa nó lần nữa. – Dave

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