C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: WPFのTextChangeイベント


(過去ログ 39 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■20380 / inTopicNo.1)  WPFのTextChangeイベント
  
□投稿者/ Z (1回)-(2008/06/10(Tue) 10:24:44)

分類:[.NET 全般] 

お世話になっております。

WPFで質問させてください。

WPFでテキストボックスを貼り付け、TextChangeイベントを受け取るようにしました。

で、そのイベントなんですが、「日本語入力中で変換確定前」でも発生し、さらに
「日本語入力中で変換確定前」の内容が取得できます。

これはこれで便利なことも多いと思いますが、「変換確定した内容」のみを
とりたい場合も多いと思います。

その場合は、どうすればよいのでしょうか?

変換確定した場合に発生するイベントが新たに存在する?
変換中のモノを含まない内容を返すプロパティが新たに存在する?

どうか、ご教授してください。

(ちなみに、次回東京で勉強会があれば、参加させていただきたいです)




引用返信 編集キー/
■20389 / inTopicNo.2)  Re[1]: WPFのTextChangeイベント
□投稿者/ 囚人 (303回)-(2008/06/10(Tue) 11:50:46)
WPF が TSF 対応になっているせいなのか難しいですね。TSF の何かを弄れば何かできるのかもしれませんが、結構難しい。
引用返信 編集キー/
■20424 / inTopicNo.3)  Re[2]: WPFのTextChangeイベント
□投稿者/ Z (2回)-(2008/06/10(Tue) 15:32:35)
No20389 (囚人 さん) に返信
> WPF が TSF 対応になっているせいなのか難しいですね。TSF の何かを弄れば何かできるのかもしれませんが、結構難しい。

回答ありがとうございます。
やっぱ、難しいですか。

いろいろググったんですけど、まだまだWPFの情報が少ないのと、
英語圏とかだとIMEは関係ないみたいなので、良い解決策が見あたらないんですよ。

通常のコントロール(WPFじゃないヤツ)と相互運用も可能みたいだし、
どうしても必要なら、通常のテキストボックスとか使うのかなぁ。

変換確定後の内容だけを取るようにしないと、キーワードの強調表示を行う
リッチテキストとかで、困るんですよね。



引用返信 編集キー/
■20461 / inTopicNo.4)  Re[3]: WPFのTextChangeイベント
□投稿者/ 中博俊@管理人 (2回)-(2008/06/10(Tue) 20:41:14)
中博俊@管理人 さんの Web サイト
んーイベントではそうですが、バインドすれば望みの結果をとれると思いますけど。
引用返信 編集キー/
■20462 / inTopicNo.5)  Re[1]: WPFのTextChangeイベント
□投稿者/ NyaRuRu (44回)-(2008/06/10(Tue) 21:33:29)
2008/06/10(Tue) 21:35:05 編集(投稿者)

No20380 (Z さん) に返信
> その場合は、どうすればよいのでしょうか?
>
> 変換確定した場合に発生するイベントが新たに存在する?
> 変換中のモノを含まない内容を返すプロパティが新たに存在する?

あんまりちゃんと調べていませんが,この辺参考になりますでしょうか?
http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=663379&SiteID=7

TextCompositionManager.TextInput
http://msdn.microsoft.com/ja-jp/library/system.windows.input.textcompositionmanager.textinput.aspx
引用返信 編集キー/
■20474 / inTopicNo.6)  Re[2]: WPFのTextChangeイベント
□投稿者/ Z (3回)-(2008/06/11(Wed) 01:38:24)
皆様、回答ありがとうございます。

教えていただいたサンプルをみたりして確認用の
サンプルを作っていじってみました。

その結果から、IMEがOFFの場合は
PreviewTextInputで「textbox1.text+e.text」が内容と一致。

IMEがONで入力確定した場合は
PreviewTextInputで「textbox1.text」が内容と一致。

以上より、

PreviewTextInputのイベントのメソッドで

if (InputMethod.Current.ImeState == InputMethodState.Off)
{
    Console.WriteLine(textBox1.Text + e.Text);
}
else
{
    Console.WriteLine(textBox1.Text);
}

で行けるかと思ったんですが、「DELETEキー」や「貼り付け」に対応してくれません。

うまくいかないモンですね・・・

貼り付けとかも、TextChangeイベントなら対応できるけど、そうすると
変換途中でもイベントに入ってきてしまうし、それだと変換途中なのか確定したのか解らないし・・・


**** 確認サンプル ****
public Window1()
{
    InitializeComponent();

    TextCompositionManager.AddTextInputHandler(textBox1, new TextCompositionEventHandler(TxtIn));
    TextCompositionManager.AddTextInputStartHandler(textBox1, new TextCompositionEventHandler(TxtInSt));
    TextCompositionManager.AddTextInputUpdateHandler(textBox1, new TextCompositionEventHandler(TxtInUp));

    TextCompositionManager.AddPreviewTextInputHandler(textBox1, new TextCompositionEventHandler(PrTxtIn));
    TextCompositionManager.AddPreviewTextInputStartHandler(textBox1, new TextCompositionEventHandler(PrTxtInSt));
    TextCompositionManager.AddPreviewTextInputUpdateHandler(textBox1, new TextCompositionEventHandler(PrTxtInUp));
}

void TxtIn(object sender,TextCompositionEventArgs e)
{
    Console.WriteLine("In:" + textBox1.Text + "@" + e.Text);
}

void TxtInSt(object sender, TextCompositionEventArgs e)
{
    Console.WriteLine("St:" + textBox1.Text + "@" + e.Text);
}

void TxtInUp(object sender, TextCompositionEventArgs e)
{
    Console.WriteLine("Up:" + textBox1.Text + "@" + e.TextComposition.CompositionText);
}

void PrTxtIn(object sender, TextCompositionEventArgs e)
{
    Console.WriteLine("PrIn:" + textBox1.Text + "@" + e.Text);
}

void PrTxtInSt(object sender, TextCompositionEventArgs e)
{
    Console.WriteLine("PrSt:" + textBox1.Text + "@" + e.Text);
}

void PrTxtInUp(object sender, TextCompositionEventArgs e)
{
    Console.WriteLine("PrUp:" + textBox1.Text + "@" + e.TextComposition.CompositionText);
}

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -