我正在使用Xamarin形式的Rg.Plugins.Popup PCL并在按钮点击后打开弹出窗口。我想知道我可以理解弹出窗口上单击了哪个按钮的过程,这样我就可以根据弹出窗口上的选择实现下一部分代码。
<pages:PopupPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:pages="clr-namespace:Rg.Plugins.Popup.Pages;assembly=Rg.Plugins.Popup"
x:Class="ATSDriver.PopupDemo">
<ScrollView>
<StackLayout VerticalOptions="Center" HorizontalOptions="FillAndExpand" BackgroundColor="#ffffff" >
<StackLayout BackgroundColor="White" Padding="2">
<StackLayout VerticalOptions="Center" HorizontalOptions="FillAndExpand" >
<Label Text="Order Item Picture " TextColor="Black" VerticalOptions="Center" ></Label>
</StackLayout>
<Button Text="Next Picture" x:Name="btnClose" Clicked="btnClose_Clicked" StyleClass="ButtonLightBlack"></Button>
<Button Text="Complete Picture" x:Name="btnComplete" Clicked="btnClose_Clicked" StyleClass="ButtonLightBlack"></Button>
</StackLayout>
</StackLayout>
</ScrollView>
点击事件代码
private async void btnClose_Clicked(object sender, EventArgs e)
{
await Navigation.PopPopupAsync();
}
调用弹出窗口
下面的代码,我拍摄第一张照片后用于相机,我将打开上面的弹出窗口。如果用户点击了下一张图片,则用户拍下一张照片。如果用户点击完成图片,我将关闭相机并停止处理。目前我正在使用DisplayAlert
,但我想使用上面的弹出窗口。
async void bttnDelivery_Clicked1(object sender, EventArgs e)
{
try
{
var testPopup = new PopupDemo();
await Navigation.PushPopupAsync(testPopup);
// var action2 = await DisplayAlert("Do you want to continue take pictures?", "", "Complete Pictures", "Next Picture");
}
catch (Exception ex)
{
}
}
我只想更改Display Alert的以下代码部分以使用此Popup
var action2 = await DisplayAlert("Do you want to continue take pictures?", "", "Complete Pictures", "Next Picture");
if (action2 == false)
{
goto Pic;
}
if (action2 == true)
{
}
希望我的问题清楚。在此先感谢您的帮助
答案 0 :(得分:0)
我不知道我的问题是否正确,但我认为你可以使用两种分开的方法
<Button Text="Next Picture" x:Name="btnClose" Clicked="btnClose_Clicked" StyleClass="ButtonLightBlack"></Button>
<Button Text="Complete Picture" x:Name="btnComplete" Clicked="btnCompleted_Clicked" StyleClass="ButtonLightBlack"></Button>
将btnClose_Clicked
更改为btnCompleted_Clicked
然后您可以使用MessagingCenter ...
您的弹出窗口发送MessagingCenter。您的页面订阅这些MessagingCenter。
在btnCloseClicked中,您可以使用“下一步”发送MessagingCenter;在btnCompletedClicked中,您可以发送带有“已完成”的MessagingCenter
答案 1 :(得分:0)
我过去一直在努力解决这个问题,我制作了一种“模式”来解决我的问题,如下图所示。代码只是应用于您的场景的示例,但我认为您将获得主要想法。 我不确定这是在MVVM环境中做到这一点的最佳方式,但它对我来说非常好。
<强>配方:强>
TaskCompletionSource
类型(bool,enum,一些更复杂的类); 在您的具体情况下,这是代码:
创建一个枚举(不要介意,这只是我的强迫症)
public Enum EnumAction
{
NextPicture,
CompletePicture
}
在您网页的构造函数中预计有一个TaskCompletionSource
public partial class PopupDemo : Rg.Plugins.Popup.Pages.PopupPage
{
private TaskCompletionSource<EnumAction> task;
public PopupDemo(TaskCompletionSource<EnumAction> taskCompletion)
{
InitializeComponent();
task = taskCompletion;
}
}
处理设置任务结果的事件(或命令)
private async void btnClose_Clicked(object sender, EventArgs e)
{
Navigation.PopPopupAsync();
task?.SetResult(EnumAction.NextPicture)
}
private async void btnComplete_Clicked(object sender, EventArgs e)
{
Navigation.PopPopupAsync();
task?.SetResult(EnumAction.CompletePicture)
}
protected override void OnDisappearing()
{
base.OnDisappearing();
if(task != null)
if(!task.Task.IsCanceled && !task.Task.IsFaulted && !task.Task.IsCompleted)
task.SetCanceled();
}
在外部网页设置时,在您的域上下文中接收结果
async void bttnDelivery_Clicked1(object sender, EventArgs e)
{
try
{
var taskResult = new TaskCompletionSource<EnumAction>();
taskResult.ContinueWith(result =>
{
if(result.IsCompleted)
{
switch (result.Result)
{
case EnumAction.NextPicture:
break; // Make your magic here
case EnumAction.CompletePicture:
break; // Make your magic here
default:
break; // Make your magic here
}
}
});
var testPopup = new PopupDemo(taskResult);
await Navigation.PushPopupAsync(testPopup);
}
catch (Exception ex)
{
}
}
如果您有更好的方法来做这件事,请与我们分享。
我希望它可以帮到你(对任何英语错误感到抱歉)。