заполнение ImageSource селектором - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь заполнить изображение из селектора на основе этого https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/dependency-service/photo-picker

селектор работает нормально, и поток заполняется. однако я не получаю изображение на моем экране.

    public Command SelectPictureCommand { get; }

    public ImageSource ItemPic { get; set; }

        SelectPictureCommand = new Command(execute: async () =>
        {
            if (IsBusy)
            {
                return;
            }

            IsBusy = true;

            try
            {
                Stream stream = await DependencyService.Get<IPhotoPickerService>().GetImageStreamAsync();

                if (stream != null)
                {
                    ItemPic = ImageSource.FromStream(() => stream);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
            finally
            {
                IsBusy = false;
            }
        });

xaml

        <StackLayout Orientation="Vertical" HorizontalOptions="End">
            <Button Text="Select Picture" Command="{Binding SelectPictureCommand}"/>
            <Image Source="{Binding ItemPic}" WidthRequest="300" HeightRequest="300"/>
        </StackLayout>

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Вы должны реализовать интерфейс INotifyPropertyChanged в вашей ViewModel или Model:

ViewModels обычно реализует интерфейс INotifyPropertyChanged, что означает, что класс вызывает событие PropertyChanged всякий раз, когда изменяется одно из его свойств. Механизм привязки данных в Xamarin.Forms присоединяет обработчик к этому событию PropertyChanged, чтобы он мог получать уведомления об изменении свойства и обновлять цель с новым значением.

public class myViewModel : INotifyPropertyChanged {

    public event PropertyChangedEventHandler PropertyChanged;

    public Command SelectPictureCommand { get; }

    public ImageSource itemPic { get; set; }


    public ImageSource ItemPic
    {
        set
        {
            if (itemPic != value)
            {
                itemPic = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("ItemPic"));
                }
            }
        }
        get
        {
            return itemPic;
        }
    }

    public myViewModel() {

        SelectPictureCommand = new Command(execute: async () =>
        {
            //if (IsBusy)
            //{
            //    return;
            //}

            //IsBusy = true;

            try
            {
                Stream stream = await DependencyService.Get<IPhotoPickerService>().GetImageStreamAsync();

                if (stream != null)
                {
                    ItemPic = ImageSource.FromStream(() => stream);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
            finally
            {
                //IsBusy = false;
            }
        });
    }
}

Я загрузил образец здесь и вы можете проверить. Не стесняйтесь задавать мне любые проблемы, если у вас есть.

0 голосов
/ 28 января 2020

Вы можете использовать CrossMedia Plugin, например:

  await CrossMedia.Current.Initialize();
  var file = await CrossMedia.Current.PickPhotoAsync();

  var filestream = file.GetStream();
  byte[] buff = ConverteStreamToByteArray(filestream);

  image.Source = ImageSource.FromStream(buff);
  filestream.Dispose();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...