バイト長で制限したいときもある(弐)。

バイト長で制限したいときもある(壱)。でやりたかった事を、いつか必ず後始末(弐)で作ったクラスを使って実装する。
(1)添付プロパティ用意
TextBoxコントロール用の添付プロパティを用意します。
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace TawamureDays {

using TawamureDays.Containers;

/// <summary>
/// Description of TextBoxBehavior.
/// </summary>
public static class TextBoxBehavior {

/// <summary>
/// MaxLengthをバイト数で制限するかどうかを取得します。
/// </summary>
/// <param name="obj">対象オブジェクト(TextBox)</param>
/// <returns>true:MaxLengthをバイト数で制限する</returns>
public static bool GetLengthAsByte(DependencyObject obj) {
return (bool)obj.GetValue(LengthAsByteProperty);
}

/// <summary>
/// MaxLengthをバイト数で制限するかどうかを設定します。
/// </summary>
/// <param name="obj">対象オブジェクト(TextBox)</param>
/// <param name="value">true:MaxLengthをバイト数で制限する</param>
public static void SetLengthAsByte(DependencyObject obj, bool value) {
obj.SetValue(LengthAsByteProperty, value);
}

/// <summary>MaxLengthをバイト数で制限するかどうか</summary>
public static readonly DependencyProperty LengthAsByteProperty =
DependencyProperty.RegisterAttached("LengthAsByte", typeof(bool),
typeof(TextBoxBehavior),
new UIPropertyMetadata(false,
TextBoxBehavior.OnLengthAsBytePropertyChanged));
}
}

使い方

<TextBox x:Name="Txt"
tw:TextBoxBehavior.LengthAsByte="True"
MaxLength="10"/>

Prefixの「tw」は、上のクラスを参照するためのもの。xmlnsで宣言する。

(2)添付プロパティの値変更イベントを利用する。
上記添付プロパティを作っただけでは動かないので、プロパティ値の変更イベントにハンドラメソッドを登録します。
/// <summary>
/// LengthAsBytePropertyプロパティ変更イベントハンドラ
/// </summary>
/// <param name="dpObj">対象オブジェクト</param>
/// <param name="e">イベントデータ</param>
private static void OnLengthAsBytePropertyChanged(
DependencyObject dpObj, DependencyPropertyChangedEventArgs e) {

var textBox = dpObj as TextBox;

if (textBox == null) {
//TextBox以外に添付されても、影響(動作)しないようにします。
return;
}

if ((bool)e.NewValue) {

} else {
}
return;
}


(3)AttachedPropertyWorkerクラスを継承します。
今回の添付プロパティ用に用意します。
/// <summary>
/// LengthAsByteProperty用Workerクラス
/// </summary>
internal class LengthAsBytePropertyWorker : AttachedPropertyWorker {
}

(4)LengthAsBytePropertyWorker用の添付プロパティを用意します。
使う対象のTextBox毎に、このWorkerのインスタンスを確保しておきたいので、専用のプロパティを用意する必要があります。
XAML側で使う事もないので、privateで宣言します。
(2/13訂正)publicでないと、ちゃんと動作しないっぽい。
/// <summary>
/// LengthAsByteプロパティ用Workerを取得します。
/// </summary>
/// <param name="obj">対象オブジェクト(TextBox)</param>
/// <returns>LengthAsByteプロパティ用Worker</returns>
public static AttachedPropertyWorker GetLengthAsByteWorker(DependencyObject obj) {
return (AttachedPropertyWorker)obj.GetValue(LengthAsByteWorkerProperty);
}

/// <summary>
/// LengthAsByteプロパティ用Workerを設定します。
/// </summary>
/// <param name="obj">対象オブジェクト(TextBox)</param>
/// <param name="value">LengthAsByteプロパティ用Worker</param>
public static void SetLengthAsByteWorker(DependencyObject obj, AttachedPropertyWorker value) {
obj.SetValue(LengthAsByteWorkerProperty, value);
}

/// <summary>LengthAsByteプロパティ用Worker</summary>
public static readonly DependencyProperty LengthAsByteWorkerProperty =
DependencyProperty.RegisterAttached("LengthAsByteWorker", typeof(AttachedPropertyWorker),
typeof(TextBoxBehavior), new UIPropertyMetadata(null));

(2)のメソッド内で使う
private static void OnLengthAsBytePropertyChanged(
DependencyObject dpObj, DependencyPropertyChangedEventArgs e) {

var textBox = dpObj as TextBox;

if (textBox == null) {
return;
}

if ((bool)e.NewValue) {
AttachedPropertyWorker.
SetWorker<LengthAsBytePropertyWorker>(
textBox, TextBoxBehavior.LengthAsByteWorkerProperty);
} else {
textBox.SetValue(LengthAsByteWorkerProperty, null);
}

return;
}

LengthAsBytePropertyWorker内部を実装していきます(こっちが肝心)。
続く
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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