2012-04-20 23 views
6

C#WinRTアプリケーションでフォームを作成していますが、TextBoxコンポーネントのいずれかの文字を数字のみに制限したいとします。 (このテキストボックスはユーザーが年を入力するためのものです)TextBoxの文字を制限する

私はしばらく検索しましたが、TextChangedイベントでイベントリスナーを設定せずにこれを調べることはできませんでした。すべてのキーを押したときにtextプロパティを調べます。単にユーザーがTextBoxに特定の文字を入力できると言うだけの方法はありますか?

答えて

8

おそらく仕事ができる最も簡単な方法は、OnTextChangedイベントに結合し、あなたのルールに従ってテキストを変更することです。

<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; 
    } 

メトロのマントラがタッチ最初のUIであり、あなたはFlipView制御との接触最初のやり方でそれを簡単に行うことができますので、私は離れて、このアプローチから敬遠したいです。

+0

これは主に私が抱えていた問題を解決するため、答えとしてマークします。これにより、TextBoxは数字だけを表示するように制限されます。しかし、私はその後、私のアプリのこの部分を再訪し、問題を完全に回避するために、年フィールドをComboBoxに置き換えました。 (私は可能な年月の固定範囲を持っているので、最初にComboBoxを使用しなかった理由はわかりません) –

-2

MaskedTextBoxコントロールを使用します。数字の場合のみ、Maskプロパティを使用して文字と長さがあればそれを指定します。例えば5つの数値だけを入力したい場合は、マスクプロパティを "00000"に設定します。そのような単純な。 Windowsはあなたの制限を処理します。

+1

WinRT用のMaskedTextBoxはありますか? –

+0

@RitchMelton私は現在分かりません。私は答えがはいと思う。 – olatunjee

+0

現在のドキュメントではnoと表示されています。 http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.aspx –

0

有効な年

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

無効年

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

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

6

TextBox.InputScopeプロパティをInputScopeNameValue.Numberに設定してください(MSDNのGuidelines and checklist for text inputを参照)。

+0

これはクールでWPFでも(ソート)です。これについて知りませんでした。ありがとう! –

+0

+1はきちんとした機能のため –

+1

これはちょっと機能しますが、私が達成しようとしているものとまったく同じことはしません。 InputScopeプロパティは、システムに表示するソフトキーボードのヒントとしてシステムにヒントとして役立ちますが、入力を制限するマスクされたTextBoxは作成されません。 (最終的にこのスレッドをMSDNフォーラムで見つけました - 下のリンクは、2012年3月22日木曜日からChipalo Streetの投稿を参照してください)。 http://social.msdn.microsoft。com/Forums/ja/winappswithcsharp/thread/d746d7d7-91c7-4429-8efa-a748b4ce6a03 –

0

これは私のために働くようだ:

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; 
     } 
    } 

は、すべての値のVirtualKey enumerationのマニュアルを参照してください。

0

linkの投稿に基づいて、ナビゲーションを可能にするためにタブを追加します。

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は、このコードでは除外されません。 4つのキーが表示され、数字として受け入れられます。この質問を参照してください: http://stackoverflow.com/questions/13001215/detect-if-modifier-key-is-pressed-in-keyroutedeventargs-event シフト、コントロールなどを検出するためのさまざまな方法が示されています。 。、キー。 –