|
|
|
|
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<InfoItem> InfoItems { get; set; } = new();
|
|
|
|
|
private DateTime _lastRefreshTime = DateTime.MinValue;
|
|
|
|
|
|
|
|
|
|
public InfoPage()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
|
|
|
|
|
CardCollectionView.ItemsSource = InfoItems;
|
|
|
|
|
// 注册订阅一个不携带数据的消息(使用 object 作为泛型)
|
|
|
|
|
WeakReferenceMessenger.Default.Register<object>(this, (r, m) =>
|
|
|
|
|
{
|
|
|
|
|
// 收到信号,直接触发函数
|
|
|
|
|
HandleUITrigger();
|
|
|
|
|
});
|
|
|
|
|
//注册当前页面的下滑刷新
|
|
|
|
|
myRefreshView_.Refreshing += (sender, e) => {
|
|
|
|
|
// 防抖判断:如果距离上次刷新不足5秒,直接取消本次操作
|
|
|
|
|
if ((DateTime.Now - _lastRefreshTime).TotalSeconds < 1)
|
|
|
|
|
{
|
|
|
|
|
myRefreshView_.IsRefreshing = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// 更新刷新时间
|
|
|
|
|
_lastRefreshTime = DateTime.Now;
|
|
|
|
|
|
|
|
|
|
TcpServer.TcpTransmit("{\"Command\":\"Info\"}");
|
|
|
|
|
}
|
|
|
|
|
catch (Exception)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
private void HandleUITrigger()
|
|
|
|
|
{
|
|
|
|
|
InfoItems.Clear();
|
|
|
|
|
foreach (Dictionary<string, object> List in DataModel.Info_data)
|
|
|
|
|
{
|
|
|
|
|
var mapping = new Dictionary<string, Action<InfoItem, string>>
|
|
|
|
|
{
|
|
|
|
|
{ "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));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|