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

C# 如何知道哪个按钮点击了Rg.Plugins.Popup,c#,xamarin.forms,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="

我正在使用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>
调用弹出窗口 下面的代码,我使用的相机拍摄完第一张照片后,我会打开上面的弹出窗口。如果用户单击下一张图片,则用户将拍摄下一张图片。如果用户点击完整的图片,我将关闭相机并停止进程。目前我正在使用
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)
        {

        }
    }
我只想更改显示警报的下面代码部分以使用此弹出窗口

 var action2 = await DisplayAlert("Do you want to continue take pictures?", "", "Complete Pictures", "Next Picture");
                    if (action2 == false)
                    {
                        goto Pic;
                    }
                    if (action2 == true)
                    {
}

希望我的问题对你来说是清楚的。提前感谢您的帮助

我不知道我是否正确理解了您的问题,但我认为您可以使用两种不同的方法

   <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\u Clicked
更改为
btnCompleted\u Clicked

然后你可以使用MessagingCenter

您的弹出窗口发送消息中心。您的页面订阅这些MessagingCenter


在btnCloseClicked中,您可以发送带有“下一步”的MessagingCenter;在btnCompletedClicked中,您可以发送一个带有“Completed”的MessagingCenter

我过去也曾为这样的事情挣扎过,我制定了一种“模式”来解决我的问题,如下图所示。这段代码只是应用于您的场景的一个示例,但我认为您将了解主要内容。 我不确定这是在MVVM环境中实现它的最佳方式,但它对我来说非常有效

配方:

  • 创建一个您想要处理的类型的
    TaskCompletionSource
    (bool、enum、一些更复杂的类)
  • 将任务发送到域上下文之外的页面,但请确保此外部上下文处理可能的结果
  • 等待(或准备)收到有关所发送任务的答复
  • 如果任务按预期执行,则处理结果
在您的具体案例中,以下是代码:

创建一个枚举(不介意,这只是我的强迫症)

在页面的构造函数中,除了一个
TaskCompletionSource
之外

public partial class PopupDemo : Rg.Plugins.Popup.Pages.PopupPage
{
    private TaskCompletionSource<EnumAction> task;

    public PopupDemo(TaskCompletionSource<EnumAction> taskCompletion)
    {
        InitializeComponent();
        task = taskCompletion;
    }
}
在外部页面设置的域上下文中接收结果

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

    }
}
async void bttnDelivery\u Clicked1(对象发送方,事件参数e)
{
尝试
{
var taskResult=new TaskCompletionSource();
taskResult.ContinueWith(结果=>
{
如果(结果已完成)
{
开关(result.result)
{
案例EnumAction.NextPicture:
打破;//在这里施展你的魔法
案例EnumAction.CompletePicture:
打破;//在这里施展你的魔法
违约:
打破;//在这里施展你的魔法
}
}
});
var testPopup=新的PopupDemo(taskResult);
等待导航.PushPopupAsync(testPopup);
}
捕获(例外情况除外)
{
}
}
如果你有更好的方法做这样的事情,请与我们分享


我希望它能对您有所帮助(抱歉出现任何英文错误)。

我有一个问题,即当用户单击下一张图片或完整图片时,我在用户拍摄一张图片的同一部分调用它,我将弹出此弹出窗口以拍摄下一张或完整图片。我希望使用此弹出窗口而不是此
var action2=wait DisplayAlert(“您想继续拍照吗?”、“”、“完成照片”、“下一张照片”);
我不明白问题所在……您可以按“下一步”或“完成”吗?我在问题的弹出部分添加了说明在我的回答中添加了注释@a.Goutam
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)
    {

    }
}