Я использую Xam.Plugin.Media, чтобы сделать снимок. Глядя на пример кода на git, он несколько раз проверяет, доступна ли камера и т. д. Если есть проблема, он использует xamarin DisplayAlert. Будучи хорошим мальчиком, я подключил кнопку к команде «сделать снимок». Итак, теперь я в своей модели просмотра проверяю наличие проблем с камерой и должен отображать предупреждение. Вопрос в том, можно ли использовать агрегатор событий для запуска события и подписки на него в представлении? Я просто хочу сказать пользовательскому интерфейсу, чтобы он выдал предупреждение. Все, что я читал о: агрегаторе событий, кажется, предполагает, что он предназначен для связи между моделями представлений. Как бы вы справились с этим? Спасибо... Эд
Хотите подписаться на Prism Eventaggregator?
Ответы (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