using CommunityToolkit.Mvvm.Messaging; using Microsoft.Maui.Controls; using Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific; using SunlightAggregationTerminal.Class; using SunlightAggregationTerminal.Models; using System.Collections.ObjectModel; namespace SunlightAggregationTerminal; public partial class InfoPage : ContentPage { public static ObservableCollection InfoItems { get; set; } = new(); private DateTime _lastRefreshTime = DateTime.MinValue; public static string? _Name, _State, _MachineName, _Machine, _Information, _Model, _Type, _ModelA, _ModelB, _ModelC, _ModelD, _ModelE, _ModelF; public InfoPage() { InitializeComponent(); CardCollectionView.ItemsSource = InfoItems; // 注册订阅一个不携带数据的消息(使用 object 作为泛型) WeakReferenceMessenger.Default.Register(this, (r, m) => { // 收到信号,直接触发函数 HandleUITrigger(); }); //注册当前页面的下滑刷新 myRefreshView_.Refreshing += (sender, e) => { // 5秒防抖判断:如果距离上次刷新不足5秒,直接取消本次操作 if ((DateTime.Now - _lastRefreshTime).TotalSeconds < 5) { myRefreshView_.IsRefreshing = false; return; } try { // 更新刷新时间 _lastRefreshTime = DateTime.Now; TcpServer.TcpTransmit("{\"Command\":\"Info\"}"); } catch (Exception) { } }; } private void HandleUITrigger() { InfoItems.Clear(); foreach (Dictionary List in DataModel.Info_data) { var mapping = new Dictionary> { { "Name", (obj, val) => obj.Name = val }, { "State", (obj, val) => obj.State = val }, { "MachineName", (obj, val) => obj.MachineName = val }, { "Machine", (obj, val) => obj.Machine = val }, { "Information", (obj, val) => obj.Information = val }, { "Type", (obj, val) => obj.Type = val }, { "Model", (obj, val) => obj.Model = val }, { "ModelA", (obj, val) => obj.ModelA = val }, { "ModelB", (obj, val) => obj.ModelB = val }, { "ModelC", (obj, val) => obj.ModelC = val }, { "ModelD", (obj, val) => obj.ModelD = val }, { "ModelE", (obj, val) => obj.ModelE = val }, { "ModelF", (obj, val) => obj.ModelF = val } }; var info = new InfoItem(); foreach (var (key, action) in mapping) { if (List.TryGetValue(key, out var val) && val != null) { action(info, val.ToString()!); } } InfoItems.Add(info); } CardCollectionView.ItemsSource = InfoItems; myRefreshView_.IsRefreshing = false; } ~InfoPage()//关闭时注销消息 { WeakReferenceMessenger.Default.UnregisterAll(this); } private async void TapGestureRecognizer_Tapped(object sender, TappedEventArgs e) { // 将 sender 强制转换为 BindingContext 定义在 BindableObject if (sender is Microsoft.Maui.Controls.BindableObject bindable) { var context = bindable.BindingContext; if (context is InfoItem item) { await Navigation.PushAsync(new InfoDetail(item)); } } } }