Files
Ayay/SHH.CameraDashboard/Controls/CameraListControl.xaml.cs

148 lines
4.9 KiB
C#
Raw Normal View History

2025-12-30 10:53:02 +08:00
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<CameraInfo> _allCameras = new List<CameraInfo>();
// 绑定到界面的数据(过滤后)
public ObservableCollection<CameraInfo> DisplayCameras { get; set; } = new ObservableCollection<CameraInfo>();
public CameraListControl()
{
InitializeComponent();
CameraList.ItemsSource = DisplayCameras;
// 初始加载服务器列表
ReloadServers();
}
/// <summary>
/// 公开方法:供主窗体在向导结束后调用,刷新下拉框
/// </summary>
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<List<CameraInfo>>(url);
_allCameras = list ?? new List<CameraInfo>();
// 应用当前的搜索词
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<CameraInfo> OnDeviceSelected;
// 2. 实现 ListView 的选中事件处理
private void CameraList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (CameraList.SelectedItem is CameraInfo selectedCam)
{
// 触发事件,把选中的相机传出去
OnDeviceSelected?.Invoke(selectedCam);
}
}
}
}