初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器 HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块 Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚 AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
This commit is contained in:
@@ -0,0 +1,150 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user