2016-08-06 4 views
0

私はXamarin.forms PCLプロジェクトを使ってappを作っています。AbsoluteLayoutのChildren from Xamarin.formsから画像が削除されない

私は自分のタイマーを作り、この機能を3秒ごとに呼びます。

void CreateBGAndAnimate() 
    { 
     Image bg = new Image() 
     { 
      Source = "_pagebaby_bg.png", 
      Aspect = Aspect.Fill 
     }; 
     AbsoluteLayout.SetLayoutFlags(bg, AbsoluteLayoutFlags.All); 
     AbsoluteLayout.SetLayoutBounds(bg, new Rectangle(0.5, 1, 1, 0.5)); 

     xAbsoluteLayout.Children.Insert(1, bg); 
     bg.Opacity = 0; 

     Task.Factory.StartNew(async() => 
     { 
      await bg.FadeTo(1, 500); 
      await bg.ScaleTo(2, 1000, Easing.SinInOut); 
      xAbsoluteLayout.Children.Remove(bg); 
     }); 
    } 

非常に奇妙な問題です。 FIrstイメージは決して削除されません。 最初のイメージの後に作成されたイメージは、期待通りに削除されます。

同じ問題に直面している人はいますか?

何が間違っていましたか?

ありがとうございました。

+0

MainThreadでUI操作を実行します。 –

+1

ここにある問題とは関係ありませんが、 'Task.Factory.StartNew()'の代わりに 'Task.Run()'を使うことを検討してください:https://blogs.msdn.microsoft.com/pfxteam/2011/10/24/task-run-vs-task-factory-startnew /とhttp://blog.stephencleary.com/2013/08/startnew-is-dangerous.html – Krumelur

+0

ありがとう@Krumelur –

答えて

1

あなたは、UIスレッド(メインスレッド)であなたのUIの操作を行う必要があります。 そのためにはDevice.BeginInvokeOnMainThreadメソッドを使用します。

void CreateBGAndAnimate() 
{ 
    Image bg = new Image() 
    { 
     Source = "_pagebaby_bg.png", 
     Aspect = Aspect.Fill 
    }; 
    AbsoluteLayout.SetLayoutFlags(bg, AbsoluteLayoutFlags.All); 
    AbsoluteLayout.SetLayoutBounds(bg, new Rectangle(0.5, 1, 1, 0.5)); 

    xAbsoluteLayout.Children.Insert(1, bg); 
    bg.Opacity = 0; 

    Task.Factory.StartNew(async() => 
    { 
     await bg.FadeTo(1, 500); 
     await bg.ScaleTo(2, 1000, Easing.SinInOut); 

     Device.BeginInvokeOnMainThread(() => xAbsoluteLayout.Children.Remove(bg)); 
    }); 
} 
+0

ありがとうございます。はい、そうです。私はビューを削除するためにUIスレッドを使用する必要はないと思った。 –

1

わかりませんが、操作がUIスレッドで実行されていることを確かめて、Opacityを切り替えて、コントロールを追加した後にコントロールを分割して表示したくないため、コントロールを追加しています。

私はまた、一時停止を挿入:

... 

bg.Opacity = 0; 
xAbsoluteLayout.Children.Insert(1, bg); 

Xamarin.Forms.Device.BeginInvokeOnMainThread(async() => 
{ 
    await bg.FadeTo(1, 500); 
    await bg.ScaleTo(2, 1000, Easing.SinInOut); 
    xAbsoluteLayout.Children.Remove(bg); 
}); 
+0

ありがとうございました。期待どおりに機能しました。 –

関連する問題