Maui的Page 提供了一个DisplayAlertAsync的方法

    public Task DisplayAlertAsync(string title, string message, string cancel)
    {
        return DisplayAlertAsync(title, message, null, cancel, FlowDirection.MatchParent);
    }

    public Task<bool> DisplayAlertAsync(string title, string message, string accept, string cancel)
    {
        return DisplayAlertAsync(title, message, accept, cancel, FlowDirection.MatchParent);
    }

    public Task DisplayAlertAsync(string title, string message, string cancel, FlowDirection flowDirection)
    {
        return DisplayAlertAsync(title, message, null, cancel, flowDirection);
    }

用着不够方便,所以呵呵。

一、准备工作

  1. 上一次回头要折腾的本地化资源的事情折腾了一下,在Demo项目添加了一个页面Pages\PResource。用这个页面添加了几个中英文字符串。
  2. 为了这个页面,在LunZi项目写了一个JsonExtensions和PreferenceExtensions的静态类,也算两个小轮子吧。

By the way,LunZi保存在Gitee了。

二、MessageBox(简写MB)

public static class MB
{
    static SemaphoreSlim _Semaphore = new(1, 1);

    static PMMessage _PMMessage = new();
    public static async Task ShowAsync(string message, int delaySeconds = 15)
    {
        try
        {
            await _Semaphore.WaitAsync();
            if (MainThread.IsMainThread)
                await _PMMessage.ShowMessageAsync(message, delaySeconds);
            else
                await MainThread.InvokeOnMainThreadAsync(async () => await _PMMessage.ShowMessageAsync(message, delaySeconds));
        }
        finally
        {
            _Semaphore.Release();
        }
    }

    public static async Task ExceptionAsync(Exception e)
    {
        try
        {
            await _Semaphore.WaitAsync();
            if (MainThread.IsMainThread)
                await _PMMessage.ErrorAsync(e.GetFriendMessage(), VMTrace.CreateList(e.StackTrace));
            else
                await MainThread.InvokeOnMainThreadAsync(async () => await _PMMessage.ErrorAsync(e.GetFriendMessage(), VMTrace.CreateList(e.StackTrace)));

        }
        finally
        {
            _Semaphore.Release();
        }
    }
    public static async Task ExceptionAsync(string message, string? traceJson)
    {
        try
        {
            await _Semaphore.WaitAsync();
            await _PMMessage.ErrorAsync(message, traceJson?.ToObjectList<VMTrace>());
        }
        finally
        {
            _Semaphore.Release();
        }
    }

    
    public static async Task<bool> ConfirmAsync(object message, int delaySeconds = 15)
    {
        try
        {
            await _Semaphore.WaitAsync();

            if (MainThread.IsMainThread)
                return await _PMMessage.ShowConfirmAsync(message.ToString(), delaySeconds);
            else
                return await MainThread.InvokeOnMainThreadAsync(() => _PMMessage.ShowConfirmAsync(message.ToString(), delaySeconds));


        }
        finally
        {
            _Semaphore.Release();
        }
    }
}

三、效果
image
image
image
image

四、后续

  1. 键盘侦听
  2. 右上角画个×