惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
About on SuperTechFans
Y
Y Combinator Blog
V
V2EX
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Visual Studio Blog
博客园 - 叶小钗
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
H
Help Net Security
小众软件
小众软件
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
WordPress大学
WordPress大学
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
B
Blog
G
Google Developers Blog
J
Java Code Geeks
博客园 - 三生石上(FineUI控件)
IT之家
IT之家
N
Netflix TechBlog - Medium
腾讯CDC

博客园 - 毛毛虫

[Maui] 轮子——插件式开发 [Maui] Windows部署 [Maui] 造轮子——LoggerSqlite [Maui] 造轮子——Exception处理 [Maui] 造轮子——前言、本地化 [C#] 日积月累 [.net10] 极简数据库对象关系映射 [C#] 扩展Enumerable,实现类似Sqlserver的窗口函数lag [Blazor] 学习随笔——呈现约定 [Blazor] 学习随笔——生命周期 [Blazor] 学习随笔——RZ10012警告的处理 [Blazor WebAssembly] 学习随笔——组件1.微信弹框(WXDialog) [Blazor WebAssembly] 学习随笔——身份验证 Asp.net Help ASP.NET Web 应用 Docker踩坑历程——续 [Net6]自己写个消息推送 Docker批处理笔记 Asp.net6.0 Swagger使用备忘 ASP.NET Web 应用 Docker踩坑历程
[Maui] 造轮子——MessageBox
毛毛虫 · 2026-03-09 · via 博客园 - 毛毛虫

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. 右上角画个×