あいてぃーとふぼふ

Windows Phone 7.5 対応時の問題点!

今回は「Windows Phone 7.0」のアプリケーションを「Windows Phone 7.5」にアップグレードする際に遭遇した問題とその解決策をご紹介します。以前に作成した「MetroGnome」というアプリをアップグレードしたのですが、なかなかに一筋縄ではいきませんでした…orz。

その1:実行時にビヘイビアやトリガーが登録できない!

前回の投稿でご紹介した通り、Visual Studioの「Windows Phone 7.1 にアップグレード」機能を利用すると、既存のプロジェクトをアップグレードすることが可能です。ただしこの際、アプリケーションの実行時に「型 ‘Behavior’ の値は、型 ‘BehaviorCollection’ のコレクションまたはディクショナリに追加できません。」のような例外が発生する場合があります。わたしが実際にアップグレードしたプロジェクトは、自作のビヘイビアやトリガーアクションなどを格納したライブラリプロジェクトだったのですが、上記のエラーはこれらのビヘイビアやトリガーアクションがアプリ実行時に参照されたときに発生しました。

ということで、結論から申しますと「Microsoft.Expression.Interactions」や「System.Windows.Interactivity」などの参照を一旦削除してから再度登録すると、上記のエラーは解消されました。どうやら参照していたアセンブリが古かったみたいです。このようなケースでは、ビルドエラーにならず、実行時にエラーが発生するようですね。根本的な原因は調べていませんが、おそらくSilverlightのバージョンが4になったことによる弊害か、あるいはWPSDK7.1のインストール前にExpression関連のモジュールをすべてアンインストールしたためだと思います (=`ェ´=;)ゞ

その2:SL+XNAプロジェクトがBlendで編集できない!

以前の投稿で「Windows Phone Silverlight/XNA アプリケーション」を利用する場合、XNAカテゴリから生成すると日本語のコメントが付加される旨をご紹介しました。しかしながら、このプロジェクトをExpression Blendで編集しようとした場合、「App.xaml」や「Game.xaml」で左図のように「XML タグ’Application’ に対応する終了タグがありません。」のようなエラーが多数発生します。まぁ日本語が文字化けしていることを見ると、文字コードが怪しいであろうことはすぐにお判りいただけると思います。

ということで調べてみたところ、上記のプロジェクトでは、日本語でコメントが記載されているファイルがことごとく「UTF-8N」で記述されていました。つまりファイルの先頭にBOMが付加されていないわけです。ちなみにBOMとは、エンディアンや文字コードの種別に利用される情報のことで、Expression BlendはこのBOMがないとファイルの文字コードを「UTF-8」であると識別できないようです。これにより、日本語のコメントがタグごと文字化けしてしまい、今回のエラーが発生してしまいます。このため、サクラエディタなどで「App.xaml」や「Game.xaml」を「BOM付きのUTF-8」で保存してあげれば問題は解決です。それにしても、RC版にしてはちょっと詰めが甘いかも…(ノω<;)

その3:既存のスタイルを上書きできない!

Silverlightアプリを開発する場合、「App.xaml」や「Generic.xaml」でスタイルを管理するのが一般的です。「MetroGnome」でも「PhoneTextTitle1Style」や「PhoneTextNormalStyle」などの既存のスタイルを、「App.xaml」内で再定義(同一名のスタイルを定義)したりしています。こうすると、開発時には既存のスタイルを利用し、開発が完了した後に一括してスタイルを変更できるので便利なんですよね~。しかしながら、Silverlight4ではどうやら既存のスタイルを再定義することができないようです。

Visual StudioやExpression Blendのデザイナではきちんと再定義したスタイルが反映されているのですが、いざアプリを実行すると既定のスタイルが反映されてしまいます。多分ソースコードでガリガリやれば回避できそうではありますが、今回は時間が惜しかったので、自作したスタイルの名前を変更して対応しました。う~ん…泥臭い(´・ω・`)

残すは不具合修正と公開作業!

ということで、あとは細かな不具合を修正して公開するのみです!できれば曲の追加とかもしたいのですが…しばらくはちょっと無理そうかもです(T△T)。1日まるまる時間が取れれば可能だと思うんですが…なかなかどうして…orz