如何将ImageSource设置为Xamarin.Forms.Button?

11
我是一名有用的助手,可以为您翻译文本。
我正在尝试使用按钮中的图像属性添加背景图像。我面临的问题是无法将StreamImageSource设置为按钮背景。如果我尝试这样做,会遇到下面给出的错误。
设置图像的代码如下:
            ImageSource iconsource =ImageSource.FromStream(() => new MemoryStream(ImgASBytes));
            Button Icon = new Button ();
            Icon.Image = iconsource ;
我遇到的错误:

错误 CS0266: 无法隐式转换类型 'Xamarin.Forms.ImageSource' 到 'Xamarin.Forms.FileImageSource'。存在一种显式转换 (是否缺少强制转换?)


错误信息告诉你该按钮需要 FileImageSource。你尝试过遵守吗? - Athari
1
是的,我做了。图像属性只接受字符串格式的文件路径。我的问题是如何将ImageSource转换为FileImageSource? - Femil Shajin
6个回答

13

ImageSource.FromStream() 返回一个 StreamImageSource(请参见文档)。而 Button.Image 只接受 FileImageSource(请参见文档)。

这意味着无论您如何尝试将一个转换为另一个,您所尝试实现的目标都不会实现。

Button.Image 将接受在平台项目中以资源形式存储的图像,并使用以下任一方式加载:

Icon.Image = ImageSource.FromFile ("foobar.png");
或者
Icon.Image = "foobar.png";

3
ImageSource.FromFile也返回一个ImageSource实例。因此,Icon.Image=ImageSource.FromFile("foobar.png"); 也会导致类型转换错误。Icon.Image=''foobar.png" 是有效的。 - Sreeraj
@Sreeraj是正确的。我们仍然没有找到正确的方法来做这件事。 - Jordan Hochstetler
@Sreeraj 我也在寻找这个。 - mamcx
@stephane 你确定 Button.Image 只接受来自平台资源文件夹的图像吗?我们不能从设备内部存储中获取图像吗? - Suchith
在写作时,我确实很确定,但这可能已经被修复了,我记不清了。 - Stephane Delcroix
我遇到了@Sreeraj提到的同样问题。这是对我有用的解决方法:Icon.Image = (FileImageSource)ImageSource.FromFile("foobar.png"); - Christopher Brown

6
接受的答案是正确的,你不能将 StreamImageSource 强制转换为 FileImageSource。我认为真正的问题在于如何在PCL中共享图像并在按钮上使用它们,就像创建 Image 表单控件时一样。
答案是创建一个包含 ButtonImage 对象的 Grid,其中 Image 重叠在 Button 上。
例如,C# 代码可能如下所示:
ImageSource imageSource = ImageSource.FromStream(() => new MemoryStream(imageAsBytes));

Button iconButton = new Button ();
iconButton.VerticalOptions = LayoutOptions.FillAndExpand;
iconButton.HorizontalOptions = LayoutOptions.FillAndExpand;

var image = new Image();
image.Source = imageSource;
// So it doesn't eat up clicks that should go to the button:
image.InputTransparent = true;
// Give it a margin so it doesn't extend to the edge of the grid
image.Margin = new Thickness(10);

var grid = new Grid();
// If we don't set a width request, it may stretch horizontally in a stack
grid.WidthRequest = 48;
// Add the button first, so it is under the image...
grid.Children.Add(iconButton);
// ...then add the image
grid.Children.Add(image);

您可能需要调整大小和粗细值,但这样可以让您获得一个带有图标的可点击按钮。

你好,也许你找到了另一种更容易使用嵌入式资源的方法?你的答案是一个可行的解决方案,但在我看来,使用这个技巧并不是最佳实践。 - Leopik
在我看来,这是一个完全有效的解决方案,而不是一个hack。image.InputTransparent = true使得解决方案变得简洁明了。 - 1iveowl

2

从Xamarin.Forms 3.4.0开始,您现在可以使用ImageButton。 您可以使用扩展方法在此MS文档中解释的嵌入式图像。


1

文件名中的大小写要小心。

我想知道为什么我的按钮图片在模拟器上显示正常,但在我的iPhone上不正常。

在设备上,文件名必须完全匹配,但是模拟器对文件名中的大小写不敏感。


0

我使用这个,它有效。

var imageA = new Image();
imageA.Source=(FileImageSource)ImageSource.FromFile(allergeneLocation)};

或者

var imageA = new Image()
{
BackgroundColor = Color.Teal,
Source = (FileImageSource)ImageSource.FromFile(allergeneLocation)},
};

这是设置图像源,而不是按钮,因为问题正在询问。 - Kyle
1
@kyle,我正在展示如何处理“Error CS0266: 无法隐式转换类型 'Xamarin.Forms.ImageSource' 为类型 'Xamarin.Forms.FileImageSource'。存在显式转换(您是否缺少强制转换?)”的问题,通过从我示例中执行的转换进行启发。 - AlvynFash

0

这是我尝试过的:

Button refreshBut = new Button
        {
            Image = (FileImageSource)
            (ImageSource.FromFile("refreshBut.png"))

        };

虽然它编译了,但我接着得到了一个未处理的空引用异常,描述为:对象引用未设置为对象的实例。我不确定这是否会帮助其他人尝试解决这个问题,但我也遇到了同样的困境。


按钮 refreshBut = 新的按钮 { 图像 = "refreshBut.png" }; 你可以直接这样使用... - Femil Shajin
每当我这样做时,我会得到一个空异常,因为它找不到资源。 - user3470887

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接