Microsoft 没有在官方文档中提供有关在 XAML 中绑定变量 ImageSource 的信息。您需要IValueConverter 和ImageSource.FromResource() 将string 转换为ImageSource 才能绑定变量Image。
在 Image Properties 中将您的 Image 设置为 Build: EmbeddedResource。
这是转换的扩展
public class EmbeddedToImageSourceConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string fileName && parameter is string assemblyName)
{
try
{
Debug.WriteLine("Assembly Name: " + assemblyName); // Just for reference, remove in Release mode
var imageSource = ImageSource.FromResource(assemblyName + "." + fileName, typeof(EmbeddedToImageSourceConverter).GetTypeInfo().Assembly);
return imageSource;
}
catch (Exception)
{
return value;
}
}
else
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
在您的 XAML 中
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
...
xmlns:extensions="clr-namespace:MyProject.Extensions">
<ContentPage.Resources>
<extensions:EmbeddedToImageSourceConverter x:Key="imageConverter" />
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout>
<Image Source="{Binding IconSource, Converter={StaticResource imageConverter}, ConverterParameter='MyProject.Resources.Images'}"
HeightRequest="40" WidthRequest="40" Aspect="AspectFit" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
在 C# 代码后面 (xaml.cs)
public string IconSource { get { return "photo.png"; } set { } }
public MainPage()
{
InitializeComponent();
BindingContext = this;
}
您可以将 BindingContext 设置为您的 ViewModel 并实现 INotifyPropertyChanged,这会将您的 XAML 中的 IconSource 图像与 C# 代码同步。
注意,我在 StaticResource imageConverter 的起始大括号附近的 <Image Source="{Binding IconSource, Converter={StaticResource imageConverter}, ... 行收到 Intellisense 错误/警告。错误提示 No DataContext found for Binding "。但代码工作正常。任何人都可以解释错误原因或改进示例代码以消除错误非常欢迎。如果找到原因,请编辑答案。