using System.Collections.ObjectModel; using System.Windows; using System.Windows.Controls; namespace SHH.CameraDashboard { // 简单的包装类,用于 ComboBox 显示 public class ServerOption { public string Name { get; set; } public string Ip { get; set; } public int Port { get; set; } // 修改显示属性:如果有名字就显示 名字(IP),没有就显示 IP public string DisplayText => string.IsNullOrEmpty(Name) ? $"{Ip}:{Port}" : $"{Name} ({Ip})"; } public partial class CameraListControl : UserControl { // 所有摄像头数据(原始全集) private List _allCameras = new List(); // 绑定到界面的数据(过滤后) public ObservableCollection DisplayCameras { get; set; } = new ObservableCollection(); public CameraListControl() { InitializeComponent(); CameraList.ItemsSource = DisplayCameras; // 初始加载服务器列表 ReloadServers(); } /// /// 公开方法:供主窗体在向导结束后调用,刷新下拉框 /// public void ReloadServers() { var savedSelection = ServerCombo.SelectedItem as ServerOption; // 1. 转换全局配置到 ComboBox 选项 var options = AppGlobalData.ActiveServerList .Select(n => new ServerOption { Ip = n.Ip, Port = n.Port }) .ToList(); ServerCombo.ItemsSource = options; // 2. 尝试恢复之前的选中项,或者默认选中第一个 if (options.Count > 0) { if (savedSelection != null) { var match = options.FirstOrDefault(o => o.Ip == savedSelection.Ip && o.Port == savedSelection.Port); ServerCombo.SelectedItem = match ?? options[0]; } else { ServerCombo.SelectedItem = options[0]; } } else { // 如果没有配置,清空列表 _allCameras.Clear(); DisplayCameras.Clear(); UpdateEmptyState(); } } private async void ServerCombo_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (ServerCombo.SelectedItem is ServerOption server) { // 切换服务器,加载数据 LoadingMask.Visibility = Visibility.Visible; EmptyText.Visibility = Visibility.Collapsed; string url = $"http://{server.Ip}:{server.Port}/api/Cameras"; try { // 使用 HttpService 获取列表 var list = await HttpService.GetAsync>(url); _allCameras = list ?? new List(); // 应用当前的搜索词 FilterList(SearchBox.Text); } catch { // 失败清空 _allCameras.Clear(); DisplayCameras.Clear(); } finally { LoadingMask.Visibility = Visibility.Collapsed; UpdateEmptyState(); } } } private void SearchBox_TextChanged(object sender, TextChangedEventArgs e) { FilterList(SearchBox.Text); } private void FilterList(string keyword) { DisplayCameras.Clear(); if (string.IsNullOrWhiteSpace(keyword)) { foreach (var c in _allCameras) DisplayCameras.Add(c); } else { var lowerKw = keyword.ToLower(); var results = _allCameras.Where(c => (c.Name != null && c.Name.ToLower().Contains(lowerKw)) || (c.IpAddress != null && c.IpAddress.Contains(lowerKw)) ); foreach (var c in results) DisplayCameras.Add(c); } } private void UpdateEmptyState() { EmptyText.Visibility = DisplayCameras.Count == 0 ? Visibility.Visible : Visibility.Collapsed; } // 1. 定义一个事件:当设备被选中时触发 public event System.Action OnDeviceSelected; // 2. 实现 ListView 的选中事件处理 private void CameraList_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (CameraList.SelectedItem is CameraInfo selectedCam) { // 触发事件,把选中的相机传出去 OnDeviceSelected?.Invoke(selectedCam); } } } }