スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

DatePickerで、IMEをOFFにする。

[XAML] WPF で IME (かな漢字変換) を切り替えるには (Windows フォームから WPF へ)
TextBoxコントロールは、上のリンクで実現できるんだけど、DatePickerコントロールに対して設定しても、言うことをきいてくれない。
DatePickerに日本語モードなんて、ほぼ不要なんだけどな。標準でやってくれていない。
おそらく、上記事の添付プロパティは、TextBoxに対するもので、DatePickerに対するものではないから、無視されるんだろう。
おかげで、DatePicker内にキーボードフォーカスがあるときもIMEをOFFにしたいのにできない。
というわけで方法を考えてみた。
DatePickerの継承クラス(サブクラスとも言う)を作る。

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

return;
}
}

テンプレート適用時に呼び出されるOnApplyTemplateメソッドをオーバライドし、
テンプレート内部にあるTextBoxを検索して、そのTextBoxに添付プロパティ(InputMethod.PreferredImeStateプロパティ)を設定する。
TextBoxの名前である「PART_TextBox」は、標準のテンプレートが内部で使用しているコントロール名。根拠が全くない名前ではない。
コード上で、DatePickerを選択状態にして、「定義へ移動」すると、以下のように出てくる。

// 概要:
// ユーザーが日付を選択できるコントロールを表します。
[TemplatePart(Name = "PART_Popup", Type = typeof(Popup))]
[TemplatePart(Name = "PART_Root", Type = typeof(Grid))]
[TemplatePart(Name = "PART_TextBox", Type = typeof(DatePickerTextBox))]
[TemplatePart(Name = "PART_Button", Type = typeof(Button))]
public class DatePicker : Control {
//(省略)

TemplatePartという属性クラスでその名前が決められている。自分やテーマが上書きしない限りは、この名前を使える。
こうすることで、Offにすることだけはできる。まあ、Offにするだけだけで十分だけど。
添付プロパティという形で実装できないかとも思ったんだけど、テンプレート適用時にイベントが発生しないし、適用のタイミングがLoad前とも限らないようなので、難しい感じだ。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。