using System; using System.Collections.Generic; namespace TyphoonUI { /// /// 组件绑定 /// public class BindingItem { public string Package; public string Script; public string SourceName; public int Priority; public BindingItem(string package, string script, string sourceName, int priority) { Package = package; Script = script; SourceName = sourceName; Priority = priority; } } /// /// 资源绑定,基类 /// public abstract class AbstractBinding : IBinding { //优先级计数器 private static int _priorityCounter = 0; private Dictionary _bindings = null; private Dictionary _panelLayers = new Dictionary(); /// /// 初始化 /// public void Initialize() { //绑定UI资源 Binding(); _bindings = new Dictionary(); foreach (var binding in RegisterBindings) { _bindings.Add(binding.Script, binding); } } [NonSerialized] public List RegisterBindings = new List(); public abstract void Binding(); /// /// 获取面板绑定信息 /// public (BindingItem, CanvasLayer) GetPanelBinding() where T : UIPanel { if (_bindings == null) { throw new Exception("UIBinding未完成初始化"); } var script = typeof(T).FullName; if (_bindings.TryGetValue(script, out var bindingItem) && _panelLayers.TryGetValue(script, out var layer)) { return (bindingItem, layer); } throw new Exception($"未绑定面板类:{script}"); } /// /// 获取组件绑定信息 /// public BindingItem GetComponentBinding() where T : UIComponent { if (_bindings == null) { throw new Exception("UIBinding未完成初始化"); } var script = typeof(T).FullName; if (_bindings.TryGetValue(script, out var match)) { return match; } throw new Exception($"未绑定组件类:{script}"); } /// /// 获取层级画布面板绑定关系 /// public List GetLayerPanelBindingItems(CanvasLayer layer) { if (_bindings == null) { throw new Exception("UIBinding未完成初始化"); } var result = new List(); foreach (var kv in _panelLayers) { var script = kv.Key; var temLayer = kv.Value; if (temLayer == layer) { if (_bindings.TryGetValue(script, out var match)) { result.Add(match); } } } return result; } /// /// 获取面板bindingitem /// /// 面板类名(FullName) public BindingItem GetPanelBinding(string panelScript) { if (_bindings.TryGetValue(panelScript, out var match)) { return match; } return null; } /// /// 绑定面板组件 /// /// 包名 /// 资源名(不需要后缀) /// 画布层级 /// 面板脚本类 public void Bind(string package, string sourceName, CanvasLayer layer) where T : UIPanel { _priorityCounter += 1; var script = typeof(T).FullName; RegisterBindings.Add(new BindingItem(package, script, sourceName, _priorityCounter)); //关联画布层级 _panelLayers.Add(script, layer); } /// /// 绑定面板组件 /// /// 归属的包名 /// 资源名(不需要后缀) /// 组件脚本类 public void Bind(string package, string sourceName) where T : UIComponent { _priorityCounter += 1; var script = typeof(T).FullName; RegisterBindings.Add(new BindingItem(package, script, sourceName, _priorityCounter)); } } }