Хотите подписаться на Prism Eventaggregator?

Я использую Xam.Plugin.Media, чтобы сделать снимок. Глядя на пример кода на git, он несколько раз проверяет, доступна ли камера и т. д. Если есть проблема, он использует xamarin DisplayAlert. Будучи хорошим мальчиком, я подключил кнопку к команде «сделать снимок». Итак, теперь я в своей модели просмотра проверяю наличие проблем с камерой и должен отображать предупреждение. Вопрос в том, можно ли использовать агрегатор событий для запуска события и подписки на него в представлении? Я просто хочу сказать пользовательскому интерфейсу, чтобы он выдал предупреждение. Все, что я читал о: агрегаторе событий, кажется, предполагает, что он предназначен для связи между моделями представлений. Как бы вы справились с этим? Спасибо... Эд


person Ed Staffin    schedule 28.04.2017    source источник


Ответы (1)


Судя по тому, что вы описываете, вам не нужен агрегатор событий.

Вы можете реализовать следующее для рабочего приложения с помощью Xam.Plugin.Media и Формы Prism

App.xaml.cs

public partial class App : PrismApplication
{
    public App() : base()
    {
    }

    protected override void OnInitialized()
    {
        InitializeComponent();
        NavigationService.NavigateAsync("MainPage");
    }

    protected override void RegisterTypes()
    {
        Container.RegisterTypeForNavigation<MainPage>();
        Container.RegisterInstance(CrossMedia.Current);
    }
}

MainPage.xaml

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             x:Class="AwesomePhotos.Views.MainPage">

    <Grid Padding="20">
        <Grid.RowDefinitions>
            <RowDefinition Height="40" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

    <Button Text="Snap Photo" 
            Command="{Binding TakePhotoCommand}"
            HorizontalOptions="CenterAndExpand"
            VerticalOptions="CenterAndExpand" />

    <Image Source="{Binding Image}" Aspect="AspectFit" Grid.Row="1" />

    </Grid>
</ContentPage>

MainPageViewModel.cs

public class MainPageViewModel : BindableBase
{
    IMedia _media;
    IPageDialogService _pageDialogService { get; }

    public MainPageViewModel(IPageDialogService pageDialogService, IMedia media)
    {
        _media = media;
        _pageDialogService = pageDialogService;

        TakePhotoCommand = new DelegateCommand(OnTakePhotoCommandExecuted);
    }

    public DelegateCommand TakePhotoCommand { get; }

    private ImageSource _image;
    public ImageSource Image
    {
        get { return _image; }
        set { SetProperty(ref _image, value); }
    }

    private async void OnTakePhotoCommandExecuted()
    {
        await _media.Initialize();

        if (!_media.IsCameraAvailable || !_media.IsTakePhotoSupported)
        {
            await _pageDialogService.DisplayAlertAsync("No Camera", ":( No camera available.", "OK");
            return;
        }

        var file = await _media.TakePhotoAsync(new StoreCameraMediaOptions
        {
            Directory = "Sample",
            Name = "test.jpg"
        });

        if (file == null)
            return;

        await _pageDialogService.DisplayAlertAsync("File Location", file.Path, "OK");

        Image = ImageSource.FromStream(() =>
        {
            var stream = file.GetStream();
            file.Dispose();
            return stream;
        });
    }
}
person Dan Siegel    schedule 28.04.2017