У меня есть всплывающее окно, созданное с помощью Rg.Plugin.Popup.Pages:
public partial class DynamicPopup : PopupPage
{
public DynamicPopup(bool showCancellButton, params (string btnName, Action btnAction)[] btns)
{
InitializeComponent();
stkCancel.IsVisible = showCancellButton;
foreach (var btn in btns)
{
var stack = new StackLayout
{
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.FillAndExpand,
Padding = new Thickness(0, 0, 0, 10)
};
stack.Children.Add(new CustomLabel
{
HorizontalOptions = LayoutOptions.CenterAndExpand,
VerticalOptions = LayoutOptions.CenterAndExpand,
Text = btn.btnName,
FontSize = 16,
FontAttributes = FontAttributes.Bold
});
stack.GestureRecognizers.Add(new TapGestureRecognizer
{
Command = new Command(() =>
{
btn.btnAction();
CloseAllPopup();
})
});
stkParent.Children.Add(stack);
}
}
}
}
Короче говоря, оно принимает массив кортежей (строка, действие) и создает всплывающие кнопки с противоположным текстом.и нажмите событие из кортежей.На другой странице я нажимаю на ярлык, который показывает DynamicPopup
:
lbImg.GestureRecognizers.Add(new TapGestureRecognizer { Command = new Command(async() =>await AddPicture_Tapped()) });
и открываю DynamicPopup в AddPicture_Tapped:
private async Task AddPicture_Tapped()
{
var popup = new DynamicPopup(true, ("Take Picture", Utility.TakePic), ("Choose From Gallery", Utility.ChoosePic));
await Application.Current.MainPage.Navigation.PushPopupAsync(popup);
}
Utility.TakePic:
public async static void TakePic()
{
try
{
var cameraStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);
var storageStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);
if (cameraStatus != PermissionStatus.Granted || storageStatus != PermissionStatus.Granted)
{
var results = await CrossPermissions.Current.RequestPermissionsAsync(new[] { Permission.Camera, Permission.Storage });
cameraStatus = results[Permission.Camera];
storageStatus = results[Permission.Storage];
}
if (cameraStatus != PermissionStatus.Granted && storageStatus != PermissionStatus.Granted)
{
await App.Current.MainPage.DisplayAlert("Permissions Denied", "Unable to take photo", "OK");
return;
}
//await CrossMedia.Current.Initialize();
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
await App.Current.MainPage.DisplayAlert("No Camera", ":( No camera available.", "OK");
return;
}
var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
{
Directory = "ExpertsParteners",
Name = "Item_Pic.jpg",
PhotoSize = PhotoSize.Small,
DefaultCamera = CameraDevice.Rear
});
if (file == null)
{
return;
}
ImageData = new ImageData
{
FilePath = GetFileName(file.Path),
FileFullPath = file.Path,
FileBase64 = Convert.ToBase64String(ReadToEnd(file.GetStream()))
};
file.Dispose();
}
catch (MediaPermissionException ex)
{
await App.Current.MainPage.DisplayAlert("Permission required", ex.Message, "OK");
}
catch (Exception ex)
{
await App.Current.MainPage.DisplayAlert("Error - Take", ex.Message, "OK");
Debug.WriteLine(ex);
}
}
но когда я нажимаю «Сделать снимок» во всплывающем окне, при первом открытии камеры на секунду и автоматическом закрытии, а когда я снова нажимаю «Сделать снимок», срабатывает исключение:
System.InvalidOperationException: Только одна операция может быть активной одновременно в Plugin.Media.MediaImplementation.GetMediaAsync (UIKit.UIImagePickerControllerSourceType sourceType, System.String mediaType, Plugin.Media.Abstractions.StoreCameraMediaOptions Options)Media.MediaImplementation + d__22.событие клика.
РЕДАКТИРОВАТЬ
Я создал новыйвсплывающее окно (со статическими элементами управления) и переместило в него два метода TakePic
и ChoosePic
, теперь оно работает правильно, но я все еще хочу использовать динамическое всплывающее окно и сохранить методы в классе Utility
!