FeederDebugPageFactory.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using System;
  2. using System.Reflection;
  3. using System.Windows;
  4. using TeamAAS.Feeder.Attributes;
  5. using TeamAAS.Feeder.Interfaces;
  6. namespace TeamAAS.Feeder.UI
  7. {
  8. /// <summary>
  9. /// 供料器调试页工厂:按供料器类型上的 [Feeder] 特性选择品牌专属调试页;
  10. /// 未声明 DebugPageType 时回退到库内通用页 <see cref="DefaultFeederDebugPage"/>(永不返回 null)。
  11. /// 创建成功后自动把供料器实例绑定给实现了 <see cref="IFeederDebugPage"/> 的页面。
  12. /// 与 Camera/Communication 等硬件库一致:宿主 SettingView 只用单个 ContentControl 承载,
  13. /// 未选设备时绑定为 null 自然空白,选中设备即切到对应类型的页面。
  14. /// </summary>
  15. public static class FeederDebugPageFactory
  16. {
  17. public static FrameworkElement Create(IFeeder feeder)
  18. {
  19. Type pageType = typeof(DefaultFeederDebugPage);
  20. if (feeder != null)
  21. {
  22. var attr = feeder.GetType().GetCustomAttribute<FeederAttribute>(inherit: false);
  23. if (attr != null && attr.DebugPageType != null && typeof(FrameworkElement).IsAssignableFrom(attr.DebugPageType))
  24. pageType = attr.DebugPageType;
  25. }
  26. FrameworkElement page = null;
  27. try
  28. {
  29. page = Activator.CreateInstance(pageType) as FrameworkElement;
  30. }
  31. catch (Exception ex)
  32. {
  33. System.Diagnostics.Debug.WriteLine($"创建供料器调试页 {pageType.Name} 失败: {ex.Message}");
  34. }
  35. if (page == null) page = new DefaultFeederDebugPage();
  36. if (feeder != null && page is IFeederDebugPage)
  37. ((IFeederDebugPage)page).BindFeeder(feeder);
  38. return page;
  39. }
  40. }
  41. }