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

推荐订阅源

博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
美团技术团队
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
有赞技术团队
有赞技术团队
GbyAI
GbyAI
宝玉的分享
宝玉的分享
腾讯CDC
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
Google DeepMind News
Google DeepMind News
月光博客
月光博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog

博客园 - 毛毛虫

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