【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

TextBoxを流用したIME入力

IMEの状態が検出できるようになったので、内部でTextBoxを利用して独自コントロールで文字入力してみました。 ⇒ 動作確認とソース

キャレットは点滅しません。カーソルキーやクリックで移動できません。編集は[Backspace]だけです。たまに変換中に文字を取りこぼして入力を受け付けなくなりますが、[Enter]を押して確定すると復活します。非同期で四重にチェックしてもこの状態のため、現時点で対策は思いつきません。

実装としては、昨日のサンプルで別々に表示していたパーツを重ねて1つのコントロールに見せ掛けています。IMEで入力中の文字はTextBoxからキャプチャしたImage、確定された文字はTextBlockです。TextBox自体は最前面で入力を受け持っていますが、Opacityをゼロにして隠しています。

これをベースにテキストエディタを実装しようと思います。

IMEの状態を検出

Silverlight 3でIMEの制御は、TextBoxでの有効・無効の設定しかできません。TextBox以外からIMEを利用する方法はありません。キーストロークから文字を取得(例: [Shift]+[1]→!)する方法もありません。

このような状況でエディタを作ろうとすると、全部自前で実装するのは論外とすれば、内部でTextBoxを利用するしか方法がありません。TextBoxでTextChangedイベントが発生したら文字を取り出してエディタに取り込むことで、キーストロークから文字を取得することができます。しかし変換中の文字もTextプロパティに反映されてTextChangedイベントを発生させるため、未確定の文字を取り出す結果になってまともに変換が出来なくなってしまいます。

そのため変換中かどうかを判定して、確定するまで取り出さないようにする必要があります。APIには判定する方法が用意されていませんが、WriteableBitmapを利用して強引に判定する方法を見付けました。

続きを読む

WebRequestの同期呼び出し (2)

id:n7shi:20090731:1248967824でMonitorを取り上げましたが、AutoResetEventを使った方が簡単だということが分かりました。詳細はid:n7shi:20090731:1248967824を修正したのでそちらを参照してください。

AutoResetEventについてはParallel で最適化してみる例で紹介されているAdding Concurrency Optimization in Silverlight 3を参考にしました。

XAPコンテンツの読み込み (2)

id:n7shi:20090714でXmlXapResolverを取り上げましたが、Application.GetResourceStream()を使った方が簡単だということが分かりました。詳細はid:n7shi:20090714を修正したのでそちらを参照してください。

MIZU GAME for Silverlight

n7shi2009-08-06


id:fslashtさんのMIZU GAMESilverlightに移植しました。動作確認とソースのダウンロードは以下です。

オリジナルを初めて起動したとき、流れるような水の表現に圧倒されました。それを再現するため、SDL.NETを使用している部分はWriteableBitmapで書き換えています。

続きを読む

FontSourceによるフォントの取得

SilverlightではSystem.Windows.Documents.FontSourceでフォントを読み込んで描画に使用できます。GDI+のPrivateFontCollectionに相当しますが、Familiesに相当するものがないため、あらかじめフォント名を調べておく必要があります。mplus-2p-black.ttfなら"M+ 2p"、みかちゃんなら"mikachan"です。みかちゃんWindowsで開くと書体名が「みかちゃん」と表示されますが、"みかちゃん"と指定しても認識しません。この辺の勝手が分からなくてハマりました。

続きを読む