DisplayAlert Xamarim 表单 [英] DisplayAlert Xamarim forms

查看:27
本文介绍了DisplayAlert Xamarim 表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个:

var accept = await DisplayAlert("Title", "ask", "yes", "not");

如果用户没有选择任何选项,displayalert 消失,我希望这个 displayalert 可见 5 秒

我该怎么做?

解决方案

欢迎来到 SO!

不幸的是,Xamarin Forms 没有为警报 windown 提供类似 Dismiss 的方法.但是,我们可以使用其他方式来实现这一点.例如使用

I Have this:

var accept = await DisplayAlert("Title", "ask", "yes", "not");

I would like this displayalert to be visible for 5 seconds if the user does not choose any option the displayalert disappears

how can i do this?

解决方案

Welcome to SO !

Unfortunately , Xamarin Forms not provides some like Dismiss method for alert windown . However , we can use other ways to achieve that . Such as using Xamarin.Forms DependencyService .

First , we can create a IShowAlertService interface in xamarin forms :

public interface IShowAlertService
{
    Task<bool> ShowAlert(string title,string message,string ok, string cancel);
}

Next in iOS , Create its implement class :

[assembly: Dependency(typeof(ShowAlertService))]
namespace XamarinTableView.iOS
{
    class ShowAlertService : IShowAlertService
    {
        TaskCompletionSource<bool> taskCompletionSource;
        public Task<bool> ShowAlert(string title, string message, string ok, string cancel)
        {
            taskCompletionSource = new TaskCompletionSource<bool>();

            var okCancelAlertController = UIAlertController.Create(title, message, UIAlertControllerStyle.Alert);

            //Add Actions
            okCancelAlertController.AddAction(UIAlertAction.Create(ok, UIAlertActionStyle.Default, alert => { 
                Console.WriteLine("Okay was clicked");
                taskCompletionSource.SetResult(true);
            }));
            okCancelAlertController.AddAction(UIAlertAction.Create(cancel, UIAlertActionStyle.Cancel, alert => { 
                Console.WriteLine("Cancel was clicked");
                taskCompletionSource.SetResult(true);
            }));

            UIWindow window = UIApplication.SharedApplication.KeyWindow;
            var viewController = window.RootViewController;
            //Present Alert
            viewController.PresentViewController(okCancelAlertController, true, null);

            Device.StartTimer(new TimeSpan(0, 0, 3), () =>
            {
                taskCompletionSource.SetResult(false);

                Device.BeginInvokeOnMainThread(() =>
                {
                    okCancelAlertController.DismissViewController(true,null);
                    // interact with UI elements
                    Console.WriteLine("Auto Dismiss");
                });
                return false; // runs again, or false to stop
            });


            return taskCompletionSource.Task;
        }

}

And in Android , also do that :

[assembly: Dependency(typeof(ShowAlertService))]
namespace XamarinTableView.Droid
{
    class ShowAlertService : IShowAlertService
    {
        TaskCompletionSource<bool> taskCompletionSource;

        public Task<bool> ShowAlert(string title, string message, string ok, string cancel)
        {
            taskCompletionSource = new TaskCompletionSource<bool>();

            Android.App.AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.Instance);
            AlertDialog alert = dialog.Create();
            alert.SetTitle("Title");
            alert.SetMessage("Complex Alert");
            alert.SetButton("OK", (c, ev) =>
            {
                // Ok button click task 
                Console.WriteLine("Okay was clicked");
                taskCompletionSource.SetResult(true);
            });
            alert.SetButton2("CANCEL", (c, ev) => {
                Console.WriteLine("Cancel was clicked");
                taskCompletionSource.SetResult(false);
            });
            alert.Show();

            Device.StartTimer(new TimeSpan(0, 0, 3), () =>
            {
                taskCompletionSource.SetResult(false);

                Device.BeginInvokeOnMainThread(() =>
                {
                    alert.Dismiss();
                    // interact with UI elements
                    Console.WriteLine("Auto Dismiss");
                });
                return false; // runs again, or false to stop
            });

            return taskCompletionSource.Task;
        }
    }
}

Here in Android , need to create a static Instance in MainActivity . Becasue we need to use it in ShowAlertService :

public class MainActivity : FormsAppCompatActivity
{
    internal static MainActivity Instance { get; private set; }  

    protected override void OnCreate(Bundle savedInstanceState)
    {
        // ...
        Instance = this;
    }
    //...
}

Now in Xamarin Forms , we can involke it as follow :

private async void Button_Clicked(object sender, EventArgs e)
{
    bool value = await DependencyService.Get<IShowAlertService>().ShowAlert("Alert", "You have been alerted", "OK", "Cancel");

    Console.WriteLine("Value is : "+value);
}

The effect as follow :

这篇关于DisplayAlert Xamarim 表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