数値だけのTextBoxだってやれるはずだ(参)

・AllowOnlyNumeric用Workerクラスを実装する。
・TextCompositionManagerクラスのPreviewTextInputイベントへハンドラを登録する。
/// <summary>
/// AllowOnlyNumericProperty用Workerクラス
/// </summary>
internal class AllowOnlyNumericPropertyWorker : AttachedPropertyWorker {

#region AttachedPropertyWorkerメンバー

/// <summary>
/// 初期化処理を行います。
/// </summary>
protected override void OnWorkerSet() {
var textBox = this.AttachedElement as TextBox;
TextCompositionManager.AddPreviewTextInputHandler(textBox,
AllowOnlyNumericPropertyWorker.OnPreviewTextInput);
return;
}

/// <summary>
/// 内部リソースを解放します。
/// </summary>
/// <param name="disposing">false:アンマネージリソースのみ解放します。</param>
protected override void OnDispose(bool disposing) {
if (this.IsDisposed) {
return;
}

if (disposing) {
var textBox = this.AttachedElement as TextBox;
TextCompositionManager.RemovePreviewTextInputHandler(textBox,
AllowOnlyNumericPropertyWorker.OnPreviewTextInput);
}
}

#endregion

#region イベント用メソッド

/// <summary>
/// TextComposition完了イベント用ハンドラ<br/>
/// 入力確定時のTextChangedイベントの前に発生します。<br/>
/// </summary>
/// <param name="sender">イベント発生元</param>
/// <param name="e">イベントデータ</param>
private static void OnPreviewTextInput(object sender, TextCompositionEventArgs e) {
var textBox = sender as TextBox;

return;
}

#endregion
}
終了処理(OnDispose)は必須である。登録と共に実装すれば、メモリリークが少なくなる。
これを添付プロパティの値変更時に登録するように実装する。
/// <summary>
/// AllowOnlyNumericプロパティ値変更イベントハンドラ
/// </summary>
/// <param name="dpObj">イベント発生元</param>
/// <param name="e">イベントデータ</param>
private static void OnAllowOnlyNumericPropertyChanged(
DependencyObject dpObj, DependencyPropertyChangedEventArgs e) {

var textBox = dpObj as TextBox;

if (textBox == null) {
return;
}

if ((bool)e.NewValue) {
//TextBoxPastingWorkerは、貼り付け処理専用のWorkerクラス
//同時使用が想定されるプロパティで使いまわす
AttachedPropertyWorker.SetWorker<TextBoxPastingWorker>(
textBox,
TextBoxBehavior.PastingTextWorkerProperty);
AttachedPropertyWorker.SetWorker<AllowOnlyNumericPropertyWorker>(
textBox,
TextBoxBehavior.AllowOnlyNumericWorkerProperty);

} else {
textBox.SetValue(TextBoxBehavior.PastingTextWorkerProperty, null);
textBox.SetValue(TextBoxBehavior.AllowOnlyNumericWorkerProperty, null);
}

return;
}

なお、バイト長で制限したいときもある(四)。で実装した貼り付け(Paste)の実装を、別のWorkerクラス(TextBoxPastingWorker)にして、LengthAsByteプロパティと同時に使用できるようにしている。

OnPreviewTextInputメソッド実装メモ

・入力されたテキストを半角に変換する。
 日本語入力がONかOFFかで扱いも代わるので注意。
・マイナス(-)が入力されたら、前につける。既についていれば、外す(符号の反転)。
・選択されているTextがあれば、それと入れ替える、という処理を忘れずに。
・入力されたのが数値だとしても、追加の制限を満たさなければ、入力をキャンセルする形にする。
 整数部桁数
 小数部桁数
 最大値
 最小値
・上記追加制限のチェックは、貼り付け時にもチェックする必要があるので、メソッド化をしておく。

続く
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m