Как установить ImageSource как Xamarin.Forms.Button?

Я пытаюсь добавить фоновое изображение, используя свойство изображения в кнопке. Проблема, с которой я столкнулся, заключается в том, что я не могу установить StreamImageSource в качестве фона кнопки. Я столкнулся с приведенной ниже ошибкой, если попытаюсь это сделать.

Код, который я использую для установки изображения:

            ImageSource iconsource =ImageSource.FromStream(() => new MemoryStream(ImgASBytes));
            Button Icon = new Button ();
            Icon.Image = iconsource ;

Я обнаруживаю ошибку:

Ошибка CS0266: невозможно неявно преобразовать тип «Xamarin.Forms.ImageSource» в «Xamarin.Forms.FileImageSource». Существует явное преобразование (вам не хватает приведения?)


person Femil Shajin    schedule 29.09.2014    source источник
comment
Сообщение об ошибке сообщает, что кнопка ожидает FileImageSource. Вы пробовали подчиняться?   -  person Athari    schedule 29.09.2014
comment
Да .. Я сделал .. Свойство Image принимает путь к файлу только в виде строки .. И мой вопрос в том, как преобразовать imageource в fileimagesource ??   -  person Femil Shajin    schedule 29.09.2014


Ответы (6)


ImageSource.FromStream () возвращает StreamImageSource (см. документы). Button.Image принимает только FileImageSource (см. документы).

Это означает, что то, чего вы пытаетесь достичь, не сработает, как бы вы ни старались вложить одно в другое.

Button.Image будет принимать изображения, хранящиеся в качестве ресурсов в проектах вашей платформы и загруженные с помощью:

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

or

Icon.Image = "foobar.png";
person Stephane Delcroix    schedule 03.10.2014
comment
ImageSource.FromFile также возвращает экземпляр ImageSource. Итак, Icon.Image = ImageSource.FromFile (foobar.png); также приводит к ошибке приведения типа. Icon.Image = '' foobar.png действителен - person Sreeraj; 01.04.2015
comment
@Sreeraj прав. Мы до сих пор не нашли правильного способа сделать это. - person Jordan Hochstetler; 16.04.2015
comment
@Sreeraj Тоже ищу это. - person mamcx; 18.04.2015
comment
@stephane, вы уверены, что Button.Image принимает изображения только из папки ресурсов платформы. нельзя взять один из внутренней памяти устройства? - person Suchith; 19.11.2016
comment
@Suchith на момент написания, да, я был уверен. С тех пор это могло быть исправлено, я не помню. - person Stephane Delcroix; 19.11.2016
comment
У меня была такая же проблема, на которую ссылался @Sreeraj. Вот что у меня сработало: Icon.Image = (FileImageSource) ImageSource.FromFile (foobar.png); - person Christopher Brown; 19.09.2017

Принятый ответ - это правда, что вы не можете преобразовать StreamImageSource в FileImageSource, я думаю, что реальный вопрос заключается в том, как делиться изображениями в PCL и использовать их на кнопке, как если бы это было при создании Image формирует элемент управления.

Ответ состоит в том, чтобы иметь Grid, который содержит как объект Button, так и объект Image, где 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);

Возможно, вам придется поиграть с размерами и значениями толщины, но это должно дать вам кнопку со значком, на которую можно нажимать.

person Victor Chelaru    schedule 28.03.2018
comment
Здравствуйте, может быть, вы нашли другой способ более простого использования встроенных ресурсов? Ваш ответ - рабочее решение, но мне кажется, что использовать этот трюк - не лучшая практика. - person Leopik; 08.07.2018
comment
На мой взгляд, это совершенно верное решение, а не взлом. Думаю, image.InputTransparent = true делает решение красивым и чистым. - person 1iveowl; 12.06.2019

Начиная с Xamarin.Forms 3.4.0 теперь вы можете использовать ImageButton. Вы можете использовать встроенные изображения с помощью метода расширения объяснено в этом документе MS

person Post Impatica    schedule 30.01.2018

Будьте осторожны с прописными и строчными буквами в именах файлов.

Мне было интересно, почему мои изображения кнопок правильно отображались на симуляторе, а не на моем iPhone.

На устройстве имя файла должно точно совпадать, симулятор не заботится о верхнем и нижнем регистре в именах файлов.

person Tom    schedule 27.03.2015

Я использую это, и это работает

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

or

var imageA = new Image()
{
BackgroundColor = Color.Teal,
Source = (FileImageSource)ImageSource.FromFile(allergeneLocation)},
};
person AlvynFash    schedule 26.10.2015
comment
Это установка источника изображения, а не кнопки, как задается вопросом. - person Kyle; 02.12.2016
comment
@kyle Я показывал, как он может справиться с ошибкой CS0266: невозможно неявно преобразовать тип «Xamarin.Forms.ImageSource» в «Xamarin.Forms.FileImageSource». Существует явное преобразование (вам не хватает актерского состава?), Вдохновленное приведением, которое я выполнил в моем примере. - person AlvynFash; 15.11.2017

Вот что я пробовал:

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

        };

Во время компиляции я получаю необработанное исключение нулевой ссылки с описанием: Ссылка на объект не установлена ​​на экземпляр объекта. Я не уверен, поможет ли это кому-то еще попытаться решить эту проблему, но я нахожусь у той же стены.

person Schwagmister    schedule 09.05.2017
comment
Кнопка refreshBut = новая кнопка {Image = refreshBut.png}; Вы можете просто использовать это так ... - person Femil Shajin; 10.05.2017
comment
@FemilShajin всякий раз, когда я это делаю, я получаю нулевое исключение, потому что он не может найти ресурс. - person Schwagmister; 10.05.2017