画像ファイルに適当な名前を付けてハマりました。123.png
という名前を付けたのですが...
Local image
Xamarin.Forms で Image クラスの Source プロパティに local image を指定するときには、使えないファイル名があるので注意が必要です。公式ドキュメントの「Images in Xamarin.Forms」によれば、次の通りです。
only lowercase letters, numerals, the underscore, and the period are allowed
小文字、数字、アンダースコア、ピリオド。数字も大丈夫なのでは? Android プロジェクトの Resources/drawable に画像ファイルを置いて試してみましょう。先頭の文字にはもう少し制限があることが分かります。
ファイル名 | 説明 |
---|---|
sample.png |
可。 |
123sample.png |
不可。Resource.designer.cs のビルドに失敗します。Resource.designer.cs に 123image という変数が書き出されますが、C# の変数は数字で開始することはできません。 |
_123sample.png |
可。 |
.sample.png |
不可。ビルドは通りますが、画像は表示されません。Resource.designer.cs に書き出されません。 |
s.ample.png |
不可。次のようなビルドエラーとなります。: file name cannot contain '.' other than for specifying the extension. |
iOS ではアセットカタログを使うので、何でもいけます。何でも? さすがに /
は使えません。しかし、iOS だけで使える名前にしても仕方がないので、上記の制限の範囲で名前を付けることになります。
.png
は省略できます (PNG 以外の拡張子は省略できません)。次のどちらの書き方も有効です。
<Image Source="sample.png"/>
<Image Source="sample"/>
アセットカタログの名前に .png
を付けるのは変な感じがするから? そのせいでピリオドが使えなくなってる? このあたりの事情は分かりません。
Embedded image
共通プロジェクトの embedded image なら数字で開始することもできます。
ファイル名 | 説明 |
---|---|
'sample.png` | 可 |
123sample.png |
可 |
_123sample.png |
可 |
.sample.png |
可 |
s.ample.png |
不可 |
embedded image では、画像ファイルのパスの区切りにピリオドを使います。例えば App1\images\sample.png
ならば次のように指定します。
Image1.Source = ImageSource.FromResource("App1.images.sample.png");
s.ample.png
が不可なのは、s
フォルダの下を探しに行ってしまうからでしょう。ちなみに、.sample.png
は "App1.images..sample.png"
という指定で表示できました。
また、local image とは違って、.png
は省略できないようです。