图像未从AbsoluteLayout';s Xamarin.forms上的儿童

本文关键字:forms Xamarin AbsoluteLayout 图像 | 更新日期: 2023-09-27 18:01:12

我正在使用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);
        });
    }

还有一个非常奇怪的问题。第一个图像永远不会被删除。和第一个之后创建的图像被删除,正如我所期望的。

有人面临同样的问题吗?

我做错了什么?

谢谢。

图像未从AbsoluteLayout';s Xamarin.forms上的儿童

您必须在UI线程(主线程(中执行UI操作。为此,请使用设备。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));
    });
}

不确定,但我肯定会确保操作在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);
});