【问题标题】:System.ArgumentException: <Timeout exceeded getting exception details> Xamarin.FormsSystem.ArgumentException:<超时获取异常详细信息> Xamarin.Forms
【发布时间】:2017-11-21 16:26:36
【问题描述】:

我是这个很棒的平台的新手,我做了一个非常简单的例子,它只包含一个 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>

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

【问题讨论】:

    标签: xamarin.forms


    【解决方案1】:

    这个非常微妙且难以捕捉(嗯,实际上并不难捕捉;只需在 InitializeComponent 周围放置一个 try/catch 即可检查异常)。

    XAML 是声明性的,这使我们相信控件的属性顺序无关紧要。不幸的是,由于在某些时候声明性 XAML 转换为一系列属性分配,属性的顺序确实很重要,而 Slider 属性的顺序导致您的异常被抛出。

    您可以想象您的Slider 是通过以下方式构建的:

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

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

    当您的代码开始时,Maximum 的值默认为 0。但在赋值之前,Minimum 的值被赋值为16

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

    要解决这个问题,只需在 Minimum 值之前设置 Maximum 即可。

    【讨论】:

    • 现在说得通了,谢谢,你是对的,它有效
    • 我会说,Slider 的实现被破坏了
    【解决方案2】:

    正如@Paul 提到的。用 try-catch 包装它,它会提供有关异常的更多详细信息。我花了几个小时才弄清楚要这样做

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多