2011年6月28日火曜日

Show GIF images in Windows Phone applications

JPEG and PNG are supported by BitmapImage of Silverlight, but GIF is not supported. However, with ImageTools available at CodePlex, GIF images can be handled.

(1) Download ImageTools from CodePlex.

http://imagetools.codeplex.com/

The format of the binary + documentation package is .rar, so utility software that can extract RAR files is required.


(2) Add DLLs found in bin\Phone folder to your project as necessary.

ImageTools.dll
ImageTools.IO.Gif.dll
ImageTools.Utils.dll


(3) Register the GIF decoder in initialization code.

ImageTools.IO.Decoders.AddDecoder<GifDecoder>();


(4) Construct an ExtendedImage instance based on GIF data.

// Create an empty ExtendedImage instance.
ExtendedImage exImage = new ExtendedImage();

// Create an instance of GIF decoder.
GifDecoder gifDecoder = new GifDecoder();

// Get a stream of GIF data from somewhere.
Stream gifStream = ...;

// Interpret the stream as GIF and set the result
// to the ExtendedImage instance.
gifDecoder.Decode(exImage, gifStream);


(5) Use as BitmapImage.

// Get a BitmapImage instance from somewhere.
BitmapImage bitmap = ...;

// Specify the ExtendedImage constructed based on GIF data
// as source of the BitmapImage.
using (var stream = exImage.ToStream())
{
    bitmap.SetSource(stream);
}


The above is an example for the case where input GIF data is available as stream, but if available as Uri, it seems to be enough to simply set the Uri to UriSource property of ExtendedImage. A code example for that case can be found at the following.

http://imagetools.codeplex.com/documentation

A class named ImageConverter implementing IValueConverter is also provided. It seems to be able to be used in XAML files.


Windows PhoneアプリでGIFを表示する

Silverlight の BitmapImage では JPEG と PNG はサポートされているものの、GIF はサポートされていない。しかし、CodePlex で公開されている ImageTools を使用すると、GIF 画像を扱うことができる。

(1) ImageTools を CodePlex からダウンロードする。

http://imagetools.codeplex.com/

バイナリ+ドキュメントのパッケージが .rar 形式なので、RAR を扱える解凍ソフトが別途必要。


(2) 解凍後の bin\Phone フォルダ以下にある DLL のうち、必要なものを適宜プロジェクトに追加する。

ImageTools.dll
ImageTools.IO.Gif.dll
ImageTools.Utils.dll


(3) 初期化コードで GIF デコーダを登録する。

ImageTools.IO.Decoders.AddDecoder<GifDecoder>();


(4) GIF データをもとに ExtendedImage のインスタンスを構築する。

// 空の ExtendedImage のインスタンスを作成する。
ExtendedImage exImage = new ExtendedImage();

// GIF デコーダのインスタンスを作成する。
GifDecoder gifDecoder = new GifDecoder();

// GIF データのストリームをどこかから持ってくる。
Stream gifStream = ...;

// ストリームを GIF として解釈し、デコード結果を ExtendedImage にセットする。
gifDecoder.Decode(exImage, gifStream);


(5) BitmapImage として利用する。

// BitmapImage インスタンスをどこかから持ってくる。
BitmapImage bitmap = ...;

// BitmapImage のソースとして、GIF データをもとに構築した
// ExtendedImage を指定する。
using (var stream = exImage.ToStream())
{
    bitmap.SetSource(stream);
}


上記は、入力 GIF データがストリームとして得られる場合の例だが、Uri として得られる場合は、単純に ExtendedImage の UriSource プロパティに Uri を設定するだけでよさそう。その場合のコード例は次の場所にある。

http://imagetools.codeplex.com/documentation

IValueConverter を実装した ImageCoverter というクラスもあるので、XAML の中でも使えそう。

2011年6月10日金曜日

Windows Phoneアプリをローカライズする

1. リソースの準備

1.1 デフォルト言語用リソースファイルを追加する

  • Visual Studio でプロジェクトを開く。
  • Solution Explorer でプロジェクト名を右クリックし、Add → New Item... と進む。
  • Add New Item ダイアログで Resources File を選択、適当なファイル名(例:AppResources.resx)を付けて Add ボタンをクリックする。


1.2 サポート対象言語用リソースファイルを追加する

  • 上記と同じ方法でリソースファイルを追加する。ファイル名にはカルチャーとランゲージを含めておく
