Te sugerimos que revises esta solución en un ambiente controlado antes de pasarlo a producción, un saludo.
Solución:
ImageSource.FromStream ()
devuelve un StreamImageSource
(ver documentos). Button.Image
acepta solo FileImageSource
(ver documentos).
Significa que lo que estás tratando de lograr no funcionará, no importa cuánto intentes mezclar uno con el otro.
Button.Image
aceptará imágenes almacenadas como recursos en sus proyectos de plataforma y cargadas con:
Icon.Image = ImageSource.FromFile ("foobar.png");
o
Icon.Image = "foobar.png";
La respuesta aceptada es true que no puedes emitirStreamImageSource
para FileImageSource
creo que la verdadera pregunta es cómo compartir imágenes en un PCL y usarlas en un botón, tal como se haría al crear un Image
control de formularios.
La respuesta es tener un Grid
que contiene tanto un Button
y un Image
objeto, donde el Image
se superpone a la Button
.
Por ejemplo, el código C# podría verse así:
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);
Es posible que tenga que jugar con los tamaños y los valores de grosor, pero esto debería generarle un botón en el que se puede hacer clic con un ícono.
A partir de Xamarin.Forms 3.4.0, ahora puede usar ImageButton. Puede usar imágenes incrustadas usando un método de extensión explicado en este documento de MS