これを行う適切な方法は、Xamarin フォームに関する Charles Petzold の優れた本の第 13 章で説明されています。
この問題に対する私のアプローチは (本とは異なります)、画像ファイル パスにコンバーターを使用することです。Button.Image プロパティは FileImageSource オブジェクトであり、ファイル パスが必要です。残念ながら、PCL 内の埋め込みリソースまたはコンテンツ ファイルは使用できません。iOS、Android、および UWP プロジェクトのそれぞれに個別のイメージ ファイルを追加する必要があります。これを行う方法は、画像を PCL に追加し、リンクを使用することです (既存のファイルの追加ダイアログのオプション)。
したがって、上記の問題に対する私のコンバーターアプローチは次のとおりです
<Button Image="{Binding Converter={StaticResource FileImageSourceConverter}, ConverterParameter=someImage.png}" />
静的リソース...
<ContentPage.Resources>
<ResourceDictionary>
<local:FileImageSourceConverter x:Key="FileImageSourceConverter"/>
</ResourceDictionary>
</ContentPage.Resources>
コンバーターは…
public class FileImageSourceConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string filename = parameter as string;
switch(Device.RuntimePlatform)
{
case Device.iOS:
case Device.Android:
default:
return filename;
case Device.Windows:
return Path.Combine("Images", filename);
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
このアプローチの利点は、(1) XAML が OnPlatform 要素で散らかっていないことです。(2) UWP プロジェクトのルート ディレクトリに画像を配置する必要はありません。(3) 一部の人が提案したのと同じ問題を解決するために、カスタム レンダリングを使用するよりもはるかに簡単です。