在xamarin表单上动态绑定图像源
我的问题是,我可以将字符串图像绑定到图像源吗? 我有多个图像,如果条件,图像将会改变。 所以:
Xamal上的Xamlforms:
Codebehind c#
public String someImage; public String SomeImage { set { if (someImage != value) { someImage = value; } } get { return someImage; } }
InitializeComponent部分:
if(true) { someImage = "backgroundListViewGren.png"; } else { someImage = "backgroundListViewRed.png"; }
图像位于便携式项目的“Images”文件夹中
但是,这不起作用,也许我不会做什么,但我不明白。 有解决方案?
我尝试使用ImageSource而不是字符串,但也不用。
我会在这里发布这个答案,因为它是我正在寻找的那个,我怀疑大多数人都是(并且谷歌目前在这里指导你,目前不是非常有帮助)。
如何使用XAML绑定图像:
XAML:
然后在ViewModel中,C#:
public string SomeImage { get { return string.Format("prefix-{0}-suffix.png", OtherProperty); } }
更新,更好,但基本上等效的c#你可以使用而不是上面的:
public string SomeImage => $"prefix-{OtherProperty}-suffix.png";
这当然是设置它的最简单方法,IMO :)。
编辑:不言而喻,但图像显然应该在每个平台的项目的Resources
文件夹中。
你说:
图像位于便携式项目的“Images”文件夹中
每个平台都有不同的资源和图像方法。 Xamarin处理每个平台,例如Xamarin.iOS有嵌入资源,而Xamarin.Android使用Android资源进行图像处理。
您应该将图像放在每个项目中,以便Xamarin.Forms知道在每个平台中查找它们的位置。
有关更多信息,请查看此内容 。
要使用PCL中的图像,请在Xamarin文档中查看此部分。
您应该确保每个图像的Build action
都设置为Embedded Resource
。
然后,如果要在XAML中使用它们,请指定MarkupExtension
[ContentProperty ("Source")] public class ImageResourceExtension : IMarkupExtension { public string Source { get; set; } public object ProvideValue (IServiceProvider serviceProvider) { if (Source == null) { return null; } // Do your translation lookup here, using whatever method you require var imageSource = ImageSource.FromResource(Source); return imageSource; } }
然后,您应该能够像这样使用您的图像。
就像在评论中提到的那样,如果您希望这个开箱即用,请将它们放在各自平台项目的Resources文件夹中。 这样,您还可以利用现有的自动resize机制。 要阅读有关此方法的更多信息,请参阅此页面
通过在右侧文件夹中添加正确的命名约定,您可以简单地引用文件名,Xamarin.Forms会将其转换为适合平台的格式。
我认为你可以做得更简单一些。 这正在我的工作。 将图像放在每个平台上的适当位置,例如。 Android上的资源/绘图
在你的Xaml中:
在您的视图模型中:
private string _someImage = "icon_eye_hidden"; public string someImage { get => this._someImage; set { if (this._someImage == value) return; this._someImage = value; this.RaisePropertyChanged(() => this.someImage); } }
然后只需将someImage设置为图像的名称(没有扩展名),它应该更新。