| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- namespace TeamAAS.Vision
- {
- /// <summary>视觉画面框描述:唯一 ID + 用户可见名称</summary>
- public class VisualFrame
- {
- /// <summary>唯一标识(如 "home:1"、"inspect:main"),跨页面/插件引用用</summary>
- public string Id { get; }
- /// <summary>用户可见名称(如 "主画面"、"上视相机")</summary>
- public string DisplayName { get; }
- /// <summary>附加信息(页面自用)</summary>
- public object Tag { get; }
- public VisualFrame(string id, string displayName, object tag = null)
- {
- Id = id ?? throw new ArgumentNullException(nameof(id));
- DisplayName = displayName ?? id;
- Tag = tag;
- }
- }
- /// <summary>
- /// 视觉窗体(画面框)管理类:全程序唯一的画面框注册表。
- /// 页面按配置创建画面框后在此注册(唯一 ID + 用户可见名称);
- /// 其他页面/插件通过 ID 拿到画面框(选择结果显示到哪个框、读取框名称等)。
- /// 线程安全。
- /// </summary>
- public static class VisualFrameManager
- {
- private static readonly object _sync = new object();
- private static readonly Dictionary<string, VisualFrame> _frames =
- new Dictionary<string, VisualFrame>(StringComparer.OrdinalIgnoreCase);
- /// <summary>画面框注册变化(注册/注销/改名)通知</summary>
- public static event Action FramesChanged;
- /// <summary>注册(或更新名称)一个画面框</summary>
- public static VisualFrame Register(string id, string displayName, object tag = null)
- {
- if (string.IsNullOrWhiteSpace(id)) throw new ArgumentException("画面框 ID 不能为空", nameof(id));
- VisualFrame frame;
- lock (_sync)
- {
- if (_frames.TryGetValue(id, out var exist))
- {
- frame = new VisualFrame(id, displayName ?? exist.DisplayName, tag ?? exist.Tag);
- _frames[id] = frame;
- }
- else
- {
- frame = new VisualFrame(id, displayName, tag);
- _frames.Add(id, frame);
- }
- }
- FramesChanged?.Invoke();
- return frame;
- }
- /// <summary>注销画面框</summary>
- public static bool Unregister(string id)
- {
- bool removed;
- lock (_sync) { removed = _frames.Remove(id); }
- if (removed) FramesChanged?.Invoke();
- return removed;
- }
- /// <summary>按 ID 取画面框;不存在返回 null</summary>
- public static VisualFrame GetFrame(string id)
- {
- lock (_sync) { return _frames.TryGetValue(id, out var f) ? f : null; }
- }
- /// <summary>按 ID 取画面框显示名称;不存在时返回 ID 本身</summary>
- public static string GetDisplayName(string id)
- => GetFrame(id)?.DisplayName ?? id;
- /// <summary>全部已注册画面框(快照)</summary>
- public static IReadOnlyList<VisualFrame> GetAll()
- {
- lock (_sync) { return _frames.Values.ToList(); }
- }
- /// <summary>清空全部注册(页面卸载/引擎切换时)</summary>
- public static void Clear()
- {
- lock (_sync)
- {
- if (_frames.Count == 0) return;
- _frames.Clear();
- FramesChanged?.Invoke();
- }
- }
- }
- }
|