using System; using System.Windows; using System.Windows.Controls; using Prism.Events; using Prism.Ioc; using XP.Hardware.Detector.Abstractions; using XP.Hardware.Detector.Abstractions.Events; namespace XP.Hardware.Detector.Views { /// /// 面阵探测器配置视图 | Area detector configuration view /// 订阅探测器图像采集事件,将图像数据传递给直方图控件 /// public partial class DetectorConfigView : UserControl { private IEventAggregator _eventAggregator; private SubscriptionToken _imageSubscriptionToken; public DetectorConfigView() { InitializeComponent(); Loaded += OnLoaded; Unloaded += OnUnloaded; } /// /// 加载时订阅图像采集事件 | Subscribe to image captured event on load /// private void OnLoaded(object sender, RoutedEventArgs e) { try { _eventAggregator = ContainerLocator.Current?.Resolve(); if (_eventAggregator != null) { _imageSubscriptionToken = _eventAggregator.GetEvent() .Subscribe(OnImageCaptured, ThreadOption.BackgroundThread); } } catch { // 事件聚合器不可用时静默降级 | Silent degradation when event aggregator unavailable } } /// /// 卸载时取消订阅 | Unsubscribe on unload /// private void OnUnloaded(object sender, RoutedEventArgs e) { if (_eventAggregator != null && _imageSubscriptionToken != null) { _eventAggregator.GetEvent().Unsubscribe(_imageSubscriptionToken); _imageSubscriptionToken = null; } } /// /// 图像采集回调:将 ushort[] 转为 byte[] 后传给直方图控件 | Image captured callback /// private void OnImageCaptured(ImageCapturedEventArgs args) { if (args?.ImageData == null || args.Width == 0 || args.Height == 0) return; try { // 将 ushort[] 转换为 little-endian byte[] | Convert ushort[] to little-endian byte[] var rawBytes = new byte[args.ImageData.Length * 2]; Buffer.BlockCopy(args.ImageData, 0, rawBytes, 0, rawBytes.Length); // 调用直方图控件更新(控件内部支持从非 UI 线程调用)| Update histogram control (supports non-UI thread calls) HistogramControl?.UpdateImage(rawBytes, (int)args.Width, (int)args.Height, 16); } catch { // 异常不影响主流程 | Exception does not affect main flow } } } }