148 lines
4.9 KiB
C#
148 lines
4.9 KiB
C#
|
|
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);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|