web-dev-qa-db-fra.com

System.ArgumentException: <délai d'attente dépassé pour l'obtention des détails de l'exception> Xamarin.Forms

Je suis nouveau sur cette plate-forme géniale, j'ai fait un exemple très simple, il ne contient qu'une seule page XAML. Hier, cela a fonctionné parfaitement, mais quand il a été lancé aujourd'hui, il a jeté cette exception de nulle part

C'est l'exception:

 Exception

HelloPage.xaml:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.Microsoft.com/winfx/2009/xaml"
         x:Class="SAP.HelloPage">

<!--  la configuration personalisé pour chaque system d'éxploitation   -->
   <ContentPage.Padding>
       <OnPlatform x:TypeArguments="Thickness"
             iOS="0,10,0,0"
             Android="0,40,0,0">
      </OnPlatform>
   </ContentPage.Padding>  


  <StackLayout HorizontalOptions="Center" BindingContext="{x:Reference sliderID}">

     <Button Clicked="Button_Clicked" Text="Suivant"/>

     <Label x:Name="lb_font"  Text="Font is :"/>


     <Slider Minimum="16" Maximum="45"  x:Name="sliderID"  ValueChanged="sliderID_ValueChanged"/>

     <Label x:Name="lb_quote"/>

  </StackLayout> 
<ContentPage>

HelloPage.xaml.cs:

public partial class HelloPage : ContentPage
{

   // quotes
   List<string> quotes = new List<string>()
   {
       "Bienvenu, la première paragraphe",
       "une autre quote, cella j'adore",
       "La troisième est magnifique"
   };

   int pos = 0;

   public HelloPage()
   {
        InitializeComponent();

        // settings initialisation
         lb_quote.Text = quotes.ElementAt(0);
  }


private void Button_Clicked(object sender, EventArgs e)
{
    if(pos == quotes.Count)
    {
        pos = 0;
    }

    lb_quote.Text = quotes.ElementAt(pos);
    pos += 1;

 }

private void sliderID_ValueChanged(object sender, ValueChangedEventArgs e)
{
    lb_font.Text ="Font Size : " + sliderID.Value.ToString();
    lb_quote.FontSize = sliderID.Value;
  }
}
10
Reda AT

Celui-ci est assez subtil et difficile à détecter (eh bien, en fait, ce n'est pas difficile à saisir; il suffit de mettre un try/catch autour de InitializeComponent et vous pouvez examiner l'exception).

XAML est déclaratif, ce qui nous fait croire que l'ordre des attributs d'un contrôle n'a pas d'importance. Malheureusement, étant donné qu'à un moment donné le XAML déclaratif [ sera transformé en une séquence d'affectations de propriétés, l'ordre des attributs importe est important et c'est l'ordre de vos attributs Slider qui provoque la levée de votre exception.

Vous pouvez imaginer que votre Slider soit construite de la manière suivante:

var slider = new Slider();
slider.Minimum = 16;
slider.Maximum = 45;
...

Mais Slider.Minimum et Slider.Maximum semblent vérifier si les valeurs transmises sont valides.

Lorsque votre code commence, la valeur Maximum est définie par défaut sur 0. Mais avant que sa valeur puisse être affectée, la valeur de Minimum est affectée à 16.

À ce moment, votre valeur Minimum (16) est supérieure à la valeur Maximum par défaut (0) et, par conséquent, une ArgumentOutOfRangeException est renvoyée.

Pour le résoudre, il suffit de définir Maximum avant la valeur Minimum et cela fonctionne.

18
Paul Kertscher

Comme @Paul l'a mentionné. Enveloppez-le avec try-catch et cela donnera plus de détails sur l'exception. J'ai passé quelques heures avant de pouvoir le faire

0
Brikesh Kumar