创建一个"吐司"

时间:2018-05-07 05:00:33

标签: xamarin.forms toast

我一直在努力获得与Android相似的功能" toast"使用Xamarin表格。环顾四周后,我发现了我认为是一个很好的解决方案。一般方法似乎是制作一个新的绝对布局,并使其出现一段时间,然后消失。虽然我认为我一般都明白正在做什么,但我似乎无法让它发挥作用。如果我想在我的主页上出现一个祝酒词,有人可以建议我如何使用这个类吗?我应该在XAML文件中添加AbsoluteLayout吗?对不起,我确定这是一个简单的问题,但我无法弄明白该做什么...

非常感谢任何帮助!

public static class Popper
{
    public async static Task Pop (string message, AbsoluteLayout attachLayout, int showforMilliseconds = 1500)
    {
        var container = new StackLayout
        {
            HorizontalOptions = LayoutOptions.Center,
            VerticalOptions = LayoutOptions.Center,
            BackgroundColor = Color.FromHex ("#DDEFEFEF"),
            Padding = 10
        };

        var label = new Label
        {
            Text = message,
            FontAttributes = FontAttributes.Bold,
            Style = (Style)Application.Current.Resources["PopupText"]
        };

        container.Children.Add (label);

        container.Scale = 0;
        container.Opacity = 0;

        attachLayout.Children.Add (container, attachLayout.Bounds, AbsoluteLayoutFlags.PositionProportional);
        container.ScaleTo (1.0f, 100);
        container.FadeTo (1.0f, 100);

        await Task.Delay (showforMilliseconds);

        container.ScaleTo (0.0f, 250);
        await container.FadeTo (0.0f, 250);
        attachLayout.Children.Remove (container);
    }
}

1 个答案:

答案 0 :(得分:1)

Android上,您不必重新发明轮子,因为本地存在Toast。在其他平台上没有像Toast这样的东西,因此这里没有银弹解决方案。多个人已经通过多种方式解决了这个问题,这就是为什么我发表评论说你的问题可能与现有的多个例子的副本重复。

现在关于你的想法。您的实施工作正常,但只会在Toast上显示AbsoluteLayout。为什么要设置这样的限制?如果您将重新检查我在评论中分享的链接,您将找到更合适和更优雅的解决方案。

  

我似乎无法让它发挥作用。

您只需在页面上AbsoluteLayout,就可以调用方法:

await Popper.Pop("Hello world", referenceToYourAbsoluteLayout, 5000);

如果您仍然出于某种原因想要坚持这个确切的解决方案,那么改为使用扩展方法也许是有意义的。然而,这个解决方案对普通用户来说没有意义。

P.S:请再次查看existing thread以获取更多信息和详细信息。

P.S.S:您的代码段的用法示例

<!-- XXXPage.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"
    xmlns:local="clr-namespace:XXX"
    x:Class="XXX.XXXPage">
    <AbstractLayout x:name="myLayout />
</ContentPage>

// XXXPage.xaml.cs
public partial class XXXPage : ContentPage
{
    public Test999Page()
    {
        InitializeComponent();

    }

    async protected override void OnAppearing()
    {
        base.OnAppearing();
        await Popper.Pop("Hello world", myLayout, 5000);
    }
}