首页 > 解决方案 > NavigationStack 的 ScanPage 有问题

问题描述

我在 Xamarin 应用程序中的扫描有问题。只是很难解释。我的应用程序中有 4 个页面。我的扫描通过第 4 页中的按钮打开。当我第一次使用扫描时,我没有问题。只要停留在第 4 页上,我就可以毫无问题地进行大量扫描。但是当我在我的应用程序中使用“返回”按钮并进入第 3 页时,当我返回第 4 页并使用扫描时出现错误。

System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

此时我的 navigationStack 等于 0。

我的方法 GoBack 只是这样做:

Navigation.PopAsync();

当我扫描我的二维码并调用 SendPresenceAck() 时,扫描仪出现错误

private async Task SendPresenceAck(string paramA09) //, int? idPrestation)
    {

        int idParticipant;
        if (!int.TryParse(paramA09, out idParticipant))
        {
            //await this.ShowAlert("Attention", "Problème de lecture du QR Code.");
            await this.DisplayAlert("Attention", "Problème de lecture du QR Code.", "Cancel");

            return;
        }

        // On appelle le WS pour signifier la présence
        // On passe par validateService
        // On prépare la validation de la présence
        var validateService = new ValidatePresenceService(this.Token);

        // On ajoute la ligne à valider
        var validate = validateService.AddNewPresence(idParticipant, this.idPrestation, true);

        // On déclenche l'envoi au WS (si besoin)
        if (validate != null)
        {
            // On envoie uniquement en cas de connexion
            if (!Global.GetSettingsBool(TypeSettings.IsHorsConnexion))
            {
                //await validateService.SendAll();
                // Attention : si participant déjà enregistré : erreur 403
                try
                {
                    await validateService.Send(validate);
                    // await this.DisplayAlert("OK", "Le billet est validé.", "OK");
                    popupLoginView.IsVisible = true;
                    //Gestion du premier stack et du bouton
                    StckSLayout.BackgroundColor = Color.FromHex("#DD5500");
                    ImageBack.BackgroundColor = Color.White;
                    //BoxSEmpty.BackgroundColor= Color.FromHex("#DD5500");
                    button.BackgroundColor = Color.FromHex("#DD5500");
                    button.Text = "Blabla";
                    //BoxSEmpty.Clicked += boutonSortir;
                    button.Clicked += async (sender, e) =>
                    {
                        // Ouverture du scan
                        await BtnScanClicked(sender, e);



                    };
                    //Gestion à partir du deuxième stack
                    StckSLayoutMiddle.BackgroundColor = Color.FromHex("#DD7700");
                    LbldAlert.BackgroundColor = Color.FromHex("#641914");
                    LbldAlert.Text = "ALERTE";
                    LblSEnd.BackgroundColor = Color.FromHex("#641914");
                    LblSEnd.Text = "Blabla";
                    // 401 : impossible d'identifier le numéro du billet
                    //  await this.DisplayAlert("Attention", "Impossible d'identifier le numéro du billet, veuillez vérifier les informations de celui ci.", "Cancel");
                    //   return;



                }
                catch (WebException ex)
                {
                    HttpWebResponse objresponse = ex.Response as HttpWebResponse;
                    if (objresponse.StatusCode == HttpStatusCode.Forbidden)
                    {
                        popupLoginView.IsVisible = true;
                        //Gestion du premier stack et du bouton
                        StckSLayout.BackgroundColor = Color.FromHex("#DD5500");
                        ImageBack.BackgroundColor = Color.White;
                        //BoxSEmpty.BackgroundColor= Color.FromHex("#DD5500");
                        button.BackgroundColor = Color.FromHex("#DD5500");
                        button.Text = "Blabla";
                        //BoxSEmpty.Clicked += boutonSortir;
                        button.Clicked += async (sender, e) =>
                        {
                            // Ouverture du scan
                            await BtnScanClicked(sender, e);



                        };
                        //Gestion à partir du deuxième stack
                        StckSLayoutMiddle.BackgroundColor = Color.FromHex("#DD7700");
                        LbldAlert.BackgroundColor = Color.FromHex("#641914");
                        LbldAlert.Text = "ALERTE";
                        LblSEnd.BackgroundColor = Color.FromHex("#641914");
                        LblSEnd.Text = "Blabla";
                        // 403 : le participant a déjà été enregistré aujourd'hui
                        // Message d'erreur
                        // await this.DisplayAlert("Attention", "Le billet a déjà été enregistré, le numéro du billet a déjà été scanné auparavant.", "OK");
                        // return;

                    }
                    else if (objresponse.StatusCode == HttpStatusCode.NotFound)
                    {
                        popupLoginView.IsVisible = true;
                        //Gestion du premier stack et du bouton
                        StckSLayout.BackgroundColor = Color.FromHex("#DD5500");
                        ImageBack.BackgroundColor = Color.White;
                        //BoxSEmpty.BackgroundColor= Color.FromHex("#DD5500");
                        button.BackgroundColor = Color.FromHex("#DD5500");
                        button.Text = "Blabla";
                        //BoxSEmpty.Clicked += boutonSortir;
                        button.Clicked += async (sender, e) =>
                        {


                            // Ouverture du scan
                            await BtnScanClicked(sender, e);



                        };
                        //Gestion à partir du deuxième stack
                        StckSLayoutMiddle.BackgroundColor = Color.FromHex("#DD7700");
                        LbldAlert.BackgroundColor = Color.FromHex("#641914");
                        LbldAlert.Text = "ALERTE";
                        LblSEnd.BackgroundColor = Color.FromHex("#641914");
                        LblSEnd.Text = "Blabla";
                        // 404 : billet non valide

                        // await this.DisplayAlert("Attention", "Le billet n'est pas valide.", "Cancel");

                        //return;
                    }
                    else if (objresponse.StatusCode == HttpStatusCode.Unauthorized)
                    {
                        popupLoginView.IsVisible = true;
                        //Gestion du premier stack et du bouton
                        StckSLayout.BackgroundColor = Color.FromHex("#DD5500");
                        ImageBack.BackgroundColor = Color.White;
                        //BoxSEmpty.BackgroundColor= Color.FromHex("#DD5500");
                        button.BackgroundColor = Color.FromHex("#DD5500");
                        button.Text = "Blabla";
                        //BoxSEmpty.Clicked += boutonSortir;
                        button.Clicked += async (sender, e) =>
                        {
                            // Ouverture du scan
                            await BtnScanClicked(sender, e);



                        };
                        //Gestion à partir du deuxième stack
                        StckSLayoutMiddle.BackgroundColor = Color.FromHex("#DD7700");
                        LbldAlert.BackgroundColor = Color.FromHex("#641914");
                        LbldAlert.Text = "ALERTE";
                        LblSEnd.BackgroundColor = Color.FromHex("#641914");
                        LblSEnd.Text = "Blabla";
                        // 401 : impossible d'identifier le numéro du billet
                        //  await this.DisplayAlert("Attention", "Impossible d'identifier le numéro du billet, veuillez vérifier les informations de celui ci.", "Cancel");
                        //   return;

                    }
                }
                catch (Exception e)
                {
                    // Erreur
                    await this.DisplayAlert("Attention", e.Message, "Cancel");
                    return;
                }
            }
            else
            {
                // Hors connexion : on vérifie juste si l'utilisateur n'est pas déjà présent dans la table SQL

                // Attention : si pas de prestation : on a le droit d'enregistrer plusieurs fois la présence
                // Si il y a une prestation, en revanche, on doit vérifier qu'il n'est pas déjà inscrit

                if (validate.IdPrestation.HasValue &&
                    validateService.IsInscriptionAlreadyRecorded(validate))
                {
                    popupLoginView.IsVisible = true;

                    //Gestion du premier stack et du bouton
                    StckSLayout.BackgroundColor = Color.FromHex("#DD5500");
                    ImageBack.BackgroundColor = Color.White;
                    //BoxSEmpty.BackgroundColor= Color.FromHex("#DD5500");
                    button.BackgroundColor = Color.FromHex("#DD5500");
                    button.Text = "Blabla";
                    //BoxSEmpty.Clicked += boutonSortir;
                    button.Clicked += async (sender, e) =>
                    {


                        // Ouverture du scan
                        await BtnScanClicked(sender, e);



                    };
                    //Gestion à partir du deuxième stack
                    StckSLayoutMiddle.BackgroundColor = Color.FromHex("#DD7700");
                    LbldAlert.BackgroundColor = Color.FromHex("#641914");
                    LbldAlert.Text = "ALERTE";
                    LblSEnd.BackgroundColor = Color.FromHex("#641914");
                    LblSEnd.Text = "Blabla";

                    // Déjà trouvé : message d'erreur
                    // await this.DisplayAlert("Attention", "Le participant a déjà été enregistré.", "OK");
                    //
                    // return;


                }

            }
        }
        else
        {
            // Pb à l'insertion des données ??

        }


        return;


    }

异常就行了:

popupLoginView.IsVisible = true;

抱歉,很难解释,我不是英语,所以我希望有人理解并帮助我。谢谢。

标签: c#xamarinstackqr-code

解决方案


推荐阅读