Files
MRCC/launcher/PCL-CE/PCL.Core/UI/ToastNotification.cs
T
xyou f70b061d1a
CI / Go Backend (push) Canceled after 0s
feat: 项目初始化 + 3D方块世界原型 + AI助搭系统
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器

HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块

Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚

AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
2026-08-08 14:07:56 +08:00

150 lines
5.2 KiB
C#

using System;
using System.Runtime.InteropServices;
using System.Security;
using PCL.Core.Utils.OS;
using PCL.Core.Utils.WinRT;
using PCL.Core.Utils.WinRT.Interface;
using PCL.Core.Utils.WinRT.Interface.Windows.Data.Xml.Dom;
using PCL.Core.Utils.WinRT.Interface.Windows.UI.Notifications;
namespace PCL.Core.UI;
public static class ToastNotification
{
/// <summary>
/// 发送简单的 Toast 通知。
/// </summary>
/// <param name="message">通知内容</param>
/// <param name="title">通知标题</param>
public static void SendToast(string message, string title = "Notice")
{
var xml = $"""
<toast>
<visual>
<binding template="ToastGeneric">
<text>{SecurityElement.Escape(title)}</text>
<text>{SecurityElement.Escape(message)}</text>
</binding>
</visual>
</toast>
""";
SendToastFromTemplate(xml);
}
/// <summary>
/// 根据模板发送 Toast 通知。
/// </summary>
/// <param name="xml">Toast 模板</param>
public static unsafe void SendToastFromTemplate(string xml)
{
// 定义 Toast 模板
var toastXml = HStringHelper.ToHString(xml);
// TODO: 将 AUMID 判断放在其他位置
if (!AumidHelper.HasAumid())
{
AumidHelper.RegisterAumid();
}
var aumid = HStringHelper.ToHString(AumidHelper.Aumid);
// TODO: 支持触发事件
IInspectable* inspectable = null;
IXmlDocumentIO* xmlDocumentIO = null;
IToastNotificationFactory* toastNotificationFactory = null;
IToastNotificationManagerStatics* toastNotificationManagerStatics = null;
IInspectable* toastNotification = null;
IToastNotifier* toastNotifier = null;
try
{
fixed (Guid* xmlDocumentIOIid = &IXmlDocumentIOInfo.Iid)
{
// 创建 XmlDocument 对象
inspectable =
(IInspectable*)WinRTInterop.ActivateInstance(
IXmlDocumentIOInfo.ActivatableClassId);
Marshal.ThrowExceptionForHR(
inspectable->lpVtbl->QueryInterface(
inspectable,
xmlDocumentIOIid,
(void**)&xmlDocumentIO));
// 加载 XML
Marshal.ThrowExceptionForHR(
xmlDocumentIO->lpVtbl->LoadXml(
xmlDocumentIO,
toastXml));
// 获取 ToastNotificationFactory
toastNotificationFactory =
(IToastNotificationFactory*)WinRTInterop.GetActivationFactory(
IToastNotificationFactoryInfo.ActivatableClassId,
IToastNotificationFactoryInfo.Iid);
// 创建 ToastNotification
Marshal.ThrowExceptionForHR(
toastNotificationFactory->lpVtbl->CreateToastNotification(
toastNotificationFactory,
xmlDocumentIO,
(void**)&toastNotification));
// 获取 ToastNotificationManager
toastNotificationManagerStatics =
(IToastNotificationManagerStatics*)WinRTInterop.GetActivationFactory(
IToastNotificationManagerStaticsInfo.ActivatableClassId,
IToastNotificationManagerStaticsInfo.Iid);
// 创建 ToastNotifier
Marshal.ThrowExceptionForHR(
toastNotificationManagerStatics->lpVtbl->CreateToastNotifierWithId(
toastNotificationManagerStatics,
aumid,
(void**)&toastNotifier));
// 发送
Marshal.ThrowExceptionForHR(
toastNotifier->lpVtbl->Show(
toastNotifier,
toastNotification));
}
}
finally
{
if (toastNotifier is not null)
toastNotifier->lpVtbl->Release(toastNotifier);
if (toastNotification is not null)
toastNotification->lpVtbl->Release(toastNotification);
if (toastNotificationManagerStatics is not null)
toastNotificationManagerStatics->lpVtbl->Release(
toastNotificationManagerStatics);
if (toastNotificationFactory is not null)
toastNotificationFactory->lpVtbl->Release(
toastNotificationFactory);
if (xmlDocumentIO is not null)
xmlDocumentIO->lpVtbl->Release(xmlDocumentIO);
if (inspectable is not null)
inspectable->lpVtbl->Release(inspectable);
HStringHelper.DeleteHString(toastXml);
HStringHelper.DeleteHString(aumid);
}
}
/// <summary>
/// Remove Toast notifications and related cache from the system.
/// </summary>
public static void UninstallToasts()
{
// TODO: 更改这里的逻辑
AumidHelper.UnregisterAumid();
}
}