web-dev-qa-db-ja.com

System.ArgumentException:<例外の詳細の取得中にタイムアウトが発生しました> Xamarin.Forms

私はこの素晴らしいプラットフォームを初めて使用します。XAMLページを1つだけ含む非常に簡単な例を作成しました。昨日は問題なく機能していましたが、今日実行すると、この例外がどこからともなく投げ出されました

これは例外です:

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;
  }
}
14
Reda AT

これは非常に微妙でキャッチするのが難しいです(実際、キャッチするのは難しくありません。InitializeComponentの周りにtry/catchを置くだけで、例外を調べることができます)。

XAMLは宣言型であるため、コントロールの属性の順序は重要ではないと考えられます。残念ながら、ある時点で宣言的なXAML willは一連のプロパティ割り当てに変換されるため、属性の順序doesは重要であり、Sliderの順序です例外がスローされる原因となっている属性。

Sliderが次のように構築されることを想像できます。

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

ただし、Slider.MinimumおよびSlider.Maximumは、渡された値が有効かどうかを確認するようです。

コードが開始されると、Maximumの値はデフォルトで0になります。ただし、その値を割り当てる前に、Minimumの値には16の値が割り当てられます。

この時点で、Minimum値(16)はデフォルトのMaximum値(0)よりも大きいため、ArgumentOutOfRangeExceptionがスローされます。

これを解決するには、Maximum値の前にMinimumを設定するだけで機能します。

22
Paul Kertscher

@Paulが述べたように。 try-catchでラップすると、例外に関する詳細が表示されます。私はそれを理解する前に数時間を費やしました

2
Brikesh Kumar