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:
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;
}
}
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.
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