如何知道哪个按钮点击了Rg.Plugins.Popup

时间:2017-11-24 09:50:09

标签: c# xamarin.forms

我正在使用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)
                    {
}

希望我的问题清楚。在此先感谢您的帮助

2 个答案:

答案 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)
    {

    }
}

如果您有更好的方法来做这件事,请与我们分享。

我希望它可以帮到你(对任何英语错误感到抱歉)。