VisualFrameManager.cs 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace TeamAAS.Vision
  5. {
  6. /// <summary>视觉画面框描述:唯一 ID + 用户可见名称</summary>
  7. public class VisualFrame
  8. {
  9. /// <summary>唯一标识(如 "home:1"、"inspect:main"),跨页面/插件引用用</summary>
  10. public string Id { get; }
  11. /// <summary>用户可见名称(如 "主画面"、"上视相机")</summary>
  12. public string DisplayName { get; }
  13. /// <summary>附加信息(页面自用)</summary>
  14. public object Tag { get; }
  15. public VisualFrame(string id, string displayName, object tag = null)
  16. {
  17. Id = id ?? throw new ArgumentNullException(nameof(id));
  18. DisplayName = displayName ?? id;
  19. Tag = tag;
  20. }
  21. }
  22. /// <summary>
  23. /// 视觉窗体(画面框)管理类:全程序唯一的画面框注册表。
  24. /// 页面按配置创建画面框后在此注册(唯一 ID + 用户可见名称);
  25. /// 其他页面/插件通过 ID 拿到画面框(选择结果显示到哪个框、读取框名称等)。
  26. /// 线程安全。
  27. /// </summary>
  28. public static class VisualFrameManager
  29. {
  30. private static readonly object _sync = new object();
  31. private static readonly Dictionary<string, VisualFrame> _frames =
  32. new Dictionary<string, VisualFrame>(StringComparer.OrdinalIgnoreCase);
  33. /// <summary>画面框注册变化(注册/注销/改名)通知</summary>
  34. public static event Action FramesChanged;
  35. /// <summary>注册(或更新名称)一个画面框</summary>
  36. public static VisualFrame Register(string id, string displayName, object tag = null)
  37. {
  38. if (string.IsNullOrWhiteSpace(id)) throw new ArgumentException("画面框 ID 不能为空", nameof(id));
  39. VisualFrame frame;
  40. lock (_sync)
  41. {
  42. if (_frames.TryGetValue(id, out var exist))
  43. {
  44. frame = new VisualFrame(id, displayName ?? exist.DisplayName, tag ?? exist.Tag);
  45. _frames[id] = frame;
  46. }
  47. else
  48. {
  49. frame = new VisualFrame(id, displayName, tag);
  50. _frames.Add(id, frame);
  51. }
  52. }
  53. FramesChanged?.Invoke();
  54. return frame;
  55. }
  56. /// <summary>注销画面框</summary>
  57. public static bool Unregister(string id)
  58. {
  59. bool removed;
  60. lock (_sync) { removed = _frames.Remove(id); }
  61. if (removed) FramesChanged?.Invoke();
  62. return removed;
  63. }
  64. /// <summary>按 ID 取画面框;不存在返回 null</summary>
  65. public static VisualFrame GetFrame(string id)
  66. {
  67. lock (_sync) { return _frames.TryGetValue(id, out var f) ? f : null; }
  68. }
  69. /// <summary>按 ID 取画面框显示名称;不存在时返回 ID 本身</summary>
  70. public static string GetDisplayName(string id)
  71. => GetFrame(id)?.DisplayName ?? id;
  72. /// <summary>全部已注册画面框(快照)</summary>
  73. public static IReadOnlyList<VisualFrame> GetAll()
  74. {
  75. lock (_sync) { return _frames.Values.ToList(); }
  76. }
  77. /// <summary>清空全部注册(页面卸载/引擎切换时)</summary>
  78. public static void Clear()
  79. {
  80. lock (_sync)
  81. {
  82. if (_frames.Count == 0) return;
  83. _frames.Clear();
  84. FramesChanged?.Invoke();
  85. }
  86. }
  87. }
  88. }