Silverlightで無理だったこと

はじめに

さぼっていた分毎日ポストしようと思っていたんですが、そろそろ広報ネタがつきてきました。
ということで久しぶりにプログラムネタを出そうかと思ったんですが、PHPで書いているWebプログラムに面白いことが特に無かったので、Silverlightで出来なかった事でも書いていこうと思います。
もしかしたら誰かすごい人が「これはこうすれば出来るよ」とか教えてくれるかもという淡い期待を込めつつ。


ちなみに、Silverlightをブラウザ外実行しているアプリケーションです。バージョンは4です。
文中にC#に限定しているような記述ありますが、別にそんことなくてただC#しか使ってないだけです。C#以外だったら解決策あるよとか、知っている人いれば教えてくれると嬉しいです。

同期ダイアログ

あんまり調べてないんですが、Silverlightはメインスレッド止めるとアウトっぽいので、ChildWindowを継承して作った子供のダイアログが閉じられるまでメインウィンドウ側の処理をロックして、関数一本で同期的にそのダイアログの結果を取るという事が出来ませんでした。


例えば「○○してよろしいですか?」→「はい」、「いいえ」とかのダイアログを作ったとしても、Closeイベント拾って判断しないといけないです。
自作しなければSaveFileDialogとかMessageBoxとかは同期的に書けるんで、何か方法あるのかもしれませんけど。

SaveFileDialogにデフォルトファイル名を指定

問答無用で出来ませんでした。これは出来ないという結果にちょっと自信あります。
どうしてもの場合SaveFileDialogを開く→COMからSendMessage、とか、Windows限定の対処方法はいくつかありますけど、さすがに反則でしょう。

DataGridの列数を動的にする

ピボットテーブルみたいな表示結果を出したかったんですが、DataGridのItemsSourceにはデータクラスを指定しないといけなくて、基本的にC#は静的型付け言語なんでデータクラスも静的がマストで無理でした。
これもそんなことないと思うんですけどねぇ。絶対なんか方法ありそうですけど。当時結構調べたけど結局挫折しました。

WebBrowserにCookieを渡す

DataGridで無理ならWebページのテーブルでも表示させるかということで、WebBrowserコントロールを埋め込んで表示させようとしたんですが、このWebBrowserコントロールCookieが指定出来ないです。
今やっているのはHttpWebRequestとCookieContainerを使って独自のログインセッション張っているんですが、このログインセッションが引き渡せねぇ・・。


どうしようもないのですが出来ないと話にならなかったので、サーバ側で引数で○○をもらったら、それをセッションIDとして処理してブラウザにログインセッションを再指定する、というちょっとセキュリティホールになりそうな実装でカバーしてます。
WebBrowserにもさすがにURLは指定できるんで、一応これで強引にセッション引継ぎは出来るっちゃ出来るんですが、きついですね。

[TAB]キーのシミュレーション

これも出来ず。というかキーボードイベントの送出が出来ないという。Web系はセキュリティがうるさくていけないですね。
一応、VisualTreeHelperとか使ってTabIndexをたどることは出来るんですが、ものっそい面倒くさいです。
Enterキー押したらTabと同じ動きにしたいだけなの、とごねる客先と、そんなこと許容したらセキュリティがまずいの、とごねてるような気がするSilverlight先生の間で右往左往。


仕方ないのでフォーカス処理は自前実装、どうしてもTabキーシミュレートしたい場合はCOMでも使ってください的な実装になりました。

[F10]キーをキーイベントで受け取る

これも、無理。F10は大人の事情で(ブラウザ外実行であっても)封印されてます。
この結果もちょっと自信あります。

総評

ちなみに今はメモリリークと、TabControlにAddとRemoveを繰り返しただけで落ちる問題に苦しんでます。
Silverlight君、正直、なんというか、融通きかねぇやっちゃなぁって感じですねぇ。