日本語の例: AppResources.ja-JP.resx


1.3 リソースファイルをPublicアクセス可能にする

  • Solution Explorer でリソースファイルを開く。
  • AccessModifier リストボックスで Public を選択する
  • 同じ処理をすべてのリソースファイルに対しておこなう。


1.4 リソースファイルにエントリーを追加する

例:
AppResources.resx (en-US用) に次のエントリーを追加
Name=ApplicationDescriptionText
Value=This is an i18n-aware application.

AppResources.ja-JP.resx (ja-JP用) に次のエントリーを追加
Name=ApplicationDescriptionText
Value=これは国際化対応したアプリケーションです。



2. リソースの設定

2.1 デフォルトのカルチャーを定義する

  • Solution Explorer でプロジェクト名を右クリックし、Properties を選ぶ。
  • Application タブで、Assembly Information ボタンをクリックする。
  • Neutral Language でデフォルトのカルチャー(例: English (United States))を選択し、OK ボタンをクリックする。


2.2 サポート対象言語を宣言する

  • プロジェクトを閉じ、プロジェクトファイル(*.csproj)をテキストエディターで開く。
  • <SupportedCultures> タグを見つけ、そこに、セミコロン区切りでサポート対象言語をリストアップする。

日本語の例: <SupportedCultures>ja-JP;</SupportedCultures>




3. リソースにアクセスするための準備

3.1 リソースクラスにアクセスするためのアクセッサークラスを作成する

namespace MyApplication
{
    public class AppResourcesProvider
    {
        public AppResourcesProvider()
        {
        }

        private static AppResources appResources_ = new AppResources();

        public AppResources AppResources { get { return appResources_; } }
    }
}


3.2 アクセッサークラスのインスタンスを生成し、参照できるよう、App.xaml を編集する

Application タグに xmlns:local を追加し、Application.Resources タグに local:AppResourcesProvider を追加する。

<Application
    x:Class="MyApplication.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"      
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:local="clr-namespace:MyApplication"
    >

    <!--Application Resources-->
    <Application.Resources>
        <local:AppResourcesProvider x:Key="AppResourcesProvider" />
    </Application.Resources>

    <Application.ApplicationLifetimeObjects>
        <!--Required object that handles lifetime events for the application-->
        <shell:PhoneApplicationService
            Launching="Application_Launching" Closing="Application_Closing"
            Activated="Application_Activated" Deactivated="Application_Deactivated"/>
    </Application.ApplicationLifetimeObjects>

</Application>



4. リソースの利用

4.1 データバインディングを使い、アクセッサークラス経由でリソースを利用する

例:リソース ApplicationDescriptionText の値を TextBlock に設定する場合

<TextBlock Name="ApplicationDescription"
           Text="{Binding Source={StaticResource AppResourcesProvider},
                      Path=AppResources.ApplicationDescriptionText}" />



以上でローカライズの作業は終了。詳細は How to: Build a Localized Application for Windows Phone を参照のこと。

なお、リソースファイルを自動生成するためのコマンド ResGen が、自動生成するクラスのコンストラクタを internal ではなく public にしてくれれば、リソースクラスにアクセスするためのアクセッサークラスをわざわざ作成する必要はない:

http://connect.microsoft.com/VisualStudio/feedback/details/628281/silverlight-wp7-resource-files-and-binding

しかし、この問題はまだ解消されていない。

2011年6月9日木曜日

Windows Phoneのタイルにアプリケーションタイトルを表示させない

Windows Phone のタイルにアプリケーションタイトルを表示させないようにするには、WMAppManifest.xml の PrimaryToken の Title を空にする。これで、Office や XBOX のタイルのように、画像だけでタイルの見た目を構成することができる。

WMAppManifest.xml を直接編集しなくても、下記の手順でもいけそう。

  1. Visual Studio でプロジェクトを開く。
  2. Solution Explorer でプロジェクト名を右クリックし、Propertiesを選択する。
  3. Application タブの Tile options のところで、Title: を空にする。

・・・と思ったが、実際にやってみると、既に Title: に文字列が入っている状態から空文字列にしようとすると、Visual Studio が「An empty string is not allowed for Title」という警告ポップアップを出し、空文字列にすることを許してくれない(← さんからの指摘)。空文字列にしたい場合は、やはり直接 WMAppManifest.xml を編集しなければならないようだ。