增加摄像头中控台项目
This commit is contained in:
148
SHH.CameraDashboard/Controls/CameraListControl.xaml.cs
Normal file
148
SHH.CameraDashboard/Controls/CameraListControl.xaml.cs
Normal file
@@ -0,0 +1,148 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user