首页 文章

不会从Xamarin.forms上的AbsoluteLayout的Children中删除图像

提问于
浏览
0

我正在使用Xamarin.forms PCL项目制作应用程序 .

我做了我的计时器并且每隔三秒调用一次这个功能 .

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 Image . 在第一个之后创建的图像将按照我的预期删除 .

是否有人面临同样的问题?

我错了什么?

谢谢 .

2 回答

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

相关问题