Wp7 で行われているように Textbox の InputScope を実装する方法を探していますが、従来の WPF を使用しています。
私が達成したいのは、入力が10進数のみを使用するように制限されていることです。どうすればそれを達成できますか?
<TextBox Text="{Binding Amount, Mode=TwoWay}" InputScope="Number"/>
InputScope は従来の WPF の有効な属性ですが、残念ながら機能していないようです。
Wp7 で行われているように Textbox の InputScope を実装する方法を探していますが、従来の WPF を使用しています。
私が達成したいのは、入力が10進数のみを使用するように制限されていることです。どうすればそれを達成できますか?
<TextBox Text="{Binding Amount, Mode=TwoWay}" InputScope="Number"/>
InputScope は従来の WPF の有効な属性ですが、残念ながら機能していないようです。
InputScope は、入力に対していかなる種類の検証や制限も強制しません。これは、コントロールに入力できるデータの種類の入力プロセッサ (スクリーン キーボード、音声認識など) へのヒントです。
この値は、IME (スクリーン キーボードなど) が有効になっている場合にのみ使用されます。
WP7 でも、InputScope はテキスト ボックスに入力できる値を制限しません。InputScope を無視する入力プロセッサをインストールできれば、不要な文字を入力することができます。
テキスト入力を特定の文字に制限したい場合は、MaskedTextBoxを使用するか、キーストローク イベントをインターセプトする必要があります。コードもわかりやすくなります。
InputManagerの PreProcessInputイベントを使用して、InputScope を使用して入力イベントをフィルタリングすることは可能かもしれませんが、おそらく努力する価値はありません。
それを行うための組み込みの方法はありません。探しているものを実現するには、少しコードを書く必要があります。必要な作業の例を次に示します:数値用の WPF Maskable TextBox
私は InputScope を使用していませんが、MSDN のドキュメント (ここ、ここ、ここ、ここ) から、WPF の入力スコープにはより複雑な入力が必要なようです。
xmlns:swi
にマップする必要がありますSystem.Windows.Input
。
<TextBox>
<TextBox.InputScope>
<swi:InputScope RegularExpression="^(0|(-(((0|[1-9]\d*)\.\d+)|([1-9]\d*))))$" />
</TextBox.InputScope>
</TextBox>
(Googleで見つかった正規表現文字列、私はチェックしていません。)
多分:
<TextBox>
<TextBox.InputScope>
<swi:InputScopePhrase>
<swi:InputScopePhrase.Names>Number</swi:InputScopePhrase>
</swi:InputScopePhrase>
</TextBox.InputScope>
</TextBox>
string txt = MessageWrite.Text;
if (txt != "")
{
MessageWrite.Text = Regex.Replace(MessageWrite.Text, "[^a-f ^0-9]", "");
if (txt != MessageWrite.Text)
{
MessageWrite.Select(MessageWrite.Text.Length, 0);
}
}
messageWrite はテキストボックス名です。AF、0-9から制限します。ユーザーはそれを変更できます:)