Silverlight 1.0のレイアウトは正直きつい

さて、Cocoa TouchやAndoridもやらないといけないんですが、そろそろSilverlightやAIRでアプリを作ろうと思い、ちょこちょこ調べていました。

まずはmRadioをSilverlight(1.0)対応しようと思い、いろいろやりました。

・外部のasxファイルは再生できるか。

SilverlightにはMediaElementというコントロールがあり、SourceにURLを指定します。ドキュメントを見る限りはcrossdomainでも大丈夫なようにです。しかし、asxファイルを食わしてもNETWORK_ERRORになってしまいました。asxをパースして中のrefを直接指定したところ再生できました。面倒ですができないこともないです。

・xamlを動的に作って読み込めるか。

外部のRSSを読み込んで表示する場合など、xamlを動的に作成したいことがあります。silverlightObject.content.CreateFromXamlというメソッドに食わせると文字列がxamlのオブジェクトになるようです。あとはこれを、表示したいコンテナ.children.addでいけるようです。

こんな感じ。

handleLoad: function(plugIn, userContext, rootElement)  {
  var container = plugIn.content.findName("library");
  var xamlFragment = '<TextBlock Text="Hello, World!" />';
  var textBlock = plugIn.content.createFromXaml(xamlFragment, false);
  container.children.addtextBlock
},

・外部にあるxamlを動的にダウンロードして表示できるか。

silvelightObjectからDownloaderというコントローラを生成して外部のファイルをダウンロードできます。こんな感じ。

handleLoad: function(plugIn, userContext, rootElement)  {
  this.plugIn = plugin;
  var downloader = this.plugIn.createObject("Downloader");
  downloader.addEventListener("Completed", Silverlight.createDelegate(this, this.xamldataLoadComplete));
  downloader.open("GET", "foo.xaml");
  downloader.send();
},
xamldataLoadComplete: function (sender, eventArgs) {
  var libraryXml = this.plugIn.content.createFromXaml(sender.ResponseText);
  var container = this.plugIn.content.findName("library");
  container.children.add(libraryXml);
},

ダウンロード完了イベントのxamldataLoadCompleteの中でダウンロードしたファイルがテキストファイルであればsender.ResponseTextでデータが取得できるので、それをcreateFromXamlでXamlを作ってコンテナにAdd。

Downloaderにzipを食わせて中のファイルをファイル名指定で取り出したりもできるよう。

・Xamlからのイベント処理
これも簡単。Xaml側でJavaScriptのglobal関数を指定するだけ。

これくらいわかればあとは書くだけといきたいところだったのですが・・・ListViewみたいなものを作ろうと思い挫折しました。いろいろなサンプルをみてもほとんどコントロールが絶対値で座標指定がしてあります。。。

ドキュメントを見てもListViewという文字もOrientationも、Gridも見つかりません。。。

ググってたら
http://weblogs.asp.net/scottgu/pages/silverlight-tutorial-part-2-using-layout-management.aspxを見つけたのですが・・・
Silverlight 2です。
・・・なんかね。Silverlight 1.0であんまりがんばる必要はないのかな。。。と思いました。