System.ArgumentException:<超时获取异常详细信息> Xamarin.Forms

Red*_* AT 14 xamarin.forms

我是这个很棒的平台的新手,我做了一个非常简单的例子,它只包含一个XAML页面.昨天它完美无瑕地工作,但是今天运行它时,它突然冒出了这个例外

这个例外:

例外

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>
Run Code Online (Sandbox Code Playgroud)

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*her 22

这是一个相当微妙,很难赶上(好,其实也不是很难赶上,只是把try/catch身边InitializeComponent,你可以检查除外).

XAML是声明性的,它使我们相信控件的属性顺序无关紧要.不幸的是,因为在某些时候声明性XAML 变成一系列属性赋值,属性的顺序确实很重要,它Slider是导致异常被抛出的属性的顺序.

你可以想象你Slider的构建方式如下:

var slider = new Slider();
slider.Minimum = 16;
slider.Maximum = 45;
...
Run Code Online (Sandbox Code Playgroud)

Slider.MinimumSlider.Maximum似乎以检查是否传递的值是有效的.

代码开始时,Maximum默认值为0.但在分配其值之前,Minimum将为s的值赋值16.

此时,您的Minimum值(16)大于默认Maximum值(0),因此ArgumentOutOfRangeException抛出了一个值.

要解决它,只需设置值Maximum之前Minimum,它确实有效.

  • 我会说,'Slider`的实现被打破了 (5认同)