DatePickerで、IsReadOnlyを設定したい。

DatePickerで、IMEをOFFにする。で、DatePickerを拡張したんだけど、もうちょっと拡張する必要が出てきた。
このDatePicker、入力系のコントロールなのに、IsReadOnlyプロパティがない
なんでないんだ?必要だろ~。
というわけで、IsReadOnlyな状態を作れるように拡張しようと思った次第。
添付プロパティでもできなくはないけど、今回は拡張という形で実装する。

○依存関係プロパティを実装
namespace TawamureDays {

/// <summary>
/// DatePicker拡張
/// </summary>
public class DatePickerEx : DatePicker {

/// <summary>
/// 読み取り専用かどうかを取得|設定します。
/// </summary>
public bool IsReadOnly {
get { return (bool)GetValue(IsReadOnlyProperty); }
set { SetValue(IsReadOnlyProperty, value); }
}

/// <summary>読み取り専用かどうか</summary>
public static readonly DependencyProperty IsReadOnlyProperty =
DependencyProperty.Register("IsReadOnly", typeof(bool),
typeof(DatePickerEx),
new UIPropertyMetadata(false, OnIsReadOnlyPropertyChanged));

}
}

○プロパティ変更通知用コールバックに設定したメソッドを実装する。
namespace TawamureDays {

/// <summary>
/// DatePicker拡張
/// </summary>
public class DatePickerEx : DatePicker {

/// <summary>
/// IsReadOnlyプロパティ変更イベントメソッド
/// </summary>
/// <param name="dpObj">変更発生元</param>
/// <param name="e">イベント引数</param>
private static void OnIsReadOnlyPropertyChanged(DependencyObject dpObj, DependencyPropertyChangedEventArgs e) {
var datePicker = dpObj as DatePickerEx;

if (datePicker == null || !datePicker.IsLoaded || datePicker.Template == null) {
return;
}

//入力用テキストボックスを検索
var textBox = datePicker.Template.
FindName("PART_TextBox", datePicker) as DatePickerTextBox;

if (textBox != null) {
textBox.IsReadOnly = (bool)e.NewValue;
}

//カレンダー表示用ボタンを検索
var button = datePicker.Template.FindName("PART_Button", datePicker) as Button;
if (button != null) {
button.Visibility = (bool)e.NewValue ?
Visibility.Collapsed : Visibility.Visible;
}

return;
}
}
}

○OnApplyTemplateメソッドをオーバーライド

namespace TawamureDays {

/// <summary>
/// DatePicker拡張
/// </summary>
public class DatePickerEx : DatePicker {

/// <summary>
/// テンプレート適用時の処理
/// </summary>
public override void OnApplyTemplate() {
base.OnApplyTemplate();

var textBox = Template.FindName("PART_TextBox", this) as DatePickerTextBox;

if (textBox != null) {
InputMethod.SetPreferredImeState(textBox, InputMethodState.Off);
textBox.IsReadOnly = this.IsReadOnly;
}

var button = Template.FindName("PART_Button", this) as Button;
if (button != null) {
button.Visibility = this.IsReadOnly ?
Visibility.Collapsed : Visibility.Visible;
}

return;
}

}
}

これでIsReadOnly設定可能なDatePickerになる。かな?
キー入力に対して特殊な操作("日"にカレットがあって、↑押下で翌日、とか)を行うような実装をしようとすると、このIsReadOnlyのチェックが欠かせなくなるかな。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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