fajiao
3 years ago
272 changed files with 54373 additions and 0 deletions
@ -0,0 +1,40 @@ |
|||
#nullable disable |
|||
|
|||
using EC.Entity.PublicModel; |
|||
using System.ComponentModel.DataAnnotations.Schema; |
|||
|
|||
namespace EC.Entity.CameraInfo |
|||
{ |
|||
public partial class IpcInfo : BaseEntity |
|||
{ |
|||
[NotMapped] |
|||
public int Number { get; set; } |
|||
|
|||
public long IpcId { get; set; } |
|||
public string IpcName { get; set; } |
|||
public string NvrName { get; set; } |
|||
public string IpcType { get; set; } |
|||
public string IpcIp { get; set; } |
|||
public string OnvifAddr { get; set; } |
|||
public string MediaAddr { get; set; } |
|||
public string PtzAddr { get; set; } |
|||
public string RtspMain { get; set; } |
|||
public string RtspSub { get; set; } |
|||
public string IpcPosition { get; set; } |
|||
public string IpcImage { get; set; } |
|||
public long? IpcX { get; set; } |
|||
public long? IpcY { get; set; } |
|||
public string UserName { get; set; } |
|||
public string UserPwd { get; set; } |
|||
public string IpcEnable { get; set; } |
|||
|
|||
[NotMapped] |
|||
public bool IpcEnableBool |
|||
{ |
|||
get => IpcEnable != null && IpcEnable.Equals("启用"); |
|||
set => IpcEnable = value ? "启用" : "禁用"; |
|||
} |
|||
|
|||
public string IpcAddr { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,15 @@ |
|||
#nullable disable |
|||
|
|||
namespace EC.Entity.CameraInfo |
|||
{ |
|||
public partial class LogInfo |
|||
{ |
|||
public long LogId { get; set; } |
|||
public string TriggerTime { get; set; } |
|||
public string UserName { get; set; } |
|||
public string LogCh { get; set; } |
|||
public string LogType { get; set; } |
|||
public string LogContent { get; set; } |
|||
public string LogMark { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,29 @@ |
|||
#nullable disable |
|||
|
|||
using System.ComponentModel.DataAnnotations.Schema; |
|||
|
|||
namespace EC.Entity.CameraInfo |
|||
{ |
|||
public partial class NvrInfo |
|||
{ |
|||
[NotMapped] |
|||
public int Number { get; set; } |
|||
|
|||
public long NvrId { get; set; } |
|||
public string NvrName { get; set; } |
|||
public string NvrType { get; set; } |
|||
public string NvrIp { get; set; } |
|||
public string UserName { get; set; } |
|||
public string UserPwd { get; set; } |
|||
public string NvrEnable { get; set; } |
|||
|
|||
[NotMapped] |
|||
public bool NvrEnableBool |
|||
{ |
|||
get => NvrEnable != null && NvrEnable.Equals("启用"); |
|||
set => NvrEnable = value ? "启用" : "禁用"; |
|||
} |
|||
|
|||
public string NvrAddr { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,12 @@ |
|||
#nullable disable |
|||
|
|||
namespace EC.Entity.CameraInfo |
|||
{ |
|||
public partial class PollInfo |
|||
{ |
|||
public long PollId { get; set; } |
|||
public string PollGroup { get; set; } |
|||
public string RtspMain { get; set; } |
|||
public string RtspSub { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,12 @@ |
|||
#nullable disable |
|||
|
|||
namespace EC.Entity.CameraInfo |
|||
{ |
|||
public partial class UserInfo |
|||
{ |
|||
public string UserName { get; set; } |
|||
public string UserPwd { get; set; } |
|||
public string UserType { get; set; } |
|||
public string UserAdmin { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,23 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net5.0-windows7.0</TargetFramework> |
|||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<Compile Remove="Military\**" /> |
|||
<EmbeddedResource Remove="Military\**" /> |
|||
<None Remove="Military\**" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.9" /> |
|||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.9" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\公共库\EC.Utils\EC.Utils.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
@ -0,0 +1,80 @@ |
|||
using Newtonsoft.Json; |
|||
using System; |
|||
using System.ComponentModel; |
|||
using System.ComponentModel.DataAnnotations.Schema; |
|||
using System.Reflection; |
|||
|
|||
namespace EC.Entity.PublicModel |
|||
{ |
|||
public class BaseEntity : INotifyPropertyChanged |
|||
{ |
|||
public event PropertyChangedEventHandler PropertyChanged; |
|||
|
|||
public void OnPropertyChanged(string propertyName) |
|||
{ |
|||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); |
|||
} |
|||
|
|||
public bool SetValue(string propertyName, string value) |
|||
{ |
|||
if (!ContainProperty(propertyName)) { return false; } |
|||
try |
|||
{ |
|||
Type type = GetType(); |
|||
object objVal = Convert.ChangeType(value, type.GetProperty(propertyName).PropertyType); |
|||
type.GetProperty(propertyName).SetValue(this, objVal, null); |
|||
OnPropertyChanged(propertyName); |
|||
return true; |
|||
} |
|||
catch |
|||
{ |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
public object GetValue(string propertyName) |
|||
{ |
|||
if (!ContainProperty(propertyName)) { return null; } |
|||
try |
|||
{ |
|||
Type type = GetType(); |
|||
object objVal = type.GetProperty(propertyName).GetValue(this, null); |
|||
return objVal; |
|||
} |
|||
catch |
|||
{ |
|||
return null; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 利用反射来判断对象是否包含某个属性
|
|||
/// </summary>
|
|||
/// <param name="instance">object</param>
|
|||
/// <param name="propertyName">需要判断的属性</param>
|
|||
/// <returns>是否包含</returns>
|
|||
public bool ContainProperty(string propertyName) |
|||
{ |
|||
if (this != null && !string.IsNullOrEmpty(propertyName)) |
|||
{ |
|||
PropertyInfo _findedPropertyInfo = GetType().GetProperty(propertyName); |
|||
return _findedPropertyInfo != null; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
[NotMapped] |
|||
public string FaultUri { get; set; } = "-1"; |
|||
|
|||
public virtual bool IsUriGain(string uri) |
|||
{ |
|||
return !(string.IsNullOrEmpty(uri) || uri.Equals(FaultUri, StringComparison.Ordinal)); |
|||
} |
|||
|
|||
public virtual T DeepCopy<T>() |
|||
{ |
|||
string json = JsonConvert.SerializeObject(this); |
|||
return JsonConvert.DeserializeObject<T>(json); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,22 @@ |
|||
namespace EC.Entity.PublicModel |
|||
{ |
|||
public enum VidoeType |
|||
{ |
|||
Default, |
|||
|
|||
/// <summary>
|
|||
/// 海康
|
|||
/// </summary>
|
|||
HK, |
|||
|
|||
/// <summary>
|
|||
/// 大华
|
|||
/// </summary>
|
|||
DH, |
|||
|
|||
/// <summary>
|
|||
/// 宇视觉
|
|||
/// </summary>
|
|||
YS |
|||
} |
|||
} |
@ -0,0 +1,232 @@ |
|||
using System; |
|||
|
|||
namespace EC.Entity.Video |
|||
{ |
|||
public class MonitorCamera |
|||
{ |
|||
public MonitorCamera() |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 主键
|
|||
/// </summary>
|
|||
public string Id { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 站点id
|
|||
/// </summary>
|
|||
public string SiteId { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 相机名称
|
|||
/// </summary>
|
|||
public string CameraName { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 相机类型
|
|||
/// </summary>
|
|||
public int Type { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 相机ip
|
|||
/// </summary>
|
|||
public string Ip { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 相机端口
|
|||
/// </summary>
|
|||
public int Port { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 认证用户名
|
|||
/// </summary>
|
|||
public string User { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 认证密码
|
|||
/// </summary>
|
|||
public string Password { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 纬度
|
|||
/// </summary>
|
|||
public decimal Latitude { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 经度
|
|||
/// </summary>
|
|||
public decimal Longitude { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 高度
|
|||
/// </summary>
|
|||
public decimal Height { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// Rtsp地址
|
|||
/// </summary>
|
|||
public string PreRtsp { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 分析 Rtsp 地址
|
|||
/// </summary>
|
|||
public string AnalysisRtsp { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 录像 Rtsp 地址通道3
|
|||
/// </summary>
|
|||
public string RecordRtsp { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 云台控制ip
|
|||
/// </summary>
|
|||
public string CloudCtrlIp { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 云台控制端口
|
|||
/// </summary>
|
|||
public int CloudCtrlPort { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 流媒体服务器id
|
|||
/// </summary>
|
|||
public string StreamingMediaId { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 录像机id
|
|||
/// </summary>
|
|||
public string VideoRecorderId { get; set; } |
|||
|
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
public int Factory { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 相机预览通道
|
|||
/// </summary>
|
|||
public int Channel { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 样式
|
|||
/// </summary>
|
|||
public int Style { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 左夹角
|
|||
/// </summary>
|
|||
public double LeftAngle { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 右夹角
|
|||
/// </summary>
|
|||
public double RightAngle { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 视野中央有效距离
|
|||
/// </summary>
|
|||
public double ViewDistance { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 采样帧率
|
|||
/// </summary>
|
|||
public int FrameRate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 最大跟踪范围
|
|||
/// </summary>
|
|||
public int MaxRange { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 状态
|
|||
/// </summary>
|
|||
public int Status { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 零方位角(正北夹角)
|
|||
/// </summary>
|
|||
public double ZeroAzimuth { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 安装垂直角(上下-90°~90°)
|
|||
/// </summary>
|
|||
public double FixedAngle { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 最大仰角
|
|||
/// </summary>
|
|||
public double MaxElevation { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 最大可视距离
|
|||
/// </summary>
|
|||
public double MaxVisibleDistance { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 变倍因子
|
|||
/// </summary>
|
|||
public double ZoomFactor { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 创建人
|
|||
/// </summary>
|
|||
public string CreateBy { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 创建日期
|
|||
/// </summary>
|
|||
public DateTime? CreateTime { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 更新人
|
|||
/// </summary>
|
|||
public string UpdateBy { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 更新日期
|
|||
/// </summary>
|
|||
public DateTime? UpdateTime { get; set; } |
|||
|
|||
public MonitorCamera(string cameraIp, int port, string userName, string passWord, int factory = 0, int type = 0) |
|||
{ |
|||
Ip = cameraIp; |
|||
Port = port; |
|||
User = userName; |
|||
Password = passWord; |
|||
Factory = factory; |
|||
Type = type; |
|||
} |
|||
|
|||
public string RtspURL(int width = 640) |
|||
{ |
|||
if (width < 1200) |
|||
{ |
|||
if (!string.IsNullOrEmpty(RecordRtsp)) |
|||
{ |
|||
return RecordRtsp; |
|||
} |
|||
} |
|||
if (!string.IsNullOrEmpty(PreRtsp)) |
|||
{ |
|||
return PreRtsp; |
|||
} |
|||
|
|||
string rtspformat = "rtsp://{0}:{1}@{2}:554"; |
|||
//switch (Factory)
|
|||
//{
|
|||
// case (int)Video.HK:
|
|||
// rtspformat = "rtsp://{0}:{1}@{2}:554/Streaming/Channels/102?transportmode=unicast&profile=Profile_2";
|
|||
// break;
|
|||
// case (int)VidoeType.DH:
|
|||
// rtspformat = "rtsp://{0}:{1}@{2}:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=Onvif";
|
|||
// break;
|
|||
// //case VidoeType.YS:
|
|||
// // return "";
|
|||
|
|||
//}
|
|||
string url = string.Format(rtspformat, User, Password, Ip); |
|||
return url; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,87 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
|
|||
namespace EC.Entity.Video |
|||
{ |
|||
public class MsVideoRecorder |
|||
{ |
|||
public MsVideoRecorder() |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 主键
|
|||
/// </summary>
|
|||
public string Id { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 所属部门
|
|||
/// </summary>
|
|||
public string SysOrgCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 设备名称
|
|||
/// </summary>
|
|||
public string DeviceName { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 设备类型
|
|||
/// </summary>
|
|||
public int DeviceType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 设备编号
|
|||
/// </summary>
|
|||
public string DeviceNum { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 设备地址
|
|||
/// </summary>
|
|||
public string DeviceAddress { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 用户姓名
|
|||
/// </summary>
|
|||
public string UserName { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 用户密码
|
|||
/// </summary>
|
|||
public string UserPassword { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 是否启用
|
|||
/// </summary>
|
|||
public int IsEnable { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 安装位置
|
|||
/// </summary>
|
|||
public string FixedPosition { get; set; } |
|||
|
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
public List<MonitorCamera> MsCameraSettingList { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 创建人
|
|||
/// </summary>
|
|||
public string CreateBy { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 创建日期
|
|||
/// </summary>
|
|||
public DateTime? CreateTime { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 更新人
|
|||
/// </summary>
|
|||
public string UpdateBy { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 更新日期
|
|||
/// </summary>
|
|||
public DateTime? UpdateTime { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,14 @@ |
|||
namespace EC.Entity.Warning |
|||
{ |
|||
public class DrawPoint |
|||
{ |
|||
public DrawPoint(double x, double y) |
|||
{ |
|||
X = x; |
|||
Y = y; |
|||
} |
|||
|
|||
public double X { get; set; } |
|||
public double Y { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,39 @@ |
|||
using System.Collections.Generic; |
|||
|
|||
namespace EC.Entity.Warning |
|||
{ |
|||
public class DrawShape |
|||
{ |
|||
public DrawShape() |
|||
{ |
|||
PointList = new List<DrawPoint>(); |
|||
} |
|||
|
|||
//public DrawShapeModel(string ip, StrokeEx storke)
|
|||
//{
|
|||
// List<StylusPoint> stylusPoints = storke.StylusPoints.ToList();
|
|||
// foreach (StylusPoint stylusPoint in stylusPoints)
|
|||
// {
|
|||
// }
|
|||
//}
|
|||
|
|||
public string Ip { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 画图形状
|
|||
/// </summary>
|
|||
public int DrawType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 预警级别
|
|||
/// </summary>
|
|||
public int WarningLevel { get; set; } |
|||
|
|||
public List<DrawPoint> PointList { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 预警方向 Line 上(0)下(1)左(2)右(3)
|
|||
/// </summary>
|
|||
public int WaringDirection { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,40 @@ |
|||
namespace EC.Entity.Warning |
|||
{ |
|||
public class WarningBoxModel |
|||
{ |
|||
/// <summary>
|
|||
///英文标签
|
|||
/// </summary>
|
|||
public string label { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 原标签位置
|
|||
/// </summary>
|
|||
public int cls { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 相似度
|
|||
/// </summary>
|
|||
public double conf { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 左上角x
|
|||
/// </summary>
|
|||
public double x { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 左上角Y
|
|||
/// </summary>
|
|||
public double y { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 右下角x
|
|||
/// </summary>
|
|||
public double x1 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 右下角y
|
|||
/// </summary>
|
|||
public double y1 { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,14 @@ |
|||
using System.Collections.Generic; |
|||
|
|||
namespace EC.Entity.Warning |
|||
{ |
|||
public class WarningModel |
|||
{ |
|||
public int warninglevel { get; set; } |
|||
public string ip { get; set; } |
|||
public string filename { get; set; } |
|||
public int width { get; set; } |
|||
public int height { get; set; } |
|||
public List<WarningBoxModel> boxs { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,47 @@ |
|||
using EC.Service.Config; |
|||
|
|||
using Microsoft.EntityFrameworkCore; |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace EC.Service.CameraInfo |
|||
{ |
|||
public partial class BaseDbContext<T> : DbContext where T : class |
|||
{ |
|||
public BaseDbContext() |
|||
{ |
|||
} |
|||
|
|||
public BaseDbContext(DbContextOptions<BaseDbContext<T>> options) |
|||
: base(options) |
|||
{ |
|||
} |
|||
|
|||
public virtual DbSet<T> Infos { get; set; } |
|||
|
|||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) |
|||
{ |
|||
if (!optionsBuilder.IsConfigured) |
|||
{ |
|||
optionsBuilder.UseSqlite(ConfigHelper.GetDbConnection()); |
|||
} |
|||
} |
|||
|
|||
protected void OnModelCreatingPartial(ModelBuilder modelBuilder) |
|||
{ |
|||
} |
|||
|
|||
#region Select
|
|||
|
|||
public Task<List<T>> GetListAsync() |
|||
{ |
|||
Task<List<T>> task = Task.Run(() => |
|||
{ |
|||
return new List<T>(Infos); |
|||
}); |
|||
return task; |
|||
} |
|||
|
|||
#endregion Select
|
|||
} |
|||
} |
@ -0,0 +1,62 @@ |
|||
using EC.Entity.CameraInfo; |
|||
using Microsoft.EntityFrameworkCore; |
|||
|
|||
#nullable disable |
|||
|
|||
namespace EC.Service.CameraInfo |
|||
{ |
|||
public class IpcInfoContext : BaseDbContext<IpcInfo> |
|||
{ |
|||
public IpcInfoContext() |
|||
{ |
|||
} |
|||
|
|||
protected override void OnModelCreating(ModelBuilder modelBuilder) |
|||
{ |
|||
modelBuilder.Entity<IpcInfo>(entity => |
|||
{ |
|||
entity.HasKey(e => e.IpcId); |
|||
|
|||
entity.ToTable("IpcInfo"); |
|||
|
|||
entity.Property(e => e.IpcId).HasColumnName("IpcID"); |
|||
|
|||
entity.Property(e => e.IpcAddr).HasColumnType("VARCHAR (100)"); |
|||
|
|||
entity.Property(e => e.IpcEnable).HasColumnType("VARCHAR (2)"); |
|||
|
|||
entity.Property(e => e.IpcImage).HasColumnType("VARCHAR (30)"); |
|||
|
|||
entity.Property(e => e.IpcName) |
|||
.IsRequired() |
|||
.HasColumnType("VARCHAR (30)"); |
|||
|
|||
entity.Property(e => e.IpcPosition).HasColumnType("VARCHAR (50)"); |
|||
|
|||
entity.Property(e => e.IpcType).HasColumnType("VARCHAR (30)"); |
|||
|
|||
entity.Property(e => e.IpcX).HasColumnType("INTEGER (4)"); |
|||
|
|||
entity.Property(e => e.IpcY).HasColumnType("INTEGER (4)"); |
|||
|
|||
entity.Property(e => e.MediaAddr).HasColumnType("VARCHAR (150)"); |
|||
|
|||
entity.Property(e => e.NvrName).HasColumnType("VARCHAR (30)"); |
|||
|
|||
entity.Property(e => e.OnvifAddr).HasColumnType("VARCHAR (150)"); |
|||
|
|||
entity.Property(e => e.PtzAddr).HasColumnType("VARCHAR (150)"); |
|||
|
|||
entity.Property(e => e.RtspMain).HasColumnType("VARCHAR (250)"); |
|||
|
|||
entity.Property(e => e.RtspSub).HasColumnType("VARCHAR (250)"); |
|||
|
|||
entity.Property(e => e.UserName).HasColumnType("VARCHAR (20)"); |
|||
|
|||
entity.Property(e => e.UserPwd).HasColumnType("VARCHAR (20)"); |
|||
}); |
|||
|
|||
OnModelCreatingPartial(modelBuilder); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,50 @@ |
|||
using EC.Entity.CameraInfo; |
|||
using Microsoft.EntityFrameworkCore; |
|||
|
|||
#nullable disable |
|||
|
|||
namespace EC.Service.CameraInfo |
|||
{ |
|||
public class LogInfoContext : BaseDbContext<LogInfo> |
|||
{ |
|||
public LogInfoContext() |
|||
{ |
|||
} |
|||
|
|||
protected override void OnModelCreating(ModelBuilder modelBuilder) |
|||
{ |
|||
modelBuilder.Entity<LogInfo>(entity => |
|||
{ |
|||
entity.HasKey(e => e.LogId); |
|||
|
|||
entity.ToTable("LogInfo"); |
|||
|
|||
entity.Property(e => e.LogId) |
|||
.ValueGeneratedNever() |
|||
.HasColumnName("LogID"); |
|||
|
|||
entity.Property(e => e.LogCh).HasColumnType("VARCHAR (50)"); |
|||
|
|||
entity.Property(e => e.LogContent) |
|||
.IsRequired() |
|||
.HasColumnType("VARCHAR (100)"); |
|||
|
|||
entity.Property(e => e.LogMark).HasColumnType("VARCHAR (200)"); |
|||
|
|||
entity.Property(e => e.LogType) |
|||
.IsRequired() |
|||
.HasColumnType("VARCHAR (10)"); |
|||
|
|||
entity.Property(e => e.TriggerTime) |
|||
.IsRequired() |
|||
.HasColumnType("VARCHAR (19)"); |
|||
|
|||
entity.Property(e => e.UserName) |
|||
.IsRequired() |
|||
.HasColumnType("VARCHAR (20)"); |
|||
}); |
|||
|
|||
OnModelCreatingPartial(modelBuilder); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,75 @@ |
|||
using EC.Entity.CameraInfo; |
|||
using Microsoft.EntityFrameworkCore; |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
|
|||
#nullable disable |
|||
|
|||
namespace EC.Service.CameraInfo |
|||
{ |
|||
public class NvrInfoContext : BaseDbContext<NvrInfo> |
|||
{ |
|||
public NvrInfoContext() |
|||
{ |
|||
} |
|||
|
|||
protected override void OnModelCreating(ModelBuilder modelBuilder) |
|||
{ |
|||
modelBuilder.Entity<NvrInfo>(entity => |
|||
{ |
|||
entity.HasKey(e => e.NvrId); |
|||
|
|||
entity.ToTable("NvrInfo"); |
|||
|
|||
entity.Property(e => e.NvrId).HasColumnName("NvrID"); |
|||
|
|||
entity.Property(e => e.NvrAddr).HasColumnType("VARCHAR (100)"); |
|||
|
|||
entity.Property(e => e.NvrEnable) |
|||
.IsRequired() |
|||
.HasColumnType("VARCHAR (2)"); |
|||
|
|||
entity.Property(e => e.NvrIp) |
|||
.IsRequired() |
|||
.HasColumnType("VARCHAR (18)") |
|||
.HasColumnName("NvrIP"); |
|||
|
|||
entity.Property(e => e.NvrName) |
|||
.IsRequired() |
|||
.HasColumnType("VARCHAR (30)"); |
|||
|
|||
entity.Property(e => e.NvrType).HasColumnType("VARCHAR (20)"); |
|||
|
|||
entity.Property(e => e.UserName).HasColumnType("VARCHAR (20)"); |
|||
|
|||
entity.Property(e => e.UserPwd).HasColumnType("VARCHAR (20)"); |
|||
}); |
|||
|
|||
OnModelCreatingPartial(modelBuilder); |
|||
} |
|||
|
|||
#region Operate
|
|||
|
|||
public List<string> GetNvrDeviceList() |
|||
{ |
|||
List<string> list = new() { "海康", "大华", "宇视", "深广", "泰杰", "其它" }; |
|||
return list; |
|||
} |
|||
|
|||
public async Task<List<string>> GetNvrNameListAsync() |
|||
{ |
|||
List<string> list = new(); |
|||
List<NvrInfo> infos = await GetListAsync(); |
|||
foreach (NvrInfo info in infos) |
|||
{ |
|||
if (!list.Contains(info.NvrName)) |
|||
{ |
|||
list.Add(info.NvrName); |
|||
} |
|||
} |
|||
return list; |
|||
} |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,42 @@ |
|||
using EC.Entity.CameraInfo; |
|||
using Microsoft.EntityFrameworkCore; |
|||
|
|||
#nullable disable |
|||
|
|||
namespace EC.Service.CameraInfo |
|||
{ |
|||
public class PollInfoContext : BaseDbContext<PollInfo> |
|||
{ |
|||
public PollInfoContext() |
|||
{ |
|||
} |
|||
|
|||
protected override void OnModelCreating(ModelBuilder modelBuilder) |
|||
{ |
|||
modelBuilder.Entity<PollInfo>(entity => |
|||
{ |
|||
entity.HasKey(e => e.PollId); |
|||
|
|||
entity.ToTable("PollInfo"); |
|||
|
|||
entity.Property(e => e.PollId) |
|||
.ValueGeneratedNever() |
|||
.HasColumnName("PollID"); |
|||
|
|||
entity.Property(e => e.PollGroup) |
|||
.IsRequired() |
|||
.HasColumnType("VARCHAR (20)"); |
|||
|
|||
entity.Property(e => e.RtspMain) |
|||
.IsRequired() |
|||
.HasColumnType("VARCHAR (250)"); |
|||
|
|||
entity.Property(e => e.RtspSub) |
|||
.IsRequired() |
|||
.HasColumnType("VARCHAR (250)"); |
|||
}); |
|||
|
|||
OnModelCreatingPartial(modelBuilder); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,34 @@ |
|||
using EC.Entity.CameraInfo; |
|||
using Microsoft.EntityFrameworkCore; |
|||
|
|||
#nullable disable |
|||
|
|||
namespace EC.Service.CameraInfo |
|||
{ |
|||
public class UserInfoContext : BaseDbContext<UserInfo> |
|||
{ |
|||
public UserInfoContext() |
|||
{ |
|||
} |
|||
|
|||
protected override void OnModelCreating(ModelBuilder modelBuilder) |
|||
{ |
|||
modelBuilder.Entity<UserInfo>(entity => |
|||
{ |
|||
entity.HasKey(e => e.UserName); |
|||
|
|||
entity.ToTable("UserInfo"); |
|||
|
|||
entity.Property(e => e.UserName).HasColumnType("VARCHAR (20)"); |
|||
|
|||
entity.Property(e => e.UserAdmin).HasColumnType("VARCHAR (30)"); |
|||
|
|||
entity.Property(e => e.UserPwd).HasColumnType("VARCHAR (20)"); |
|||
|
|||
entity.Property(e => e.UserType).HasColumnType("VARCHAR (10)"); |
|||
}); |
|||
|
|||
OnModelCreatingPartial(modelBuilder); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,18 @@ |
|||
using EC.Utils.Config; |
|||
|
|||
namespace EC.Service.Config |
|||
{ |
|||
public class ConfigHelper : ConfigurationHelper |
|||
{ |
|||
/// <summary>
|
|||
|
|||
#region 数据库
|
|||
|
|||
public static string GetDbConnection() |
|||
{ |
|||
return ConfigurationHelper.GetDbConnection("ConnectionString"); |
|||
} |
|||
|
|||
#endregion 数据库
|
|||
} |
|||
} |
@ -0,0 +1,12 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net5.0-windows7.0</TargetFramework> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\EC.Entity\EC.Entity.csproj" /> |
|||
<ProjectReference Include="..\公共库\EC.Utils\EC.Utils.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
@ -0,0 +1,16 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net5.0-windows7.0</TargetFramework> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Prism.Core" Version="8.1.97" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\EC.Entity\EC.Entity.csproj" /> |
|||
<ProjectReference Include="..\公共库\EC.Onvif\EC.Onvif.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
@ -0,0 +1,62 @@ |
|||
using System; |
|||
|
|||
namespace EC.UsingEventAggregator |
|||
{ |
|||
public enum LoggerLevel |
|||
{ |
|||
Debug, |
|||
Info, |
|||
Error, |
|||
} |
|||
|
|||
public class MyLogger |
|||
{ |
|||
public MyLogger(string message, LoggerLevel level = LoggerLevel.Debug) |
|||
{ |
|||
Message = message; |
|||
Level = level; |
|||
} |
|||
|
|||
public string Message { get; set; } |
|||
public LoggerLevel Level { get; set; } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 文件Logger
|
|||
/// </summary>
|
|||
public class FLogger |
|||
{ |
|||
public static event Action<string> SubMessage; |
|||
|
|||
public static event Action<MyLogger> SubLog; |
|||
|
|||
//public static void PubMessge(string message)
|
|||
//{
|
|||
// SubMessage?.Invoke(message);
|
|||
//}
|
|||
public static void PubLog(string message, LoggerLevel level = LoggerLevel.Debug) |
|||
{ |
|||
SubLog?.Invoke(new MyLogger(message, level)); |
|||
} |
|||
|
|||
public static void Debug(string message) |
|||
{ |
|||
SubLog?.Invoke(new MyLogger(message, LoggerLevel.Debug)); |
|||
} |
|||
|
|||
public static void Info(string message) |
|||
{ |
|||
SubLog?.Invoke(new MyLogger(message, LoggerLevel.Info)); |
|||
} |
|||
|
|||
public static void Error(string message) |
|||
{ |
|||
SubLog?.Invoke(new MyLogger(message, LoggerLevel.Error)); |
|||
} |
|||
|
|||
public static void Error(Exception ex) |
|||
{ |
|||
SubLog?.Invoke(new MyLogger(ex.Message, LoggerLevel.Error)); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,82 @@ |
|||
using EC.Entity.CameraInfo; |
|||
using EC.Entity.Warning; |
|||
using EC.Onvif; |
|||
using Prism.Events; |
|||
using System.Collections.Generic; |
|||
|
|||
namespace EC.UsingEventAggregator |
|||
{ |
|||
public class LogModel |
|||
{ |
|||
public LogModel(int level, string message, string remark = "") |
|||
{ |
|||
this.level = level; |
|||
this.message = message; |
|||
this.remark = remark; |
|||
} |
|||
|
|||
public int level { get; set; } |
|||
public string message { get; set; } |
|||
public string remark { get; set; } |
|||
} |
|||
|
|||
public class MQModel |
|||
{ |
|||
public int level { get; set; } |
|||
public string message { get; set; } |
|||
} |
|||
|
|||
public class MessageSentEvent : PubSubEvent<string> |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// MQ消息
|
|||
/// </summary>
|
|||
public class MQMessageEvent : PubSubEvent<MQModel> |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 显示日志
|
|||
/// </summary>
|
|||
public class ShowMessageSentEvent : PubSubEvent<LogModel> |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 保存日志
|
|||
/// </summary>
|
|||
public class SaveLogEvent : PubSubEvent<LogModel> |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 在主窗体播放视频
|
|||
/// </summary>
|
|||
public class ShowVoideInMainEvent : PubSubEvent<string> |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 预警视频数据
|
|||
/// </summary>
|
|||
public class WaningVoideEvent : PubSubEvent<WarningModel> |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 预警分析图片数据
|
|||
/// </summary>
|
|||
public class WaningImageBytesEvent : PubSubEvent<byte[]> |
|||
{ |
|||
} |
|||
|
|||
public class SendOnvifClientEvent : PubSubEvent<OnvifClient> |
|||
{ |
|||
} |
|||
|
|||
public class SendIpcInfoListEvent : PubSubEvent<List<IpcInfo>> |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,213 @@ |
|||
|
|||
Microsoft Visual Studio Solution File, Format Version 12.00 |
|||
# Visual Studio Version 16 |
|||
VisualStudioVersion = 16.0.30804.86 |
|||
MinimumVisualStudioVersion = 10.0.40219.1 |
|||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EC.Service", "EC.Service\EC.Service.csproj", "{C37542F7-5C6A-4998-8D1B-CED979560C8A}" |
|||
EndProject |
|||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ECMonitor", "ECMonitor\ECMonitor.csproj", "{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}" |
|||
EndProject |
|||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EC.UsingEventAggregator", "EC.UsingEventAggregator\EC.UsingEventAggregator.csproj", "{8E4EFE09-CB77-44A6-904E-B42639136385}" |
|||
EndProject |
|||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "视频处理", "视频处理", "{A09E2512-EFE0-4E69-B7D1-B964B6358887}" |
|||
EndProject |
|||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "公共库", "公共库", "{8B78A8FF-D59D-4E86-91F3-0D5A4332E3B1}" |
|||
EndProject |
|||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EC.Entity", "EC.Entity\EC.Entity.csproj", "{2242B8A5-3E25-499E-9B23-3E61517A543E}" |
|||
EndProject |
|||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HKPlayers", "播放库\HKPlayers\HKPlayers.csproj", "{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}" |
|||
EndProject |
|||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EC.FFmpegAutoGen", "播放库\EC.FFmpegAutoGen\EC.FFmpegAutoGen.csproj", "{58B91E08-B095-4598-A0A4-74E3882F1881}" |
|||
EndProject |
|||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EC.Utils", "公共库\EC.Utils\EC.Utils.csproj", "{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}" |
|||
EndProject |
|||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EC.Onvif", "公共库\EC.Onvif\EC.Onvif.csproj", "{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}" |
|||
EndProject |
|||
Global |
|||
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
|||
Debug|Any CPU = Debug|Any CPU |
|||
Debug|ARM = Debug|ARM |
|||
Debug|ARM64 = Debug|ARM64 |
|||
Debug|x64 = Debug|x64 |
|||
Debug|x86 = Debug|x86 |
|||
Release|Any CPU = Release|Any CPU |
|||
Release|ARM = Release|ARM |
|||
Release|ARM64 = Release|ARM64 |
|||
Release|x64 = Release|x64 |
|||
Release|x86 = Release|x86 |
|||
EndGlobalSection |
|||
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Debug|ARM.ActiveCfg = Debug|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Debug|ARM.Build.0 = Debug|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Debug|ARM64.ActiveCfg = Debug|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Debug|ARM64.Build.0 = Debug|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Debug|x64.ActiveCfg = Debug|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Debug|x64.Build.0 = Debug|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Debug|x86.ActiveCfg = Debug|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Debug|x86.Build.0 = Debug|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Release|ARM.ActiveCfg = Release|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Release|ARM.Build.0 = Release|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Release|ARM64.ActiveCfg = Release|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Release|ARM64.Build.0 = Release|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Release|x64.ActiveCfg = Release|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Release|x64.Build.0 = Release|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Release|x86.ActiveCfg = Release|Any CPU |
|||
{C37542F7-5C6A-4998-8D1B-CED979560C8A}.Release|x86.Build.0 = Release|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Debug|ARM.ActiveCfg = Debug|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Debug|ARM.Build.0 = Debug|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Debug|ARM64.ActiveCfg = Debug|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Debug|ARM64.Build.0 = Debug|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Debug|x64.ActiveCfg = Debug|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Debug|x64.Build.0 = Debug|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Debug|x86.ActiveCfg = Debug|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Debug|x86.Build.0 = Debug|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Release|ARM.ActiveCfg = Release|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Release|ARM.Build.0 = Release|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Release|ARM64.ActiveCfg = Release|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Release|ARM64.Build.0 = Release|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Release|x64.ActiveCfg = Release|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Release|x64.Build.0 = Release|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Release|x86.ActiveCfg = Release|Any CPU |
|||
{7F5DA7D9-8DCF-44C8-921D-B156C99D4F9B}.Release|x86.Build.0 = Release|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Debug|ARM.ActiveCfg = Debug|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Debug|ARM.Build.0 = Debug|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Debug|ARM64.ActiveCfg = Debug|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Debug|ARM64.Build.0 = Debug|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Debug|x64.ActiveCfg = Debug|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Debug|x64.Build.0 = Debug|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Debug|x86.ActiveCfg = Debug|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Debug|x86.Build.0 = Debug|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Release|ARM.ActiveCfg = Release|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Release|ARM.Build.0 = Release|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Release|ARM64.ActiveCfg = Release|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Release|ARM64.Build.0 = Release|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Release|x64.ActiveCfg = Release|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Release|x64.Build.0 = Release|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Release|x86.ActiveCfg = Release|Any CPU |
|||
{8E4EFE09-CB77-44A6-904E-B42639136385}.Release|x86.Build.0 = Release|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Debug|ARM.ActiveCfg = Debug|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Debug|ARM.Build.0 = Debug|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Debug|ARM64.ActiveCfg = Debug|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Debug|ARM64.Build.0 = Debug|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Debug|x64.ActiveCfg = Debug|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Debug|x64.Build.0 = Debug|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Debug|x86.ActiveCfg = Debug|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Debug|x86.Build.0 = Debug|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Release|ARM.ActiveCfg = Release|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Release|ARM.Build.0 = Release|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Release|ARM64.ActiveCfg = Release|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Release|ARM64.Build.0 = Release|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Release|x64.ActiveCfg = Release|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Release|x64.Build.0 = Release|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Release|x86.ActiveCfg = Release|Any CPU |
|||
{2242B8A5-3E25-499E-9B23-3E61517A543E}.Release|x86.Build.0 = Release|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Debug|ARM.ActiveCfg = Debug|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Debug|ARM.Build.0 = Debug|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Debug|ARM64.ActiveCfg = Debug|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Debug|ARM64.Build.0 = Debug|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Debug|x64.ActiveCfg = Debug|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Debug|x64.Build.0 = Debug|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Debug|x86.ActiveCfg = Debug|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Debug|x86.Build.0 = Debug|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Release|ARM.ActiveCfg = Release|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Release|ARM.Build.0 = Release|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Release|ARM64.ActiveCfg = Release|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Release|ARM64.Build.0 = Release|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Release|x64.ActiveCfg = Release|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Release|x64.Build.0 = Release|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Release|x86.ActiveCfg = Release|Any CPU |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F}.Release|x86.Build.0 = Release|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Debug|ARM.ActiveCfg = Debug|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Debug|ARM.Build.0 = Debug|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Debug|ARM64.ActiveCfg = Debug|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Debug|ARM64.Build.0 = Debug|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Debug|x64.ActiveCfg = Debug|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Debug|x64.Build.0 = Debug|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Debug|x86.ActiveCfg = Debug|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Debug|x86.Build.0 = Debug|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Release|ARM.ActiveCfg = Release|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Release|ARM.Build.0 = Release|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Release|ARM64.ActiveCfg = Release|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Release|ARM64.Build.0 = Release|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Release|x64.ActiveCfg = Release|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Release|x64.Build.0 = Release|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Release|x86.ActiveCfg = Release|Any CPU |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881}.Release|x86.Build.0 = Release|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Debug|ARM.ActiveCfg = Debug|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Debug|ARM.Build.0 = Debug|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Debug|ARM64.ActiveCfg = Debug|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Debug|ARM64.Build.0 = Debug|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Debug|x64.ActiveCfg = Debug|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Debug|x64.Build.0 = Debug|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Debug|x86.ActiveCfg = Debug|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Debug|x86.Build.0 = Debug|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Release|ARM.ActiveCfg = Release|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Release|ARM.Build.0 = Release|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Release|ARM64.ActiveCfg = Release|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Release|ARM64.Build.0 = Release|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Release|x64.ActiveCfg = Release|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Release|x64.Build.0 = Release|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Release|x86.ActiveCfg = Release|Any CPU |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207}.Release|x86.Build.0 = Release|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Debug|ARM.ActiveCfg = Debug|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Debug|ARM.Build.0 = Debug|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Debug|ARM64.ActiveCfg = Debug|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Debug|ARM64.Build.0 = Debug|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Debug|x64.ActiveCfg = Debug|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Debug|x64.Build.0 = Debug|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Debug|x86.ActiveCfg = Debug|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Debug|x86.Build.0 = Debug|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Release|ARM.ActiveCfg = Release|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Release|ARM.Build.0 = Release|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Release|ARM64.ActiveCfg = Release|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Release|ARM64.Build.0 = Release|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Release|x64.ActiveCfg = Release|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Release|x64.Build.0 = Release|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Release|x86.ActiveCfg = Release|Any CPU |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39}.Release|x86.Build.0 = Release|Any CPU |
|||
EndGlobalSection |
|||
GlobalSection(SolutionProperties) = preSolution |
|||
HideSolutionNode = FALSE |
|||
EndGlobalSection |
|||
GlobalSection(NestedProjects) = preSolution |
|||
{5EC832FA-4BD1-466C-B221-21BAE5A3D21F} = {A09E2512-EFE0-4E69-B7D1-B964B6358887} |
|||
{58B91E08-B095-4598-A0A4-74E3882F1881} = {A09E2512-EFE0-4E69-B7D1-B964B6358887} |
|||
{D651B7BC-B1B4-4D33-A409-3C8E6C52B207} = {8B78A8FF-D59D-4E86-91F3-0D5A4332E3B1} |
|||
{EFEDF229-0330-46B4-B32E-3CA6BEA61E39} = {8B78A8FF-D59D-4E86-91F3-0D5A4332E3B1} |
|||
EndGlobalSection |
|||
GlobalSection(ExtensibilityGlobals) = postSolution |
|||
SolutionGuid = {279F81E9-23B1-4D20-A450-2BADF996975B} |
|||
EndGlobalSection |
|||
EndGlobal |
@ -0,0 +1,111 @@ |
|||
<prism:PrismApplication x:Class="ECMonitor.App" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" |
|||
xmlns:prism="http://prismlibrary.com/" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> |
|||
<Application.Resources> |
|||
<ResourceDictionary> |
|||
<ResourceDictionary.MergedDictionaries> |
|||
<!-- This is the current way to setup your app's initial theme --> |
|||
<materialDesign:BundledTheme BaseTheme="Dark" PrimaryColor="Blue" SecondaryColor="Lime" |
|||
ColorAdjustment="{materialDesign:ColorAdjustment}" /> |
|||
|
|||
<!-- If you would prefer to use your own colors there is an option for that as well --> |
|||
<!--<materialDesign:CustomColorTheme BaseTheme="Light" PrimaryColor="Aqua" SecondaryColor="DarkGreen" />--> |
|||
|
|||
<!-- You can also use the built in theme dictionaries as well |
|||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" /> |
|||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" /> |
|||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Lime.xaml" /> |
|||
--> |
|||
|
|||
<!-- Material Design,整体界面颜色 --> |
|||
<!--<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />--> |
|||
|
|||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Blue.xaml" /> |
|||
<!--<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.LightBlue.xaml" />--> |
|||
|
|||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Dark.xaml" /> |
|||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" /> |
|||
</ResourceDictionary.MergedDictionaries> |
|||
<!--PRIMARY--> |
|||
<SolidColorBrush x:Key="PrimaryBodyBrush" Color="#44494f" /> |
|||
<SolidColorBrush x:Key="PrimaryBarBrush" Color="#40444d" /> |
|||
<SolidColorBrush x:Key="PrimaryBackGroupBrush" Color="#40444d" /> |
|||
<SolidColorBrush x:Key="PrimaryButtonBrush" Color="#4c8bb7" /> |
|||
<SolidColorBrush x:Key="PrimaryFontBrush" Color="#FFFFFF" /> |
|||
<SolidColorBrush x:Key="PrimaryBorderBrush" Color="Aqua" /> |
|||
<Color x:Key="PageBodyColor">#44494f</Color> |
|||
<Color x:Key="PageBgColor">#40444d</Color> |
|||
<Color x:Key="PageBorderColor">#32363f</Color> |
|||
<SolidColorBrush x:Key="PageBodyBrush" Color="#44494f" /> |
|||
<SolidColorBrush x:Key="PageBgBrush" Color="#40444d" /> |
|||
<SolidColorBrush x:Key="PageBorderBrush" Color="#32363f" /> |
|||
<Style x:Key="ECButtonStyle"> |
|||
<Setter Property="Control.Margin" Value="0,0,10,0" /> |
|||
<Setter Property="Control.Padding" Value="10,0,10,0" /> |
|||
<Setter Property="Control.FontFamily" Value="微软雅黑" /> |
|||
<Setter Property="Control.FontSize" Value="18" /> |
|||
<Setter Property="Control.Width" Value="20" /> |
|||
<Setter Property="Control.Height" Value="20" /> |
|||
<Setter Property="Control.Background" Value="#4c8bb7" /> |
|||
<Setter Property="Control.FontWeight" Value="Bold" /> |
|||
<Setter Property="Control.BorderBrush" Value="Transparent" /> |
|||
</Style> |
|||
<Style x:Key="ECChecketStyle"> |
|||
<Setter Property="Control.Margin" Value="0,0,10,0" /> |
|||
<Setter Property="Control.FontFamily" Value="微软雅黑" /> |
|||
<Setter Property="Control.FontSize" Value="18" /> |
|||
<Setter Property="Control.Foreground" Value="#FFFFFF" /> |
|||
<Setter Property="Control.Padding" Value="5,15,5,5" /> |
|||
</Style> |
|||
<Style x:Key="TopRightButtonStyle"> |
|||
<Setter Property="Control.Margin" Value="5,0,10,0" /> |
|||
<Setter Property="Control.FontFamily" Value="微软雅黑" /> |
|||
<Setter Property="Control.FontSize" Value="18" /> |
|||
<Setter Property="Control.Width" Value="20" /> |
|||
<Setter Property="Control.Height" Value="20" /> |
|||
<Setter Property="Control.Background" Value="Transparent" /> |
|||
<Setter Property="Control.FontWeight" Value="Bold" /> |
|||
<Setter Property="Control.BorderBrush" Value="Transparent" /> |
|||
</Style> |
|||
<Style x:Key="TopButtonStyle"> |
|||
<Setter Property="Control.Margin" Value="5,0,10,0" /> |
|||
<Setter Property="Control.FontFamily" Value="微软雅黑" /> |
|||
<Setter Property="Control.FontSize" Value="22" /> |
|||
<Setter Property="Control.Width" Value="30" /> |
|||
<Setter Property="Control.Height" Value="30" /> |
|||
<Setter Property="Control.Background" Value="Transparent" /> |
|||
<Setter Property="Control.FontWeight" Value="Bold" /> |
|||
<Setter Property="Control.BorderBrush" Value="Transparent" /> |
|||
</Style> |
|||
<Style x:Key="BottomRightButtonStyle"> |
|||
<Setter Property="Control.Margin" Value="10,0,0,0" /> |
|||
<Setter Property="Control.FontFamily" Value="微软雅黑" /> |
|||
<Setter Property="Control.FontSize" Value="18" /> |
|||
<Setter Property="Control.Width" Value="20" /> |
|||
<Setter Property="Control.Height" Value="20" /> |
|||
<Setter Property="Control.Background" Value="Transparent" /> |
|||
<Setter Property="Control.FontWeight" Value="Bold" /> |
|||
<Setter Property="Control.BorderBrush" Value="Transparent" /> |
|||
</Style> |
|||
|
|||
<Style x:Key="TopButtonImgStyle"> |
|||
<Setter Property="Control.Width" Value="20" /> |
|||
<Setter Property="Control.Height" Value="20" /> |
|||
</Style> |
|||
<Style x:Key="ButtonImgStyle"> |
|||
<Setter Property="Control.Width" Value="15" /> |
|||
<Setter Property="Control.Height" Value="15" /> |
|||
</Style> |
|||
<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}"> |
|||
<Border x:Name="Border" BorderThickness="0" CornerRadius="6" Margin="0,0,10,0" TextBlock.Foreground="White" Background="#4c8bb7"> |
|||
<!--设置控件的边框,圆角,背景色,字体颜色--> |
|||
<ContentPresenter Margin="{TemplateBinding Padding}" HorizontalAlignment="Center" VerticalAlignment="Center"> |
|||
<!--显示控件的内容--> |
|||
</ContentPresenter> |
|||
</Border> |
|||
</ControlTemplate> |
|||
</ResourceDictionary> |
|||
</Application.Resources> |
|||
</prism:PrismApplication> |
@ -0,0 +1,91 @@ |
|||
using EC.UsingEventAggregator; |
|||
using EC.Utils; |
|||
using LibVLCSharp.Shared; |
|||
using Prism.Ioc; |
|||
using Prism.Modularity; |
|||
using Prism.Unity; |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using System.Windows; |
|||
using System.Windows.Threading; |
|||
|
|||
namespace ECMonitor |
|||
{ |
|||
/// <summary>
|
|||
/// Interaction logic for App.xaml
|
|||
/// </summary>
|
|||
public partial class App : PrismApplication |
|||
{ |
|||
protected override void OnStartup(StartupEventArgs e) |
|||
{ |
|||
Core.Initialize(); |
|||
base.OnStartup(e); |
|||
RegisterEvents(); |
|||
LogFactory.GetLogger().Info("OnStartup"); |
|||
|
|||
// await new IpcInfoService().Test();//test sqlite
|
|||
} |
|||
|
|||
protected override Window CreateShell() |
|||
{ |
|||
return Container.Resolve<MainWindow>(); |
|||
} |
|||
|
|||
protected override void RegisterTypes(IContainerRegistry containerRegistry) |
|||
{ |
|||
} |
|||
|
|||
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) |
|||
{ |
|||
moduleCatalog.AddModule<NavigationModule>(); |
|||
} |
|||
|
|||
//protected override IModuleCatalog CreateModuleCatalog()
|
|||
//{
|
|||
// return new ConfigurationModuleCatalog();
|
|||
//}
|
|||
protected override void OnExit(ExitEventArgs e) |
|||
{ |
|||
base.OnExit(e); |
|||
} |
|||
|
|||
private void RegisterEvents() |
|||
{ |
|||
//TaskScheduler.UnobservedTaskException += (sender, args) =>
|
|||
//{
|
|||
// MessageBox.Show(args.Exception.Message);
|
|||
// args.SetObserved();
|
|||
//};
|
|||
DispatcherUnhandledException += App_DispatcherUnhandledException; |
|||
|
|||
TaskScheduler.UnobservedTaskException += new EventHandler< |
|||
UnobservedTaskExceptionEventArgs>(TaskScheduler_UnobservedTaskException); |
|||
|
|||
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; |
|||
} |
|||
|
|||
private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) |
|||
{ |
|||
FLogger.Error("Error encountered! Please contact support." + Environment.NewLine + e.Exception.Message); |
|||
|
|||
e.Handled = true; |
|||
} |
|||
|
|||
private static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) |
|||
{ |
|||
foreach (Exception item in e.Exception.InnerExceptions) |
|||
{ |
|||
FLogger.Error(string.Format("异常类型:{0}{1}来自:{2}{3}异常内容:{4}", |
|||
item.GetType(), Environment.NewLine, item.Source, |
|||
Environment.NewLine, item.Message)); |
|||
} |
|||
//将异常标识为已经观察到
|
|||
e.SetObserved(); |
|||
} |
|||
|
|||
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) |
|||
{ |
|||
FLogger.Error("Unhandled exception."); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,10 @@ |
|||
using System.Windows; |
|||
|
|||
[assembly: ThemeInfo( |
|||
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
|||
//(used if a resource is not found in the page,
|
|||
// or application resource dictionaries)
|
|||
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
|||
//(used if a resource is not found in the page,
|
|||
// app, or any theme specific resource dictionaries)
|
|||
)] |
@ -0,0 +1,103 @@ |
|||
using EC.Utils.Config; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace ECMonitor |
|||
{ |
|||
public class ConfigHelper : ConfigurationHelper |
|||
{ |
|||
#region
|
|||
/// <summary>
|
|||
/// 自动关闭预警窗体
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
public static bool? AutoWarningClose() |
|||
{ |
|||
return GetValueInt("AutoWarningClose") == 1; |
|||
} |
|||
/// <summary>
|
|||
/// AI 检索
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
public static bool? VideoAIDetection() |
|||
{ |
|||
return GetValueInt("VideoAIDetection") == 1; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// WebSocketSvrPort
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
public static int WebSocketSvrPort() |
|||
{ |
|||
return GetValueInt("WebSocketSvrPort"); |
|||
} |
|||
public static string APIServer() |
|||
{ |
|||
return GetValue("APIServer"); |
|||
} |
|||
/// <summary>
|
|||
/// 可选初始窗体图标 0:(1个窗体),1:4个窗体, 2:9个窗体
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
public static int MainBarButtonSelectedIndex() |
|||
{ |
|||
return GetValueInt("MainBarButtonSelectedIndex"); |
|||
} |
|||
public static string AIInputPath() |
|||
{ |
|||
return GetValue("AIInputPath"); |
|||
} |
|||
public static string AIOutPath() |
|||
{ |
|||
return GetValue("AIOutPath"); |
|||
} |
|||
|
|||
#endregion
|
|||
#region ZMQ 配置
|
|||
|
|||
/// 发布地址
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
public static string PUBServer() |
|||
{ |
|||
return GetMQValue("PUBServer"); |
|||
} |
|||
/// <summary>
|
|||
/// 订阅地址
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
public static string SUBServer() |
|||
{ |
|||
return GetMQValue("SUBServer"); |
|||
} |
|||
//AI服务地址
|
|||
public static string AISvrServer() |
|||
{ |
|||
return GetMQValue("AISvrServer"); |
|||
} |
|||
/// <summary>
|
|||
/// AI图片数据订阅 地址
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
public static string SUBImageServer() |
|||
{ |
|||
return GetMQValue("SUBImageServer"); |
|||
} |
|||
|
|||
#endregion
|
|||
/// <summary>
|
|||
/// 数据库服务地址
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
public static string DBSvrServer() |
|||
{ |
|||
return GetMQValue("DBSvrServer"); |
|||
} |
|||
|
|||
|
|||
} |
|||
} |
@ -0,0 +1,106 @@ |
|||
|
|||
using EC.Entity.PublicModel; |
|||
using EC.Entity.Video; |
|||
using EC.Entity.Warning; |
|||
|
|||
using EC.Utils; |
|||
|
|||
using EC.Utils.ZMQ; |
|||
|
|||
using NetMQ; |
|||
using NetMQ.Sockets; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace ECMonitor.Code.DB |
|||
{ |
|||
public class DBDataHelper |
|||
{ |
|||
//public static string _apiUrl = ConfigHelper.APIServer();
|
|||
public static string _dbSvrServer = ConfigHelper.DBSvrServer(); |
|||
public static ZMQRequestHelper requestHelper=null; |
|||
public static ZMQRequestHelper RequestContext() { |
|||
if (requestHelper == null) |
|||
{ |
|||
requestHelper = new ZMQRequestHelper(_dbSvrServer); |
|||
|
|||
} |
|||
return requestHelper; |
|||
} |
|||
/// <summary>
|
|||
/// 获取相机数据
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
public static List<MsVideoRecorder> LoadCameraData() |
|||
{ |
|||
List<MsVideoRecorder> msVideoRecorderList = new List<MsVideoRecorder>(); |
|||
try |
|||
{ |
|||
RequestModel requestModel = new RequestModel(); |
|||
requestModel.method = DBMethod.GetGroupAndCameraList; |
|||
requestModel.jsonstr = "all"; |
|||
|
|||
ResultModel resultModel = RequestContext().RequestFromServer(requestModel); |
|||
if (resultModel.result == DBMethod.Success) |
|||
{ |
|||
msVideoRecorderList = resultModel.jsonstr.ToObject<List<MsVideoRecorder>>(); |
|||
} |
|||
|
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
LogFactory.GetLogger().Error(ex); |
|||
} |
|||
|
|||
return msVideoRecorderList; |
|||
} |
|||
|
|||
|
|||
|
|||
/// <summary>
|
|||
/// 保存预警划线
|
|||
/// </summary>
|
|||
/// <param name="drawShapeModelList"></param>
|
|||
internal static bool SaveDrawShape(List<DrawShape> drawShapeModelList) |
|||
{ |
|||
RequestModel requestModel = new RequestModel(); |
|||
requestModel.method = DBMethod.SaveDrawShape; |
|||
requestModel.jsonstr = drawShapeModelList.ToJson(); |
|||
LogFactory.GetLogger().Debug(requestModel.jsonstr); |
|||
ResultModel resultModel =RequestContext().RequestFromServer(requestModel); |
|||
if (resultModel.result == DBMethod.Success) |
|||
{ |
|||
return true; |
|||
}else |
|||
{ |
|||
return false; |
|||
} |
|||
|
|||
} |
|||
internal static List<DrawShape> GetDrawShape(string ip) |
|||
{ |
|||
List<DrawShape> drawShapeModelList = new List<DrawShape>(); |
|||
try |
|||
{ |
|||
RequestModel requestModel = new RequestModel(); |
|||
requestModel.method = DBMethod.GetDrawShape; |
|||
requestModel.jsonstr = ip; |
|||
LogFactory.GetLogger().Debug(requestModel.jsonstr); |
|||
ResultModel resultModel = RequestContext().RequestFromServer(requestModel); |
|||
if (resultModel.result == DBMethod.Success) |
|||
{ |
|||
drawShapeModelList = Json.ToObject<List<DrawShape>>(resultModel.jsonstr); |
|||
} |
|||
}catch(Exception ex) |
|||
{ |
|||
LogFactory.GetLogger().Debug(ex); |
|||
} |
|||
|
|||
return drawShapeModelList; |
|||
|
|||
} |
|||
} |
|||
} |
@ -0,0 +1,43 @@ |
|||
using EC.Entity.Video; |
|||
using EC.Utils; |
|||
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
|
|||
namespace ECMonitor.Code |
|||
{ |
|||
public class LoadFromAPIServer |
|||
{ |
|||
public static string _apiUrl = ConfigHelper.APIServer(); |
|||
|
|||
/// <summary>
|
|||
/// 获取相机数据
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
public static List<MsVideoRecorder> LoadCameraData() |
|||
{ |
|||
List<MsVideoRecorder> msVideoRecorderList = new List<MsVideoRecorder>(); |
|||
try |
|||
{ |
|||
var respStr = HttpMethods.HttpGet(_apiUrl); |
|||
var respObj = Json.ToJObject(respStr); |
|||
var success = (bool)respObj["success"]; |
|||
if (success) |
|||
{ |
|||
var message = (string)respObj["message"]; |
|||
var code = (int)respObj["code"]; |
|||
var timestamp = (string)respObj["timestamp"]; |
|||
msVideoRecorderList = Json.ToList<MsVideoRecorder>(respObj["result"]?.ToString()); |
|||
} |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
LogFactory.GetLogger().Error(ex); |
|||
} |
|||
|
|||
return msVideoRecorderList; |
|||
} |
|||
|
|||
|
|||
} |
|||
} |
@ -0,0 +1,14 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace ECMonitor.Code.ServerData |
|||
{ |
|||
public class RequestModel |
|||
{ |
|||
public string Key { get; set; } |
|||
public string jsonstr { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,89 @@ |
|||
using EC.UsingEventAggregator; |
|||
using Prism.Commands; |
|||
using Prism.Events; |
|||
using Prism.Mvvm; |
|||
using Prism.Regions; |
|||
using System.Collections.Specialized; |
|||
|
|||
namespace ECMonitor.Code.Models |
|||
{ |
|||
public class BaseModel : BindableBase |
|||
{ |
|||
public IRegionManager _regionManager { get; set; } |
|||
public IEventAggregator _ea { get; set; } |
|||
|
|||
private string _title = ""; |
|||
|
|||
public string Title |
|||
{ |
|||
get { return _title; } |
|||
set { SetProperty(ref _title, value); } |
|||
} |
|||
|
|||
public DelegateCommand<string> SendMessageCommand { get; private set; } |
|||
|
|||
public BaseModel(IRegionManager regionManager, IEventAggregator ea) |
|||
{ |
|||
_regionManager = regionManager; |
|||
_ea = ea; |
|||
_regionManager.Regions.CollectionChanged += Regions_CollectionChanged; |
|||
|
|||
SendMessageCommand = new DelegateCommand<string>(SendMessage); |
|||
_ea.GetEvent<ShowMessageSentEvent>().Subscribe(MessageReceived); |
|||
} |
|||
|
|||
public virtual void Regions_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) |
|||
{ |
|||
if (e.Action == NotifyCollectionChangedAction.Add) |
|||
{ |
|||
var region = (IRegion)e.NewItems[0]; |
|||
region.Views.CollectionChanged += Views_CollectionChanged; |
|||
} |
|||
} |
|||
|
|||
public virtual void Views_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) |
|||
{ |
|||
if (e.Action == NotifyCollectionChangedAction.Add) |
|||
{ |
|||
} |
|||
else if (e.Action == NotifyCollectionChangedAction.Remove) |
|||
{ |
|||
} |
|||
} |
|||
|
|||
public virtual void SendMessage(string message) |
|||
{ |
|||
SendMessage(new LogModel(1, message)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 发送消息
|
|||
/// </summary>
|
|||
/// <param name="log"></param>
|
|||
public virtual void SendMessage(LogModel log) |
|||
{ |
|||
_ea.GetEvent<ShowMessageSentEvent>().Publish(log); |
|||
} |
|||
|
|||
public virtual void MessageReceived(LogModel log) |
|||
{ |
|||
//Messages.Add(message);
|
|||
} |
|||
|
|||
#region 日志
|
|||
|
|||
public void Debug(string message) |
|||
{ |
|||
} |
|||
|
|||
public void Info(string message) |
|||
{ |
|||
} |
|||
|
|||
public void Error(string message) |
|||
{ |
|||
} |
|||
|
|||
#endregion 日志
|
|||
} |
|||
} |
@ -0,0 +1,46 @@ |
|||
using EC.Entity.Video; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace ECMonitor.Code.Models |
|||
{ |
|||
public class VideoShowModel |
|||
{ |
|||
public VideoShowModel() |
|||
{ |
|||
UPDateTime(); |
|||
} |
|||
public string Message { get; set; } |
|||
public string CameraIp { get; set; } |
|||
public MonitorCamera Camera { get; set; } |
|||
/// <summary>
|
|||
/// 控件注册名称
|
|||
/// </summary>
|
|||
public string UCName { get; set; } |
|||
/// <summary>
|
|||
/// 更新时间
|
|||
/// </summary>
|
|||
private DateTime upDateTime; |
|||
public void UPDateTime() |
|||
{ |
|||
upDateTime = new DateTime(); |
|||
} |
|||
/// <summary>
|
|||
/// 判断预警是否接触
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
public bool IsTimeOut() |
|||
{ |
|||
DateTime now = new DateTime(); |
|||
double difSeconds = DateUnit.DateDiffSeconds(upDateTime, now); |
|||
return difSeconds > 30; |
|||
} |
|||
internal string RtspURL() |
|||
{ |
|||
return Camera.RtspURL(); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace ECMonitor.Code |
|||
{ |
|||
/// <summary>
|
|||
/// 静态变量类
|
|||
/// </summary>
|
|||
public class StaticData |
|||
{ |
|||
/// <summary>
|
|||
/// 选中的播放器的IP
|
|||
/// </summary>
|
|||
public static string MainPlayerIp { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,115 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using System.Windows.Forms; |
|||
|
|||
namespace ECMonitor.Code.SysemNotifyIcon |
|||
{ |
|||
public class WPFSystemTray |
|||
{ |
|||
/// <summary>
|
|||
/// 设置系统托盘
|
|||
/// </summary>
|
|||
/// <param name="pars">最小化参数</param>
|
|||
/// <param name="dbClick"></param>
|
|||
/// <returns></returns>
|
|||
public static NotifyIcon SetSystemTray(SystemTrayParameter pars, List<SystemTrayMenu> menuList) |
|||
{ |
|||
NotifyIcon notifyIcon = new NotifyIcon(); |
|||
notifyIcon.Visible = true; |
|||
if (!string.IsNullOrWhiteSpace(pars.Icon)) |
|||
{ |
|||
notifyIcon.Icon = new System.Drawing.Icon(pars.Icon);//程序图标
|
|||
} |
|||
if (!string.IsNullOrWhiteSpace(pars.MinText)) |
|||
{ |
|||
notifyIcon.Text = pars.MinText;//最小化到托盘时,鼠标悬浮时显示的文字
|
|||
} |
|||
if (!string.IsNullOrWhiteSpace(pars.TipText)) |
|||
{ |
|||
notifyIcon.BalloonTipText = pars.TipText; //设置系统托盘启动时显示的文本
|
|||
notifyIcon.ShowBalloonTip(pars.Time == 0 ? 100 : pars.Time);//显示时长
|
|||
} |
|||
notifyIcon.MouseDoubleClick += pars.dbClick; //双击事件
|
|||
notifyIcon.ContextMenuStrip = GetMenuStrip(menuList); |
|||
return notifyIcon; |
|||
} |
|||
/// <summary>
|
|||
/// 设置系统托盘的菜单属性
|
|||
/// </summary>
|
|||
/// <param name="menus"></param>
|
|||
/// <returns></returns>
|
|||
static ContextMenuStrip GetMenuStrip(List<SystemTrayMenu> menus) |
|||
{ |
|||
ContextMenuStrip menu = new ContextMenuStrip(); |
|||
ToolStripMenuItem[] menuArray = new ToolStripMenuItem[menus.Count]; |
|||
int i = 0; |
|||
foreach (SystemTrayMenu item in menus) |
|||
{ |
|||
ToolStripMenuItem menuItem = new ToolStripMenuItem(); |
|||
menuItem.Text = item.Txt; |
|||
menuItem.Click += item.Click; |
|||
if (!string.IsNullOrWhiteSpace(item.Icon) && System.IO.File.Exists(item.Icon)) { menuItem.Image = System.Drawing.Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + item.Icon); } |
|||
menuArray[i++] = menuItem; |
|||
} |
|||
menu.Items.AddRange(menuArray); |
|||
return menu; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 系统托盘参数
|
|||
/// </summary>
|
|||
public class SystemTrayParameter |
|||
{ |
|||
public SystemTrayParameter(string Icon, string MinText, string TipText, int Time, MouseEventHandler dbClick) |
|||
{ |
|||
this.Icon = Icon; |
|||
this.MinText = MinText; |
|||
this.TipText = TipText; |
|||
this.Time = Time; |
|||
this.dbClick = dbClick; |
|||
} |
|||
/// <summary>
|
|||
/// 托盘显示图标
|
|||
/// </summary>
|
|||
public string Icon { get; set; } |
|||
/// <summary>
|
|||
/// 最小化悬浮时文本
|
|||
/// </summary>
|
|||
public string MinText { get; set; } |
|||
/// <summary>
|
|||
/// 最小化启动时文本
|
|||
/// </summary>
|
|||
public string TipText { get; set; } |
|||
/// <summary>
|
|||
/// 最小化启动时文本显示时长
|
|||
/// </summary>
|
|||
public int Time { get; set; } |
|||
/// <summary>
|
|||
/// 最小化双击事件
|
|||
/// </summary>
|
|||
public MouseEventHandler dbClick { get; set; } |
|||
} |
|||
/// <summary>
|
|||
/// 右键菜单
|
|||
/// </summary>
|
|||
public class SystemTrayMenu |
|||
{ |
|||
/// <summary>
|
|||
/// 菜单文本
|
|||
/// </summary>
|
|||
public string Txt { get; set; } |
|||
/// <summary>
|
|||
/// 菜单图标
|
|||
/// </summary>
|
|||
public string Icon { get; set; } |
|||
/// <summary>
|
|||
/// 菜单单击事件
|
|||
/// </summary>
|
|||
public EventHandler Click { get; set; } |
|||
} |
|||
|
|||
} |
@ -0,0 +1,161 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> |
|||
|
|||
<PropertyGroup> |
|||
<OutputType>WinExe</OutputType> |
|||
<TargetFramework>net5.0-windows</TargetFramework> |
|||
<UseWPF>true</UseWPF> |
|||
</PropertyGroup> |
|||
|
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> |
|||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<Compile Remove="Code\Interfaces\**" /> |
|||
<Compile Remove="Sets\**" /> |
|||
<EmbeddedResource Remove="Code\Interfaces\**" /> |
|||
<EmbeddedResource Remove="Sets\**" /> |
|||
<None Remove="Code\Interfaces\**" /> |
|||
<None Remove="Sets\**" /> |
|||
<Page Remove="Code\Interfaces\**" /> |
|||
<Page Remove="Sets\**" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Compile Remove="Code\DB\RequestModel.cs" /> |
|||
<Compile Remove="UC\Videos\UCFFmpegAIBoxPlayer.xaml.cs" /> |
|||
<Compile Remove="UC\Videos\UCRtspVlcVideo.xaml.cs" /> |
|||
<Compile Remove="Views\RtspMonitor.xaml.cs" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<None Remove="camera1.png" /> |
|||
<None Remove="close.png" /> |
|||
<None Remove="login.png" /> |
|||
<None Remove="logon.png" /> |
|||
<None Remove="max2.png" /> |
|||
<None Remove="min1.png" /> |
|||
<None Remove="PlayerDraw\close.png" /> |
|||
<None Remove="PlayerDraw\保存.png" /> |
|||
<None Remove="PlayerDraw\删 除 .png" /> |
|||
<None Remove="PlayerDraw\删除 关闭 叉.png" /> |
|||
<None Remove="PlayerDraw\选取.png" /> |
|||
<None Remove="set1.png" /> |
|||
<None Remove="top.png" /> |
|||
<None Remove="topbar.png" /> |
|||
<None Remove="UC\Videos\pen.png" /> |
|||
<None Remove="UC\Videos\画板 10 副本 48.png" /> |
|||
<None Remove="UC\Videos\设计_画图.png" /> |
|||
<None Remove="Views\报警 %281%29.png" /> |
|||
<None Remove="zgx.ico" /> |
|||
<None Remove="报警.png" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Page Remove="UC\Videos\UCFFmpegAIBoxPlayer.xaml" /> |
|||
<Page Remove="UC\Videos\UCRtspVlcVideo.xaml" /> |
|||
<Page Remove="Views\RtspMonitor.xaml" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="FFmpeg.AutoGen" Version="4.4.0" /> |
|||
<PackageReference Include="Fleck" Version="1.2.0" /> |
|||
<PackageReference Include="LibVLCSharp" Version="3.5.1" /> |
|||
<PackageReference Include="LibVLCSharp.WPF" Version="3.5.1" /> |
|||
<PackageReference Include="MaterialDesignColors" Version="2.0.1" /> |
|||
<PackageReference Include="MaterialDesignThemes" Version="4.1.0" /> |
|||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="5.0.0" /> |
|||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" /> |
|||
<PackageReference Include="Prism.Unity" Version="8.1.97" /> |
|||
<PackageReference Include="Prism.Wpf" Version="8.1.97" /> |
|||
<PackageReference Include="ShowMeTheXAML" Version="2.0.0" /> |
|||
<PackageReference Include="ShowMeTheXAML.AvalonEdit" Version="2.0.0" /> |
|||
<PackageReference Include="ShowMeTheXAML.MSBuild" Version="2.0.0" /> |
|||
<PackageReference Include="System.Collections.NonGeneric" Version="4.3.0" /> |
|||
<PackageReference Include="System.Drawing.Common" Version="5.0.2" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\EC.Entity\EC.Entity.csproj" /> |
|||
<ProjectReference Include="..\EC.Service\EC.Service.csproj" /> |
|||
<ProjectReference Include="..\EC.UsingEventAggregator\EC.UsingEventAggregator.csproj" /> |
|||
<ProjectReference Include="..\公共库\EC.Onvif\EC.Onvif.csproj" /> |
|||
<ProjectReference Include="..\播放库\EC.FFmpegAutoGen\EC.FFmpegAutoGen.csproj" /> |
|||
<ProjectReference Include="..\播放库\HKPlayers\HKPlayers.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Resource Include="camera1.png" /> |
|||
<Resource Include="close.png" /> |
|||
<Resource Include="login.png" /> |
|||
<Resource Include="logon.png" /> |
|||
<Resource Include="max2.png" /> |
|||
<Resource Include="min1.png" /> |
|||
<Resource Include="PlayerDraw\close.png" /> |
|||
<Resource Include="PlayerDraw\保存.png" /> |
|||
<Resource Include="PlayerDraw\删 除 .png" /> |
|||
<Resource Include="PlayerDraw\删除 关闭 叉.png" /> |
|||
<Resource Include="PlayerDraw\选取.png" /> |
|||
<Resource Include="Resources\Images\zgx.ico" /> |
|||
<Resource Include="Resources\Images\报警.png" /> |
|||
<Resource Include="set1.png" /> |
|||
<Resource Include="top.png" /> |
|||
<Resource Include="topbar.png" /> |
|||
<Resource Include="UC\Videos\pen.png" /> |
|||
<Resource Include="UC\Videos\画板 10 副本 48.png" /> |
|||
<Resource Include="UC\Videos\设计_画图.png" /> |
|||
<Resource Include="Views\报警 (1).png" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Compile Update="Properties\Resources.Designer.cs"> |
|||
<DesignTime>True</DesignTime> |
|||
<AutoGen>True</AutoGen> |
|||
<DependentUpon>Resources.resx</DependentUpon> |
|||
</Compile> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<EmbeddedResource Update="Properties\Resources.resx"> |
|||
<Generator>ResXFileCodeGenerator</Generator> |
|||
<LastGenOutput>Resources.Designer.cs</LastGenOutput> |
|||
</EmbeddedResource> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Page Update="Page\Test\Main.xaml"> |
|||
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime> |
|||
</Page> |
|||
<Page Update="Resources\Themes\Themes.xaml"> |
|||
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime> |
|||
<SubType>Designer</SubType> |
|||
</Page> |
|||
<Page Update="UC\Videos\UCAIFilePlayer.xaml"> |
|||
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime> |
|||
<SubType>Designer</SubType> |
|||
</Page> |
|||
<Page Update="UC\Videos\UCAIWarningPlayer.xaml"> |
|||
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime> |
|||
</Page> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<None Update="appsettings.json"> |
|||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> |
|||
</None> |
|||
<None Update="db\CameraInfo.db"> |
|||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> |
|||
</None> |
|||
</ItemGroup> |
|||
|
|||
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> |
|||
|
|||
</Target> |
|||
|
|||
<ProjectExtensions><VisualStudio><UserProperties /></VisualStudio></ProjectExtensions> |
|||
|
|||
<Target Name="PreBuild" BeforeTargets="PreBuildEvent"> |
|||
<Exec Command="Copy $(ProjectDir)appsettings.json $(OutDir)appsettings.json" /> |
|||
</Target> |
|||
|
|||
</Project> |
@ -0,0 +1,81 @@ |
|||
using System; |
|||
using System.Windows.Input; |
|||
|
|||
namespace ECMonitor.MVVM |
|||
{ |
|||
public class ExtendCommand<T> : ICommand |
|||
{ |
|||
/// <summary>
|
|||
/// 检查命令是否可以执行的事件,在UI事件发生导致控件状态或数据发生变化时触发
|
|||
/// </summary>
|
|||
public event EventHandler CanExecuteChanged |
|||
{ |
|||
add |
|||
{ |
|||
if (_canExecute != null) |
|||
{ |
|||
CommandManager.RequerySuggested += value; |
|||
} |
|||
} |
|||
remove |
|||
{ |
|||
if (_canExecute != null) |
|||
{ |
|||
CommandManager.RequerySuggested -= value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 判断命令是否可以执行的方法
|
|||
/// </summary>
|
|||
private Func<T, bool> _canExecute; |
|||
|
|||
/// <summary>
|
|||
/// 命令需要执行的方法
|
|||
/// </summary>
|
|||
private Action<T> _execute; |
|||
|
|||
/// <summary>
|
|||
/// 创建一个命令
|
|||
/// </summary>
|
|||
/// <param name="execute">命令要执行的方法</param>
|
|||
public ExtendCommand(Action<T> execute) : this(execute, null) |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 创建一个命令
|
|||
/// </summary>
|
|||
/// <param name="execute">命令要执行的方法</param>
|
|||
/// <param name="canExecute">判断命令是否能够执行的方法</param>
|
|||
public ExtendCommand(Action<T> execute, Func<T, bool> canExecute) |
|||
{ |
|||
_execute = execute; |
|||
_canExecute = canExecute; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 判断命令是否可以执行
|
|||
/// </summary>
|
|||
/// <param name="parameter">命令传入的参数</param>
|
|||
/// <returns>是否可以执行</returns>
|
|||
public bool CanExecute(object parameter) |
|||
{ |
|||
if (_canExecute == null) return true; |
|||
return _canExecute((T)parameter); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 执行命令
|
|||
/// </summary>
|
|||
/// <param name="parameter"></param>
|
|||
public void Execute(object parameter) |
|||
{ |
|||
if (_execute != null && CanExecute(parameter)) |
|||
{ |
|||
_execute((T)parameter); |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,45 @@ |
|||
using Microsoft.Xaml.Behaviors; |
|||
using System.Windows; |
|||
using System.Windows.Input; |
|||
|
|||
namespace ECMonitor.MVVM |
|||
{ |
|||
public class ExtendEventCommand : TriggerAction<DependencyObject> |
|||
{ |
|||
/// <summary>
|
|||
/// 事件要绑定的命令
|
|||
/// </summary>
|
|||
public ICommand Command |
|||
{ |
|||
get { return (ICommand)GetValue(CommandProperty); } |
|||
set { SetValue(CommandProperty, value); } |
|||
} |
|||
|
|||
// Using a DependencyProperty as the backing store for MsgName. This enables animation, styling, binding, etc...
|
|||
public static readonly DependencyProperty CommandProperty = |
|||
DependencyProperty.Register("Command", typeof(ICommand), typeof(ExtendEventCommand), new PropertyMetadata(null)); |
|||
|
|||
/// <summary>
|
|||
/// 绑定命令的参数,保持为空就是事件的参数
|
|||
/// </summary>
|
|||
public object CommandParateter |
|||
{ |
|||
get { return (object)GetValue(CommandParateterProperty); } |
|||
set { SetValue(CommandParateterProperty, value); } |
|||
} |
|||
|
|||
// Using a DependencyProperty as the backing store for CommandParateter. This enables animation, styling, binding, etc...
|
|||
public static readonly DependencyProperty CommandParateterProperty = |
|||
DependencyProperty.Register("CommandParateter", typeof(object), typeof(ExtendEventCommand), new PropertyMetadata(null)); |
|||
|
|||
//执行事件
|
|||
protected override void Invoke(object parameter) |
|||
{ |
|||
if (CommandParateter != null) |
|||
parameter = CommandParateter; |
|||
var cmd = Command; |
|||
if (cmd != null) |
|||
cmd.Execute(parameter); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,87 @@ |
|||
using System.Windows; |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.MVVM |
|||
{ |
|||
public static class PasswordBoxHelper |
|||
{ |
|||
public static readonly DependencyProperty PasswordProperty = |
|||
DependencyProperty.RegisterAttached("Password", |
|||
typeof(string), typeof(PasswordBoxHelper), |
|||
new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged)); |
|||
|
|||
public static readonly DependencyProperty AttachProperty = |
|||
DependencyProperty.RegisterAttached("Attach", |
|||
typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(false, Attach)); |
|||
|
|||
private static readonly DependencyProperty IsUpdatingProperty = |
|||
DependencyProperty.RegisterAttached("IsUpdating", typeof(bool), |
|||
typeof(PasswordBoxHelper)); |
|||
|
|||
public static void SetAttach(DependencyObject dp, bool value) |
|||
{ |
|||
dp.SetValue(AttachProperty, value); |
|||
} |
|||
|
|||
public static bool GetAttach(DependencyObject dp) |
|||
{ |
|||
return (bool)dp.GetValue(AttachProperty); |
|||
} |
|||
|
|||
public static string GetPassword(DependencyObject dp) |
|||
{ |
|||
return (string)dp.GetValue(PasswordProperty); |
|||
} |
|||
|
|||
public static void SetPassword(DependencyObject dp, string value) |
|||
{ |
|||
dp.SetValue(PasswordProperty, value); |
|||
} |
|||
|
|||
private static bool GetIsUpdating(DependencyObject dp) |
|||
{ |
|||
return (bool)dp.GetValue(IsUpdatingProperty); |
|||
} |
|||
|
|||
private static void SetIsUpdating(DependencyObject dp, bool value) |
|||
{ |
|||
dp.SetValue(IsUpdatingProperty, value); |
|||
} |
|||
|
|||
private static void OnPasswordPropertyChanged(DependencyObject sender, |
|||
DependencyPropertyChangedEventArgs e) |
|||
{ |
|||
PasswordBox passwordBox = sender as PasswordBox; |
|||
passwordBox.PasswordChanged -= PasswordChanged; |
|||
if (!(bool)GetIsUpdating(passwordBox)) |
|||
{ |
|||
passwordBox.Password = (string)e.NewValue; |
|||
} |
|||
passwordBox.PasswordChanged += PasswordChanged; |
|||
} |
|||
|
|||
private static void Attach(DependencyObject sender, |
|||
DependencyPropertyChangedEventArgs e) |
|||
{ |
|||
PasswordBox passwordBox = sender as PasswordBox; |
|||
if (passwordBox == null) |
|||
return; |
|||
if ((bool)e.OldValue) |
|||
{ |
|||
passwordBox.PasswordChanged -= PasswordChanged; |
|||
} |
|||
if ((bool)e.NewValue) |
|||
{ |
|||
passwordBox.PasswordChanged += PasswordChanged; |
|||
} |
|||
} |
|||
|
|||
private static void PasswordChanged(object sender, RoutedEventArgs e) |
|||
{ |
|||
PasswordBox passwordBox = sender as PasswordBox; |
|||
SetIsUpdating(passwordBox, true); |
|||
SetPassword(passwordBox, passwordBox.Password); |
|||
SetIsUpdating(passwordBox, false); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,6 @@ |
|||
namespace ECMonitor.MVVM |
|||
{ |
|||
internal class VerifyExceptionBehavior |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,64 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Globalization; |
|||
using System.Windows.Controls; |
|||
using System.Windows.Data; |
|||
|
|||
namespace ECMonitor.MVVM |
|||
{ |
|||
public class VerifyRule : ValidationRule |
|||
{ |
|||
public VerifyRuleType Type { get; set; } = VerifyRuleType.Unknown; |
|||
|
|||
public List<object> WhatList { get; set; } |
|||
|
|||
public override ValidationResult Validate(object value, CultureInfo cultureInfo) |
|||
{ |
|||
string strVal = value != null ? (string)value : string.Empty; |
|||
ValidationResult vRet = Type switch |
|||
{ |
|||
VerifyRuleType.NotEmpty => VerifyNotEmpty(strVal), |
|||
VerifyRuleType.IP => VerifyIP(strVal), |
|||
VerifyRuleType.Unknown => VerifyUnkown(strVal), |
|||
VerifyRuleType.Temp => VerifyTemp(strVal), |
|||
_ => VerifyUnkown(strVal), |
|||
}; |
|||
|
|||
WhatList = new(); |
|||
WhatList.Add(new { Type, vRet.IsValid, value, strVal, vRet }); |
|||
return vRet; |
|||
} |
|||
|
|||
#region Verify Region
|
|||
|
|||
private static ValidationResult VerifyNotEmpty(string value) |
|||
{ |
|||
bool ret = !string.IsNullOrWhiteSpace(value); |
|||
string errMsg = "不能为空!"; |
|||
return ret ? ValidationResult.ValidResult : new ValidationResult(false, errMsg); |
|||
} |
|||
|
|||
private static ValidationResult VerifyIP(string value) |
|||
{ |
|||
bool ret = VerifyUnit.CheckIp(value); |
|||
string errMsg = "IP格式错误!"; |
|||
return ret ? ValidationResult.ValidResult : new ValidationResult(false, errMsg); |
|||
} |
|||
|
|||
private static ValidationResult VerifyTemp(string value) |
|||
{ |
|||
bool ret = !string.IsNullOrWhiteSpace(value); |
|||
string errMsg = "临时错误!"; |
|||
return ret ? ValidationResult.ValidResult : new ValidationResult(false, errMsg); |
|||
} |
|||
|
|||
private static ValidationResult VerifyUnkown(string value) |
|||
{ |
|||
bool ret = false; |
|||
string errMsg = "未知错误!"; |
|||
return ret ? ValidationResult.ValidResult : new ValidationResult(false, errMsg); |
|||
} |
|||
|
|||
#endregion Verify Region
|
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
using System.ComponentModel; |
|||
|
|||
namespace ECMonitor.MVVM |
|||
{ |
|||
public enum VerifyRuleType |
|||
{ |
|||
[Description("Temp")] |
|||
Temp = -2, |
|||
|
|||
[Description("Unknown")] |
|||
Unknown = -1, |
|||
|
|||
[Description("NotEmpty")] |
|||
NotEmpty = 1, |
|||
|
|||
[Description("IP")] |
|||
IP = 2, |
|||
} |
|||
} |
@ -0,0 +1,50 @@ |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.MVVM |
|||
{ |
|||
public class WPFAssist |
|||
{ |
|||
/// <summary>
|
|||
/// 获取DataGrid的所有行是否存在验证错误。
|
|||
/// </summary>
|
|||
/// <param name="dg">要检查的DataGrid实例</param>
|
|||
/// <returns>true 有错,false 无错</returns>
|
|||
public static bool GetDataGridRowsHasError(DataGrid dg) |
|||
{ |
|||
bool hasError = false; |
|||
ValidationError err = null; |
|||
for (int i = 0; i < dg.Items.Count; i++) |
|||
{ |
|||
DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(i); |
|||
hasError = Validation.GetHasError(row); |
|||
if (hasError) |
|||
{ |
|||
break; |
|||
} |
|||
} |
|||
return hasError; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 获取DataGrid的第一个被发现的验证错误结果。
|
|||
/// </summary>
|
|||
/// <param name="dg">被检查的DataGrid实例。</param>
|
|||
/// <returns>错误结果。</returns>
|
|||
public static ValidationError GetDataGridRowsFirstError(DataGrid dg) |
|||
{ |
|||
bool hasError = false; |
|||
ValidationError err = null; |
|||
for (int i = 0; i < dg.Items.Count; i++) |
|||
{ |
|||
DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(i); |
|||
hasError = Validation.GetHasError(row); |
|||
if (hasError) |
|||
{ |
|||
err = Validation.GetErrors(row)[0]; |
|||
break; |
|||
} |
|||
} |
|||
return err; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,154 @@ |
|||
<Window x:Class="ECMonitor.MainWindow" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" |
|||
xmlns:prism="http://prismlibrary.com/" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:i="http://schemas.microsoft.com/xaml/behaviors" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
xmlns:names="clr-namespace:ECMonitor.Page.Name" |
|||
prism:ViewModelLocator.AutoWireViewModel="True" |
|||
mc:Ignorable="d" |
|||
x:Name="mainWindow" |
|||
Title="视频监控" Height="800" Width="1080" Icon="/resources/Images/zgx.ico" WindowStyle="None" WindowStartupLocation="CenterScreen" WindowState="Maximized"> |
|||
|
|||
<i:Interaction.Triggers> |
|||
<i:EventTrigger EventName="Loaded"> |
|||
<i:InvokeCommandAction Command="{Binding LoadCommand}" CommandParameter="{Binding ElementName=mainWindow}" /> |
|||
</i:EventTrigger> |
|||
</i:Interaction.Triggers> |
|||
|
|||
<materialDesign:DialogHost Identifier="RootDialog" |
|||
DialogTheme="Inherit" SnackbarMessageQueue="{Binding ElementName=MainSnackbar, Path=MessageQueue}"> |
|||
|
|||
<Grid Background="{DynamicResource PrimaryBodyBrush}"> |
|||
|
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height="58*" /> |
|||
<RowDefinition Height="1000*" /> |
|||
</Grid.RowDefinitions> |
|||
|
|||
<DockPanel Grid.Row="0" MouseMove="DockPanel_MouseMove"> |
|||
<DockPanel.Background> |
|||
<ImageBrush ImageSource="/topbar.png" TileMode="Tile" Stretch="UniformToFill" /> |
|||
</DockPanel.Background> |
|||
<DockPanel DockPanel.Dock="Left" Width="400"> |
|||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> |
|||
<Image Source="/logon.png" ></Image> |
|||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> |
|||
<TextBlock |
|||
HorizontalAlignment="left" |
|||
VerticalAlignment="Center" |
|||
FontSize="15" |
|||
Margin="10 0 0 0" |
|||
|
|||
Text="{Binding Title}" /> |
|||
</StackPanel> |
|||
</StackPanel> |
|||
</DockPanel> |
|||
<DockPanel DockPanel.Dock="Top" Height="18"> |
|||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> |
|||
<Button Name="btnMin" Style="{DynamicResource TopRightButtonStyle}" Margin="0,0,10,0" Click="btnMin_Click"> |
|||
<WrapPanel> |
|||
<Image Source="/min1.png" /> |
|||
</WrapPanel> |
|||
</Button> |
|||
|
|||
<Button Name="btnMax" Style="{DynamicResource TopRightButtonStyle}" Margin="0,0,10,0" Click="btnMax_Click"> |
|||
<WrapPanel> |
|||
<Image Source="/max2.png" Width="10" /> |
|||
</WrapPanel> |
|||
</Button> |
|||
|
|||
<Button Name="btnClose" Style="{DynamicResource TopRightButtonStyle}" Margin="0,0,10,0" Click="btnClose_Click"> |
|||
<WrapPanel> |
|||
<Image Source="/close.png" /> |
|||
</WrapPanel> |
|||
</Button> |
|||
</StackPanel> |
|||
</DockPanel> |
|||
<StackPanel Orientation="Horizontal"> |
|||
<ToggleButton |
|||
x:Name="MenuToggleButton" |
|||
Style="{StaticResource MaterialDesignHamburgerToggleButton}" |
|||
IsChecked="False" |
|||
Command="{Binding ShowLeftDock}" |
|||
Width="24" |
|||
Height="24" |
|||
AutomationProperties.Name="HamburgerToggleButton" /> |
|||
</StackPanel> |
|||
<StackPanel Orientation="Horizontal" DockPanel.Dock="Right" HorizontalAlignment="Right"> |
|||
<Button |
|||
Name="btnVodieo" |
|||
Command="{Binding NavigateCommand}" CommandParameter="{x:Static names:ViewsName.CameraMonitorMain}" |
|||
Click="btnVodieo_Click" |
|||
Style="{StaticResource MaterialDesignRaisedDarkButton}" |
|||
Background="#4c8bb7" |
|||
BorderBrush="Transparent" |
|||
materialDesign:ButtonAssist.CornerRadius="15" |
|||
IsEnabled="{Binding DataContext.ControlsEnabled, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Cursor="Hand"> |
|||
<WrapPanel> |
|||
<Image Source="/camera1.png" Style="{DynamicResource TopButtonImgStyle}" /> |
|||
<TextBlock Text="视频监控" VerticalAlignment="Center" Margin="6,0,0,0" /> |
|||
</WrapPanel> |
|||
</Button> |
|||
<Button |
|||
Name="btnSet" |
|||
Command="{Binding NavigateCommand}" CommandParameter="{x:Static names:ViewsName.SystemSetMain}" |
|||
Style="{StaticResource MaterialDesignRaisedDarkButton}" |
|||
Background="Transparent" |
|||
BorderBrush="Transparent" |
|||
materialDesign:ButtonAssist.CornerRadius="15" |
|||
IsEnabled="{Binding DataContext.ControlsEnabled, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Click="btnSet_Click" Cursor="Hand"> |
|||
<WrapPanel> |
|||
<Image Source="/set1.png" Width="15" /> |
|||
<TextBlock Text="系统设置" VerticalAlignment="Center" Margin="6,0,0,0" /> |
|||
</WrapPanel> |
|||
</Button> |
|||
|
|||
<materialDesign:PopupBox |
|||
DockPanel.Dock="Right" |
|||
PlacementMode="BottomAndAlignRightEdges" |
|||
StaysOpen="False"> |
|||
|
|||
<StackPanel> |
|||
<Grid Margin="10"> |
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width="Auto" /> |
|||
<ColumnDefinition Width="Auto" /> |
|||
<ColumnDefinition Width="Auto" /> |
|||
</Grid.ColumnDefinitions> |
|||
<Grid.RowDefinitions> |
|||
<RowDefinition /> |
|||
<RowDefinition /> |
|||
</Grid.RowDefinitions> |
|||
<TextBlock |
|||
Text="Light" |
|||
Margin="0 0 10 0" /> |
|||
<ToggleButton |
|||
x:Name="DarkModeToggleButton" |
|||
|
|||
Grid.Column="1" /> |
|||
<TextBlock |
|||
Text="Dark" |
|||
Margin="10 0 0 0" |
|||
Grid.Column="2" /> |
|||
<TextBlock |
|||
Text="Enabled" |
|||
Margin="0 10 10 0" |
|||
Grid.Row="1" /> |
|||
</Grid> |
|||
</StackPanel> |
|||
</materialDesign:PopupBox> |
|||
</StackPanel> |
|||
</DockPanel> |
|||
|
|||
<ContentControl Grid.Row="1" prism:RegionManager.RegionName="{x:Static names:RegionsName.MainWindowCenter}" /> |
|||
|
|||
<materialDesign:Snackbar |
|||
x:Name="MainSnackbar" |
|||
MessageQueue="{materialDesign:MessageQueue}" |
|||
Grid.Row="1" /> |
|||
</Grid> |
|||
</materialDesign:DialogHost> |
|||
</Window> |
@ -0,0 +1,263 @@ |
|||
using EC.UsingEventAggregator; |
|||
using EC.Utils; |
|||
using ECMonitor.Code.SysemNotifyIcon; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.ComponentModel; |
|||
|
|||
//using System.Drawing;
|
|||
using System.Windows; |
|||
using System.Windows.Input; |
|||
using System.Windows.Media; |
|||
|
|||
namespace ECMonitor |
|||
{ |
|||
/// <summary>
|
|||
/// Interaction logic for MainWindow.xaml
|
|||
/// </summary>
|
|||
public partial class MainWindow : Window |
|||
{ |
|||
private IRegionManager _regionManager; |
|||
private IEventAggregator _ea; |
|||
|
|||
public MainWindow(IRegionManager regionManager, IEventAggregator ea) |
|||
{ |
|||
_regionManager = regionManager; |
|||
_ea = ea; |
|||
this.ResizeMode = ResizeMode.CanMinimize; |
|||
|
|||
InitializeComponent(); |
|||
|
|||
//var paletteHelper = new PaletteHelper();
|
|||
//var theme = paletteHelper.GetTheme();
|
|||
//theme.SetBaseTheme(Theme.Dark);
|
|||
//paletteHelper.SetTheme(theme);
|
|||
|
|||
//系统托盘
|
|||
SystemTrayParameter pars = new SystemTrayParameter("zgx.ico", "守护中", "", 0, notifyIcon_MouseDoubleClick); |
|||
this.notifyIcon = WPFSystemTray.SetSystemTray(pars, GetList()); |
|||
|
|||
_ea.GetEvent<ShowMessageSentEvent>().Subscribe(MessageReceived); |
|||
FLogger.SubLog += SubShowMessage; |
|||
FLogger.SubLog += SaveLog; |
|||
} |
|||
|
|||
#region PageEvent
|
|||
|
|||
/// <summary>
|
|||
/// 引发窗口关闭前响应,可阻止系统关闭
|
|||
/// </summary>
|
|||
/// <param name="e"></param>
|
|||
protected override void OnClosing(CancelEventArgs e) |
|||
{ |
|||
if (!EXIT_APP) |
|||
{ |
|||
e.Cancel = true; |
|||
this.ShowInTaskbar = false; |
|||
HideWindow(); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 窗口关闭前响应,不可阻止系统关闭
|
|||
/// </summary>
|
|||
/// <param name="e"></param>
|
|||
protected override void OnClosed(EventArgs e) |
|||
{ |
|||
base.OnClosed(e); |
|||
//关闭系统托盘
|
|||
notifyIcon.Dispose(); |
|||
} |
|||
|
|||
#endregion PageEvent
|
|||
|
|||
#region 系统托盘
|
|||
|
|||
private bool EXIT_APP = false; |
|||
private System.Windows.Forms.NotifyIcon notifyIcon; |
|||
|
|||
//托盘右键菜单集合
|
|||
private List<SystemTrayMenu> GetList() |
|||
{ |
|||
List<SystemTrayMenu> ls = new List<SystemTrayMenu>(); |
|||
ls.Add(new SystemTrayMenu() { Txt = "打开主面板", Icon = "", Click = mainWin_Click }); |
|||
ls.Add(new SystemTrayMenu() { Txt = "退出", Icon = "/img/exit.png", Click = Exit_Click }); |
|||
return ls; |
|||
} |
|||
|
|||
//双击事件
|
|||
private void notifyIcon_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e) |
|||
{ |
|||
ShowWindow(); |
|||
} |
|||
|
|||
#region 托盘右键菜单
|
|||
|
|||
//打开主面板
|
|||
private void mainWin_Click(object sender, EventArgs e) |
|||
{ |
|||
ShowWindow(); |
|||
} |
|||
|
|||
//退出
|
|||
private void Exit_Click(object sender, EventArgs e) |
|||
{ |
|||
EXIT_APP = true; |
|||
|
|||
this.Close(); |
|||
//System.Windows.Forms.Application.ExitThread();
|
|||
Environment.Exit(0); |
|||
// System.Windows.Application.Current.Shutdown();
|
|||
} |
|||
|
|||
public void ShowWindow() |
|||
{ |
|||
this.Dispatcher.Invoke(new Action(() => |
|||
{ |
|||
if (this.WindowState == WindowState.Minimized) |
|||
{ |
|||
this.WindowState = WindowState.Normal; |
|||
} |
|||
this.ShowInTaskbar = true; |
|||
this.Show(); |
|||
this.Activate(); |
|||
})); |
|||
} |
|||
|
|||
private void HideWindow() |
|||
{ |
|||
//this.WindowState = WindowState.Minimized;
|
|||
|
|||
this.Hide(); |
|||
this.notifyIcon.ShowBalloonTip(3000, "", "程序在后台运行中,双击图标打开", System.Windows.Forms.ToolTipIcon.None); //弹出气泡提示
|
|||
} |
|||
|
|||
#endregion 托盘右键菜单
|
|||
|
|||
#endregion 系统托盘
|
|||
|
|||
#region 系统按钮
|
|||
|
|||
private void btnClose_Click(object sender, RoutedEventArgs e) |
|||
{ |
|||
this.Close(); |
|||
// Exit_Click(sender, e);
|
|||
} |
|||
|
|||
private void SetFormSize() |
|||
{ |
|||
double x1 = SystemParameters.PrimaryScreenWidth;//得到屏幕整体宽度
|
|||
double y1 = SystemParameters.PrimaryScreenHeight;//得到屏幕整体高度
|
|||
double xy = x1 + y1; |
|||
x1 = x1 * 0.9; |
|||
y1 = y1 * 0.9; |
|||
this.Width = x1; |
|||
this.Height = y1; |
|||
} |
|||
|
|||
private void btnMax_Click(object sender, RoutedEventArgs e) |
|||
{ |
|||
if (this.WindowState == WindowState.Maximized) |
|||
{ |
|||
this.WindowState = WindowState.Normal; |
|||
} |
|||
else |
|||
{ |
|||
this.WindowState = WindowState.Maximized; |
|||
} |
|||
} |
|||
|
|||
private void btnMin_Click(object sender, RoutedEventArgs e) |
|||
{ |
|||
this.WindowState = WindowState.Minimized; |
|||
} |
|||
|
|||
private void DockPanel_MouseMove(object sender, MouseEventArgs e) |
|||
{ |
|||
if (e.LeftButton == MouseButtonState.Pressed) |
|||
{ |
|||
this.DragMove(); |
|||
} |
|||
} |
|||
|
|||
#endregion 系统按钮
|
|||
|
|||
#region top 按钮颜色
|
|||
|
|||
private SolidColorBrush barkgroudcolor = new SolidColorBrush(Color.FromRgb(0x4c, 0x8b, 0xb7)); |
|||
|
|||
private void btnVodieo_Click(object sender, RoutedEventArgs e) |
|||
{ |
|||
btnVodieo.Background = barkgroudcolor; |
|||
btnSet.Background = Brushes.Transparent; |
|||
} |
|||
|
|||
private void btnSet_Click(object sender, RoutedEventArgs e) |
|||
{ |
|||
btnVodieo.Background = Brushes.Transparent; |
|||
btnSet.Background = barkgroudcolor; |
|||
} |
|||
|
|||
#endregion top 按钮颜色
|
|||
|
|||
#region 统一底部 弹窗提示
|
|||
|
|||
public void MessageReceived(LogModel log) |
|||
{ |
|||
MainSnackbar.MessageQueue?.Enqueue(log.message); |
|||
} |
|||
|
|||
//public async Task<object> MessageTips(string message)
|
|||
//{
|
|||
// var sampleMessageDialog = new SampleMessageDialog
|
|||
// {
|
|||
// Message = { Text = message }
|
|||
// };
|
|||
// return await DialogHost.Show(sampleMessageDialog, "RootDialog");
|
|||
//}
|
|||
|
|||
#endregion 统一底部 弹窗提示
|
|||
|
|||
#region 公共 基础函数
|
|||
|
|||
private int linenumber = 0; |
|||
|
|||
private void SubShowMessage(MyLogger log) |
|||
{ |
|||
if (log.Level >= (LoggerLevel)0) |
|||
{ |
|||
linenumber++; |
|||
this.Dispatcher.Invoke(new Action(() => |
|||
{ |
|||
if (linenumber > 500) |
|||
{ |
|||
//richText.Document.Blocks.Clear();
|
|||
} |
|||
// richText.AppendText(log.Message + '\n');
|
|||
})); |
|||
} |
|||
} |
|||
|
|||
private void SaveLog(MyLogger log) |
|||
{ |
|||
switch (log.Level) |
|||
{ |
|||
case LoggerLevel.Debug: |
|||
LogFactory.GetLogger().Debug(log.Message); |
|||
break; |
|||
|
|||
case LoggerLevel.Info: |
|||
LogFactory.GetLogger().Info(log.Message); |
|||
break; |
|||
|
|||
case LoggerLevel.Error: |
|||
LogFactory.GetLogger().Error(log.Message); |
|||
break; |
|||
} |
|||
} |
|||
|
|||
#endregion 公共 基础函数
|
|||
} |
|||
} |
@ -0,0 +1,131 @@ |
|||
using EC.Entity.Warning; |
|||
using EC.UsingEventAggregator; |
|||
using EC.Utils; |
|||
using EC.Utils.ZMQ; |
|||
using ECMonitor.Code; |
|||
using ECMonitor.Code.Models; |
|||
using ECMonitor.Manager; |
|||
using ECMonitor.Page.Name; |
|||
using ECMonitor.Views; |
|||
using Prism.Commands; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
using System; |
|||
using System.Windows; |
|||
|
|||
namespace ECMonitor |
|||
{ |
|||
public class MainWindowViewModel : BaseModel |
|||
{ |
|||
private MainWindow _w; |
|||
private ZMQManager _mqManager { get; set; } |
|||
private WebSocketManager _webSocketManager = null; |
|||
private FrmVideoPlayer _frmVideoPlayer; |
|||
private FrmVideoWanging _frmVideoWanging; |
|||
public DelegateCommand<Window> LoadCommand { get; private set; } |
|||
|
|||
public DelegateCommand<string> NavigateCommand { get; private set; } |
|||
|
|||
public MainWindowViewModel(IRegionManager regionManager, IEventAggregator ea) : base(regionManager, ea) |
|||
{ |
|||
MessageManager.Init(ea); |
|||
LoadCommand = new DelegateCommand<Window>(Load); |
|||
NavigateCommand = new DelegateCommand<string>(Navigate); |
|||
regionManager.RegisterViewWithRegion(RegionsName.MainWindowCenter, typeof(Page.CameraMonitor.Main)); |
|||
|
|||
_mqManager = new ZMQManager(); |
|||
_mqManager.OnDataReceived += ZMQDataReceived; |
|||
_webSocketManager = new WebSocketManager(); |
|||
_webSocketManager.OnDataReceived += WebSocketDataReceived; |
|||
StartServer(); |
|||
_frmVideoPlayer = new FrmVideoPlayer(ea); |
|||
_frmVideoWanging = new FrmVideoWanging(ea); |
|||
} |
|||
|
|||
private void Navigate(string navigatePath) |
|||
{ |
|||
if (navigatePath != null) |
|||
{ |
|||
_regionManager.RequestNavigate(RegionsName.MainWindowCenter, navigatePath); |
|||
} |
|||
} |
|||
|
|||
//窗口载入
|
|||
private void Load(Window w) |
|||
{ |
|||
_w = (MainWindow)w; |
|||
w.Closed += (sender, e) => |
|||
{ |
|||
StopServer(); |
|||
}; |
|||
} |
|||
|
|||
private void StartServer() |
|||
{ |
|||
_mqManager.Start(); |
|||
_webSocketManager.Start(); |
|||
} |
|||
|
|||
private void StopServer() |
|||
{ |
|||
_mqManager?.Stop(); |
|||
_webSocketManager.Stop(); |
|||
} |
|||
|
|||
//关闭窗口
|
|||
private void CloseWindow() |
|||
{ |
|||
// canClose = true;
|
|||
_w.Close(); |
|||
} |
|||
|
|||
#region ZMQ WebSocket
|
|||
|
|||
/// <summary>
|
|||
/// ZMQ 消息
|
|||
/// </summary>
|
|||
/// <param name="sender"></param>
|
|||
/// <param name="msgModel"></param>
|
|||
private void ZMQDataReceived(object sender, PubSubModel msgModel) |
|||
{ |
|||
SubMessageIn(msgModel); |
|||
} |
|||
|
|||
private void SubMessageIn(PubSubModel msgModel) |
|||
{ |
|||
if (msgModel.TopicLower().StartsWith(ZMQTopic.Show_Single_Video))//单个视频显示
|
|||
{ |
|||
_frmVideoPlayer.Play(msgModel.msg); |
|||
} |
|||
else if (msgModel.TopicLower().StartsWith(ZMQTopic.MainFrom_Show_Video))//在主窗体显示
|
|||
{ |
|||
_ea.GetEvent<ShowVoideInMainEvent>().Publish(msgModel.msg); |
|||
_w.ShowWindow(); |
|||
} |
|||
//else if (msgModel.TopicLower() == ZMQTopic.Warning_Show_Video)//预警视频只是显示
|
|||
//{
|
|||
// _frmVideoWanging.NewWarningPlay(msgModel.msg);
|
|||
//}
|
|||
else if (msgModel.TopicLower() == ZMQTopic.AI_Detect_Warning_Data)//视频预警输入
|
|||
{ |
|||
try |
|||
{ |
|||
WarningModel warningModel = msgModel.msg.ToObject<WarningModel>(); |
|||
_frmVideoWanging.NewWarningPlay(warningModel.ip); |
|||
_ea.GetEvent<WaningVoideEvent>().Publish(warningModel); |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
LogFactory.GetLogger().Error(ex); |
|||
} |
|||
} |
|||
} |
|||
|
|||
private void WebSocketDataReceived(object sender, PubSubModel pubSubModel) |
|||
{ |
|||
SubMessageIn(pubSubModel); |
|||
} |
|||
|
|||
#endregion ZMQ WebSocket
|
|||
} |
|||
} |
@ -0,0 +1,61 @@ |
|||
using EC.Entity.Video; |
|||
using ECMonitor.Code.DB; |
|||
using System.Collections.Generic; |
|||
|
|||
namespace ECMonitor.Code |
|||
{ |
|||
public class CameraManager |
|||
{ |
|||
public static List<MonitorCamera> CameraList = new List<MonitorCamera>(); |
|||
|
|||
public static List<MsVideoRecorder> LoadData() |
|||
{ |
|||
var msVideoRecorderList = DBDataHelper.LoadCameraData(); |
|||
///添加测试
|
|||
//msVideoRecorderList.Add(TestMsVideoRecorder());
|
|||
|
|||
CameraList.Clear(); |
|||
foreach (MsVideoRecorder msVideoRecorder in msVideoRecorderList) |
|||
{ |
|||
CameraList.AddRange(msVideoRecorder.MsCameraSettingList); |
|||
} |
|||
|
|||
return msVideoRecorderList; |
|||
} |
|||
|
|||
public static MsVideoRecorder TestMsVideoRecorder() |
|||
{ |
|||
MsVideoRecorder msVideoRecorder = new MsVideoRecorder(); |
|||
msVideoRecorder.MsCameraSettingList.Add(new MonitorCamera("192.168.1.108", 37777, "admin", "hk123456", 2)); |
|||
msVideoRecorder.MsCameraSettingList.Add(new MonitorCamera("192.168.1.65", 80000, "admin", "hk123456", 5)); |
|||
msVideoRecorder.MsCameraSettingList.Add(new MonitorCamera("120.198.209.123", 80000, "admin", "hk123456", 5)); |
|||
msVideoRecorder.MsCameraSettingList.Add(new MonitorCamera("218.204.221.100", 80000, "admin", "hk123456", 5)); |
|||
msVideoRecorder.MsCameraSettingList.Add(new MonitorCamera("120.236.237.23", 80000, "admin", "hk123456", 5)); |
|||
|
|||
return msVideoRecorder; |
|||
} |
|||
public static void Add(MonitorCamera camera) |
|||
{ |
|||
CameraList.Add(camera); |
|||
|
|||
} |
|||
public static MonitorCamera GetCamera(string cameraIp) |
|||
{ |
|||
if (string.IsNullOrEmpty(cameraIp)) |
|||
{ |
|||
return null; |
|||
} |
|||
if (CameraList.Count == 0) |
|||
{ |
|||
LoadData(); |
|||
} |
|||
var tempCamera = CameraList.Find(c => c.Ip == cameraIp); |
|||
if (tempCamera == null)//获取 新更新 的相机
|
|||
{ |
|||
LoadData(); |
|||
tempCamera = CameraList.Find(c => c.Ip == cameraIp); |
|||
} |
|||
return tempCamera; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,56 @@ |
|||
using EC.UsingEventAggregator; |
|||
using ECMonitor.UC; |
|||
using MaterialDesignThemes.Wpf; |
|||
using Prism.Events; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace ECMonitor.Manager |
|||
{ |
|||
public class MessageManager |
|||
{ |
|||
static IEventAggregator _ea { get; set; } |
|||
public static void Init(IEventAggregator ea) |
|||
{ |
|||
_ea = ea; |
|||
} |
|||
|
|||
|
|||
public static void ShowMessage( string msg, bool isErr=false) |
|||
{ |
|||
int level = 0; |
|||
if (isErr) |
|||
{ |
|||
level = 3; |
|||
} |
|||
LogModel log = new LogModel(level, msg); |
|||
_ea.GetEvent<ShowMessageSentEvent>().Publish(log); |
|||
} |
|||
public static void ShowMessage( int level, string msg, string remark="") |
|||
{ |
|||
|
|||
LogModel log = new LogModel(level, msg,remark); |
|||
_ea.GetEvent<ShowMessageSentEvent>().Publish(log); |
|||
} |
|||
static object messageLock = new object(); |
|||
/// <summary>
|
|||
/// 弹窗显示
|
|||
/// </summary>
|
|||
/// <param name="message"></param>
|
|||
/// <returns></returns>
|
|||
public static Task<object> MessageBox(string message) |
|||
{ |
|||
lock (messageLock) |
|||
{ |
|||
var sampleMessageDialog = new SampleMessageDialog |
|||
{ |
|||
Message = { Text = message } |
|||
}; |
|||
return DialogHost.Show(sampleMessageDialog, "RootDialog"); |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,50 @@ |
|||
using EC.Entity.Video; |
|||
using ECMonitor.Code.Models; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace ECMonitor.Code |
|||
{ |
|||
public class ShowVideoManager |
|||
{ |
|||
public int UCVideoIndex = 0; |
|||
public List<VideoShowModel> UCVideoList = new List<VideoShowModel>(); |
|||
|
|||
public VideoShowModel CreateVideoShowModel(string cameraIp) |
|||
{ |
|||
|
|||
VideoShowModel ucVideoShowModel = new VideoShowModel(); |
|||
ucVideoShowModel.CameraIp = cameraIp; |
|||
ucVideoShowModel.UCName = "UCRegVideo" + UCVideoIndex++; |
|||
MonitorCamera camera = CameraManager.GetCamera(cameraIp); |
|||
if (camera != null) |
|||
{ |
|||
ucVideoShowModel.Camera = camera; |
|||
} |
|||
else { |
|||
ucVideoShowModel.Message = "没有视频"; |
|||
} |
|||
|
|||
|
|||
UCVideoList.Add(ucVideoShowModel); |
|||
return ucVideoShowModel; |
|||
} |
|||
/// <summary>
|
|||
/// 获取显示模块
|
|||
/// </summary>
|
|||
/// <param name="cameraIp"></param>
|
|||
/// <returns></returns>
|
|||
public VideoShowModel GetVideoShowModel(string cameraIp) |
|||
{ |
|||
return UCVideoList.Find(c => c.CameraIp == cameraIp); |
|||
} |
|||
|
|||
internal void Remove(VideoShowModel videoShow) |
|||
{ |
|||
UCVideoList.Remove(videoShow); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,133 @@ |
|||
using ECMonitor.UC.Videos; |
|||
using Prism.Events; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Manager |
|||
{ |
|||
public class VideoPlayManager |
|||
{ |
|||
|
|||
private int _videoIndex = 0; |
|||
private List<IUCPlayer> UCVideoList = new List<IUCPlayer>(); |
|||
|
|||
/// <summary>
|
|||
/// 获取显示模块
|
|||
/// </summary>
|
|||
/// <param name="cameraIp"></param>
|
|||
/// <returns></returns>
|
|||
public UserControl GetUserControl(string cameraIp) |
|||
{ |
|||
return UCVideoList.Find(c => c.GetCameraIp() == cameraIp).GetControl(); |
|||
} |
|||
public IUCPlayer GetUCVideo(string cameraIp) |
|||
{ |
|||
return UCVideoList.Find(c => c.GetCameraIp() == cameraIp); |
|||
} |
|||
internal void Add(IUCPlayer videoShow) |
|||
{ |
|||
videoShow.SetIndex(UCVideoList.Count); |
|||
UCVideoList.Add(videoShow); |
|||
|
|||
} |
|||
internal void Remove(IUCPlayer videoShow) |
|||
{ |
|||
UCVideoList.Remove(videoShow); |
|||
int icont = UCVideoList.Count; |
|||
for(int i = 0; i < icont; i++) |
|||
{ |
|||
UCVideoList[i].SetIndex(i); |
|||
} |
|||
} |
|||
|
|||
internal List<IUCPlayer> GetUCVideoList() |
|||
{ |
|||
return UCVideoList; |
|||
} |
|||
internal void SetALLUnSelected() |
|||
{ |
|||
foreach (IUCPlayer videoPlay in UCVideoList) |
|||
{ |
|||
videoPlay.SetSelected(false); |
|||
} |
|||
} |
|||
public IUCPlayer CreateVideo(IEventAggregator ea,double _videoWidth, double _videoHeight, int videoType=0,bool showCloseButton=true) |
|||
{ |
|||
switch (videoType) |
|||
{ |
|||
case 0://Rtsp
|
|||
UCFFmpegPlayer rtspVideo = new UCFFmpegPlayer(ea,_videoWidth, _videoHeight, _videoIndex++, showCloseButton,true); |
|||
rtspVideo._videoType = videoType; |
|||
UCVideoList.Add(rtspVideo); |
|||
return rtspVideo; |
|||
|
|||
//case 1://海康直连
|
|||
// return null
|
|||
// break;
|
|||
default: |
|||
UCFFmpegPlayer defaultVideo = new UCFFmpegPlayer(ea,_videoWidth, _videoHeight, _videoIndex++, showCloseButton); |
|||
defaultVideo._videoType = videoType; |
|||
UCVideoList.Add(defaultVideo); |
|||
return defaultVideo; |
|||
|
|||
} |
|||
|
|||
} |
|||
/// <summary>
|
|||
/// 创建视频预警线规划
|
|||
/// </summary>
|
|||
/// <param name="ea"></param>
|
|||
/// <param name="_videoWidth"></param>
|
|||
/// <param name="_videoHeight"></param>
|
|||
/// <param name="videoType"></param>
|
|||
/// <returns></returns>
|
|||
public IUCPlayer CreateWarnCreateLinePlayer(IEventAggregator ea, double _videoWidth, double _videoHeight, int videoType = 0 ) |
|||
{ |
|||
|
|||
UCFFmpegPlayer rtspVideo = new UCFFmpegPlayer(ea, _videoWidth, _videoHeight, _videoIndex++, false, false); |
|||
rtspVideo._videoType = videoType; |
|||
UCVideoList.Add(rtspVideo); |
|||
return rtspVideo; |
|||
|
|||
|
|||
} |
|||
public IUCPlayer CreateWaringVideo(IEventAggregator ea, double _videoWidth, double _videoHeight, int videoType = 0, bool showCloseButton = false) |
|||
{ |
|||
|
|||
UCAIWarningPlayer rtspVideo = new UCAIWarningPlayer(ea, _videoWidth, _videoHeight, _videoIndex++, showCloseButton); |
|||
rtspVideo._videoType = videoType; |
|||
UCVideoList.Add(rtspVideo); |
|||
return rtspVideo; |
|||
|
|||
|
|||
} |
|||
|
|||
|
|||
public IUCPlayer CreateVideoAI(double _videoWidth, double _videoHeight, int videoType = 0, bool showCloseButton = true) |
|||
{ |
|||
switch (videoType) |
|||
{ |
|||
case 0://Rtsp
|
|||
UCFFmpegAIPlayer rtspVideo = new UCFFmpegAIPlayer(_videoWidth, _videoHeight, _videoIndex++, showCloseButton); |
|||
rtspVideo.VideoType = videoType; |
|||
UCVideoList.Add(rtspVideo); |
|||
return rtspVideo; |
|||
|
|||
//case 1://海康直连
|
|||
// return null
|
|||
// break;
|
|||
default: |
|||
rtspVideo = new UCFFmpegAIPlayer(_videoWidth, _videoHeight, _videoIndex++, showCloseButton); |
|||
rtspVideo.VideoType = videoType; |
|||
UCVideoList.Add(rtspVideo); |
|||
return rtspVideo; |
|||
|
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
@ -0,0 +1,81 @@ |
|||
|
|||
using EC.Utils.ZMQ; |
|||
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
|
|||
|
|||
using EC.Utils; |
|||
using Fleck; |
|||
|
|||
|
|||
namespace ECMonitor.Manager |
|||
{ |
|||
public class WebSocketManager |
|||
{ |
|||
WebSocketServer _webSocketServer = null; |
|||
List<IWebSocketConnection> allSockets = new List<IWebSocketConnection>(); |
|||
public event EventHandler<PubSubModel> OnDataReceived; //定义一个委托类型的事件
|
|||
public WebSocketManager( ) |
|||
{ |
|||
FleckLog.Level = LogLevel.Debug; |
|||
|
|||
_webSocketServer = new WebSocketServer("ws://0.0.0.0:"+ ConfigHelper.WebSocketSvrPort()); |
|||
|
|||
|
|||
} |
|||
|
|||
public void Start() |
|||
{ |
|||
|
|||
_webSocketServer.Start(socket => |
|||
{ |
|||
socket.OnOpen = () => |
|||
{ |
|||
// Console.WriteLine("Open!");
|
|||
allSockets.Add(socket); |
|||
}; |
|||
socket.OnClose = () => |
|||
{ |
|||
Console.WriteLine("Close!"); |
|||
allSockets.Remove(socket); |
|||
}; |
|||
socket.OnMessage = message => |
|||
{ |
|||
//Console.WriteLine(message);
|
|||
// allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
|
|||
WebSocketDataReceived(socket,message); |
|||
}; |
|||
}); |
|||
|
|||
} |
|||
public void Stop() |
|||
{ |
|||
allSockets.ToList().ForEach(s => s.Close()); |
|||
_webSocketServer.Dispose(); |
|||
} |
|||
private void WebSocketDataReceived(object sender, string message) |
|||
{ |
|||
try |
|||
{ |
|||
if (message.IndexOf("topic") > 0) |
|||
{ |
|||
PubSubModel pubSubModel = message.ToObject<PubSubModel>(); |
|||
if (pubSubModel != null) |
|||
{ |
|||
OnDataReceived?.Invoke(this, pubSubModel); |
|||
} |
|||
} |
|||
} |
|||
catch(Exception ex) { |
|||
LogFactory.GetLogger().Error(ex); |
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
} |
|||
} |
@ -0,0 +1,82 @@ |
|||
using EC.Utils.ZMQ; |
|||
using EC.UsingEventAggregator; |
|||
using EC.Utils.Config; |
|||
|
|||
using Prism.Events; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using EC.Utils; |
|||
|
|||
namespace ECMonitor.Code |
|||
{ |
|||
public class ZMQManager |
|||
{ |
|||
/// <summary>
|
|||
/// 通用zmq
|
|||
/// </summary>
|
|||
static ZMQHelper _zmqHelper; |
|||
|
|||
|
|||
public event EventHandler<PubSubModel> OnDataReceived; //定义一个委托类型的事件
|
|||
|
|||
public void Start() |
|||
{ |
|||
try |
|||
{ |
|||
string pubserver = ConfigHelper.PUBServer(); |
|||
string subserver = ConfigHelper.SUBServer(); |
|||
List<string> topics = SUBTopicList(); |
|||
|
|||
_zmqHelper = new ZMQHelper(pubserver, subserver, topics); |
|||
_zmqHelper.OnSubData += SubDataReceived; |
|||
_zmqHelper.Start(); |
|||
}catch(Exception ex) |
|||
{ |
|||
FLogger.Error(ex); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
} |
|||
|
|||
internal static List<string> SUBTopicList() |
|||
{ |
|||
List<string> topicList = new List<string>(); |
|||
topicList.Add("Topic"); |
|||
topicList.Add(ZMQTopic.Show_Single_Video + ConfigHelper.AppId); |
|||
topicList.Add(ZMQTopic.MainFrom_Show_Video + ConfigHelper.AppId); |
|||
|
|||
topicList.Add(ZMQTopic.MainFrom_Show_Video); |
|||
|
|||
|
|||
topicList.Add(ZMQTopic.AI_Detect_Warning_Data); |
|||
return topicList; |
|||
} |
|||
|
|||
public void Stop() |
|||
{ |
|||
_zmqHelper?.Stop(); |
|||
} |
|||
private void SubDataReceived(object sender, PubSubModel msgModel) |
|||
{ |
|||
try |
|||
{ |
|||
OnDataReceived?.Invoke(sender, msgModel); |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
LogFactory.GetLogger().Error(ex); |
|||
} |
|||
|
|||
} |
|||
public void Send(string topic, string msg) |
|||
{ |
|||
_zmqHelper.Send( topic, msg); |
|||
} |
|||
|
|||
} |
|||
} |
@ -0,0 +1,24 @@ |
|||
using ECMonitor.Page.Name; |
|||
using Prism.Ioc; |
|||
using Prism.Modularity; |
|||
|
|||
namespace ECMonitor |
|||
{ |
|||
public class NavigationModule : IModule |
|||
{ |
|||
public void OnInitialized(IContainerProvider containerProvider) |
|||
{ |
|||
} |
|||
|
|||
public void RegisterTypes(IContainerRegistry containerRegistry) |
|||
{ |
|||
containerRegistry.RegisterForNavigation<Page.CameraMonitor.Main>(name: ViewsName.CameraMonitorMain); |
|||
|
|||
containerRegistry.RegisterForNavigation<Page.SystemSet.Main>(name: ViewsName.SystemSetMain); |
|||
containerRegistry.RegisterForNavigation<Page.SystemSet.ManageSet>(name: ViewsName.SystemSetManageSet); |
|||
containerRegistry.RegisterForNavigation<Page.SystemSet.ManageNvr>(name: ViewsName.SystemSetManageNvr); |
|||
containerRegistry.RegisterForNavigation<Page.SystemSet.ManageIpc>(name: ViewsName.SystemSetManageIpc); |
|||
containerRegistry.RegisterForNavigation<Page.SystemSet.SearchIpc>(name: ViewsName.SystemSetSearchIpc); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,226 @@ |
|||
<UserControl x:Class="ECMonitor.Page.CameraMonitor.CameraAdjust" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
mc:Ignorable="d" |
|||
d:DesignHeight="450" d:DesignWidth="300"> |
|||
|
|||
<UserControl.Resources> |
|||
<SolidColorBrush x:Key="Background" Color="#40444d" /> |
|||
<SolidColorBrush x:Key="BackgroundInterval" Color="#292D36" /> |
|||
<SolidColorBrush x:Key="ButtonNormal" Color="AntiqueWhite" /> |
|||
<SolidColorBrush x:Key="ButtonLight" Color="DeepSkyBlue" /> |
|||
<SolidColorBrush x:Key="ButtonMouseOver" Color="DeepSkyBlue" /> |
|||
<SolidColorBrush x:Key="ButtonMousePress" Color="Aqua" /> |
|||
|
|||
<ControlTemplate x:Key="ArrowButtonTemplate" TargetType="{x:Type Button}"> |
|||
<Polygon x:Name="ButtonPolygon" Stretch="Fill" Points="0,0 200,0 100,-100" Stroke="Black" StrokeThickness="0"> |
|||
<Polygon.Fill> |
|||
<SolidColorBrush Color="AntiqueWhite" Opacity="0.8" /> |
|||
</Polygon.Fill> |
|||
</Polygon> |
|||
<ControlTemplate.Triggers> |
|||
<Trigger Property="IsMouseOver" Value="True"> |
|||
<Setter TargetName="ButtonPolygon" Property="Fill" Value="{StaticResource ButtonMouseOver}" /> |
|||
</Trigger> |
|||
<Trigger Property="IsPressed" Value="True"> |
|||
<Setter TargetName="ButtonPolygon" Property="Fill" Value="{StaticResource ButtonMousePress}" /> |
|||
</Trigger> |
|||
</ControlTemplate.Triggers> |
|||
</ControlTemplate> |
|||
<Style x:Key="ArrowButtonStyle" TargetType="Button"> |
|||
<Setter Property="Width" Value="18" /> |
|||
<Setter Property="Height" Value="9" /> |
|||
<Setter Property="Cursor" Value="Hand" /> |
|||
</Style> |
|||
|
|||
<ControlTemplate x:Key="ResetButtonTemplate" TargetType="{x:Type Button}"> |
|||
<Grid> |
|||
<Ellipse x:Name="Ellipse" Stroke="{StaticResource ButtonLight}" StrokeThickness="2" Fill="{StaticResource Background}" /> |
|||
<Path x:Name="Icon" Width="20" Height="20" Fill="AntiqueWhite" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center" |
|||
Data="F1 M 24,13C 27.1521,13 29.9945,14.3258 32,16.4501L 32,11L 35,14L 35,22L 27,22L 24,19L 29.5903,19C 28.217,17.4656 26.2212,16.5 24,16.5C 20.1969,16.5 17.055,19.3306 16.5661,23L 13.0448,23C 13.5501,17.3935 18.262,13 24,13 Z M 24,31.5C 27.8031,31.5 30.945,28.6694 31.4339,25L 34.9552,25C 34.4499,30.6065 29.738,35 24,35C 20.8479,35 18.0055,33.6742 16,31.5499L 16,37L 13,34L 13,26L 21,26L 24,29L 18.4097,29C 19.783,30.5344 21.7787,31.5 24,31.5 Z" /> |
|||
</Grid> |
|||
<ControlTemplate.Triggers> |
|||
<Trigger Property="IsMouseOver" Value="True"> |
|||
<Setter TargetName="Ellipse" Property="Fill" Value="{StaticResource BackgroundInterval}" /> |
|||
<Setter TargetName="Icon" Property="Fill" Value="{StaticResource ButtonMouseOver}" /> |
|||
</Trigger> |
|||
<Trigger Property="IsPressed" Value="True"> |
|||
<Setter TargetName="Ellipse" Property="Fill" Value="{StaticResource BackgroundInterval}" /> |
|||
<Setter TargetName="Icon" Property="Fill" Value="{StaticResource ButtonMousePress}" /> |
|||
</Trigger> |
|||
</ControlTemplate.Triggers> |
|||
</ControlTemplate> |
|||
<Style x:Key="ResetButtonStyle" TargetType="Button"> |
|||
<Setter Property="HorizontalAlignment" Value="Stretch" /> |
|||
<Setter Property="VerticalAlignment" Value="Stretch" /> |
|||
<Setter Property="Cursor" Value="Hand" /> |
|||
</Style> |
|||
|
|||
<ControlTemplate x:Key="PlusButtonTemplate" TargetType="{x:Type Button}"> |
|||
<!--<Grid Margin="5" Cursor="Hand"> |
|||
<Ellipse x:Name="Ellipse" Stroke="{StaticResource BackgroundInterval}" StrokeThickness="2" Fill="{StaticResource Background}" /> |
|||
<materialDesign:PackIcon Kind="Plus" Foreground="AliceBlue" HorizontalAlignment="Center" VerticalAlignment="Center" /> |
|||
</Grid>--> |
|||
<Border x:Name="Border" CornerRadius="100" Background="{StaticResource Background}" BorderBrush="{StaticResource BackgroundInterval}" BorderThickness="2"> |
|||
<materialDesign:PackIcon Kind="Plus" Foreground="{StaticResource ButtonNormal}" HorizontalAlignment="Center" VerticalAlignment="Center" /> |
|||
</Border> |
|||
<ControlTemplate.Triggers> |
|||
<Trigger Property="IsMouseOver" Value="True"> |
|||
<Setter TargetName="Border" Property="Background" Value="{StaticResource ButtonMouseOver}" /> |
|||
</Trigger> |
|||
<Trigger Property="IsPressed" Value="True"> |
|||
<Setter TargetName="Border" Property="Background" Value="Transparent" /> |
|||
</Trigger> |
|||
</ControlTemplate.Triggers> |
|||
</ControlTemplate> |
|||
|
|||
<ControlTemplate x:Key="MinusButtonTemplate" TargetType="{x:Type Button}"> |
|||
<Border x:Name="Border" CornerRadius="100" Background="{StaticResource Background}" BorderBrush="{StaticResource BackgroundInterval}" BorderThickness="2"> |
|||
<materialDesign:PackIcon Kind="Minus" Foreground="{StaticResource ButtonNormal}" HorizontalAlignment="Center" VerticalAlignment="Center" /> |
|||
</Border> |
|||
<ControlTemplate.Triggers> |
|||
<Trigger Property="IsMouseOver" Value="True"> |
|||
<Setter TargetName="Border" Property="Background" Value="{StaticResource ButtonMouseOver}" /> |
|||
</Trigger> |
|||
<Trigger Property="IsPressed" Value="True"> |
|||
<Setter TargetName="Border" Property="Background" Value="Transparent" /> |
|||
</Trigger> |
|||
</ControlTemplate.Triggers> |
|||
</ControlTemplate> |
|||
<Style x:Key="PressButtonStyle" TargetType="Button"> |
|||
<Setter Property="HorizontalAlignment" Value="Stretch" /> |
|||
<Setter Property="VerticalAlignment" Value="Stretch" /> |
|||
<Setter Property="Margin" Value="7" /> |
|||
<Setter Property="Cursor" Value="Hand" /> |
|||
</Style> |
|||
</UserControl.Resources> |
|||
|
|||
<StackPanel> |
|||
<Border CornerRadius="100" Background="{StaticResource Background}" BorderBrush="{StaticResource BackgroundInterval}" BorderThickness="10" Height="175" Width="175" Margin="0,20,0,0"> |
|||
<Grid> |
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height="1*" /> |
|||
<RowDefinition Height="1*" /> |
|||
<RowDefinition Height="1*" /> |
|||
</Grid.RowDefinitions> |
|||
|
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width="1*" /> |
|||
<ColumnDefinition Width="1*" /> |
|||
<ColumnDefinition Width="1*" /> |
|||
</Grid.ColumnDefinitions> |
|||
|
|||
<Button x:Name="luBtn" Grid.Row="0" Grid.Column="0" Template="{StaticResource ArrowButtonTemplate}" |
|||
Style="{StaticResource ArrowButtonStyle}" HorizontalAlignment="Right" VerticalAlignment="Bottom" RenderTransformOrigin="0.0,0.5"> |
|||
<Button.RenderTransform> |
|||
<RotateTransform Angle="-45" /> |
|||
</Button.RenderTransform> |
|||
</Button> |
|||
<Button x:Name="uBtn" Grid.Row="0" Grid.Column="1" Template="{StaticResource ArrowButtonTemplate}" |
|||
Style="{StaticResource ArrowButtonStyle}" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5"> |
|||
<Button.RenderTransform> |
|||
<RotateTransform Angle="0" /> |
|||
</Button.RenderTransform> |
|||
</Button> |
|||
<Button x:Name="ruBtn" Grid.Row="0" Grid.Column="2" Template="{StaticResource ArrowButtonTemplate}" |
|||
Style="{StaticResource ArrowButtonStyle}" HorizontalAlignment="Left" VerticalAlignment="Bottom" RenderTransformOrigin="0.9,0.45"> |
|||
<Button.RenderTransform> |
|||
<RotateTransform Angle="45" /> |
|||
</Button.RenderTransform> |
|||
</Button> |
|||
|
|||
<Button x:Name="lBtn" Grid.Row="1" Grid.Column="0" Template="{StaticResource ArrowButtonTemplate}" |
|||
Style="{StaticResource ArrowButtonStyle}" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5"> |
|||
<Button.RenderTransform> |
|||
<RotateTransform Angle="-90" /> |
|||
</Button.RenderTransform> |
|||
</Button> |
|||
<Border x:Name="cBtn" Grid.Row="1" Grid.Column="1" CornerRadius="100" BorderBrush="{StaticResource BackgroundInterval}" BorderThickness="5"> |
|||
<Button Template="{StaticResource ResetButtonTemplate}" |
|||
Style="{StaticResource ResetButtonStyle}"> |
|||
</Button> |
|||
</Border> |
|||
<Button x:Name="rBtn" Grid.Row="1" Grid.Column="2" Template="{StaticResource ArrowButtonTemplate}" |
|||
Style="{StaticResource ArrowButtonStyle}" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5"> |
|||
<Button.RenderTransform> |
|||
<RotateTransform Angle="90" /> |
|||
</Button.RenderTransform> |
|||
</Button> |
|||
|
|||
<Button x:Name="ldBtn" Grid.Row="2" Grid.Column="0" Template="{StaticResource ArrowButtonTemplate}" |
|||
Style="{StaticResource ArrowButtonStyle}" HorizontalAlignment="Right" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.9"> |
|||
<Button.RenderTransform> |
|||
<RotateTransform Angle="-135" /> |
|||
</Button.RenderTransform> |
|||
</Button> |
|||
<Button x:Name="dBtn" Grid.Row="2" Grid.Column="1" Template="{StaticResource ArrowButtonTemplate}" |
|||
Style="{StaticResource ArrowButtonStyle}" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5"> |
|||
<Button.RenderTransform> |
|||
<RotateTransform Angle="180" /> |
|||
</Button.RenderTransform> |
|||
</Button> |
|||
<Button x:Name="rdBtn" Grid.Row="2" Grid.Column="2" Template="{StaticResource ArrowButtonTemplate}" |
|||
Style="{StaticResource ArrowButtonStyle}" HorizontalAlignment="Left" VerticalAlignment="Top" RenderTransformOrigin="0.45,0.9"> |
|||
<Button.RenderTransform> |
|||
<RotateTransform Angle="135" /> |
|||
</Button.RenderTransform> |
|||
</Button> |
|||
</Grid> |
|||
</Border> |
|||
|
|||
<Border Height="175" Width="175" Margin="0,10,0,0"> |
|||
<Grid> |
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height="1*" /> |
|||
<RowDefinition Height="1*" /> |
|||
<RowDefinition Height="1*" /> |
|||
<RowDefinition Height="1*" /> |
|||
</Grid.RowDefinitions> |
|||
|
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width="1*" /> |
|||
<ColumnDefinition Width="1*" /> |
|||
<ColumnDefinition Width="1*" /> |
|||
<ColumnDefinition Width="1*" /> |
|||
</Grid.ColumnDefinitions> |
|||
|
|||
<TextBlock Grid.Row="0" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" |
|||
Style="{StaticResource MaterialDesignCaptionTextBlock}" Foreground="{StaticResource ButtonNormal}" Text="变倍" /> |
|||
<Button Grid.Row="0" Grid.Column="1" Template="{StaticResource PlusButtonTemplate}" |
|||
Style="{StaticResource PressButtonStyle}"> |
|||
</Button> |
|||
<Button Grid.Row="0" Grid.Column="3" Template="{StaticResource MinusButtonTemplate}" |
|||
Style="{StaticResource PressButtonStyle}"> |
|||
</Button> |
|||
|
|||
<TextBlock Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" |
|||
Style="{StaticResource MaterialDesignCaptionTextBlock}" Foreground="{StaticResource ButtonNormal}" Text="变焦" /> |
|||
<Button Grid.Row="1" Grid.Column="1" Template="{StaticResource PlusButtonTemplate}" |
|||
Style="{StaticResource PressButtonStyle}"> |
|||
</Button> |
|||
<Button Grid.Row="1" Grid.Column="3" Template="{StaticResource MinusButtonTemplate}" |
|||
Style="{StaticResource PressButtonStyle}"> |
|||
</Button> |
|||
|
|||
<TextBlock Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" |
|||
Style="{StaticResource MaterialDesignCaptionTextBlock}" Foreground="{StaticResource ButtonNormal}" Text="光圈" /> |
|||
<Button Grid.Row="2" Grid.Column="1" Template="{StaticResource PlusButtonTemplate}" |
|||
Style="{StaticResource PressButtonStyle}"> |
|||
</Button> |
|||
<Button Grid.Row="2" Grid.Column="3" Template="{StaticResource MinusButtonTemplate}" |
|||
Style="{StaticResource PressButtonStyle}"> |
|||
</Button> |
|||
|
|||
<TextBlock Grid.Row="3" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" |
|||
Style="{StaticResource MaterialDesignCaptionTextBlock}" Foreground="{StaticResource ButtonNormal}" Text="步长" /> |
|||
|
|||
<Slider x:Name="stepSlider" Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="3" HorizontalAlignment="Stretch" VerticalAlignment="Center" Margin="7,0,7,0" |
|||
Minimum="1" Maximum="10" Value="6" TickFrequency="1" materialDesign:SliderAssist.OnlyShowFocusVisualWhileDragging="True" |
|||
Style="{StaticResource MaterialDesignDiscreteSlider}" Cursor="Hand" /> |
|||
</Grid> |
|||
</Border> |
|||
</StackPanel> |
|||
</UserControl> |
@ -0,0 +1,135 @@ |
|||
using EC.Onvif; |
|||
using EC.UsingEventAggregator; |
|||
using Prism.Events; |
|||
using System.Windows; |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Page.CameraMonitor |
|||
{ |
|||
/// <summary>
|
|||
/// UCMainRight.xaml 的交互逻辑
|
|||
/// </summary>
|
|||
public partial class CameraAdjust : UserControl |
|||
{ |
|||
private IEventAggregator _ea { get; set; } |
|||
|
|||
private OnvifClient _onvifClient { get; set; } |
|||
|
|||
public CameraAdjust(IEventAggregator ea) |
|||
{ |
|||
InitializeComponent(); |
|||
|
|||
_ea = ea; |
|||
_ea.GetEvent<SendOnvifClientEvent>().Subscribe(SetCurOnvifClient); |
|||
|
|||
InitBtnListenEvent(); |
|||
} |
|||
|
|||
#region Get & Set
|
|||
|
|||
private void SetCurOnvifClient(OnvifClient obj) |
|||
{ |
|||
_onvifClient = obj; |
|||
} |
|||
|
|||
#endregion Get & Set
|
|||
|
|||
#region ListenEvent
|
|||
|
|||
private void InitBtnListenEvent() |
|||
{ |
|||
//luBtn.Click += OperateOnvifMouseDown;
|
|||
//lBtn.Click += OperateOnvifMouseDown;
|
|||
//ldBtn.Click += OperateOnvifMouseDown;
|
|||
//uBtn.Click += OperateOnvifMouseDown;
|
|||
//dBtn.Click += OperateOnvifMouseDown;
|
|||
//ruBtn.Click += OperateOnvifMouseDown;
|
|||
//rBtn.Click += OperateOnvifMouseDown;
|
|||
//rdBtn.Click += OperateOnvifMouseDown;
|
|||
|
|||
luBtn.AddHandler(MouseDownEvent, new RoutedEventHandler(OperateOnvifMouseDown), true); |
|||
lBtn.AddHandler(MouseDownEvent, new RoutedEventHandler(OperateOnvifMouseDown), true); |
|||
ldBtn.AddHandler(MouseDownEvent, new RoutedEventHandler(OperateOnvifMouseDown), true); |
|||
uBtn.AddHandler(MouseDownEvent, new RoutedEventHandler(OperateOnvifMouseDown), true); |
|||
cBtn.AddHandler(MouseDownEvent, new RoutedEventHandler(OperateOnvifMouseDown), true); |
|||
dBtn.AddHandler(MouseDownEvent, new RoutedEventHandler(OperateOnvifMouseDown), true); |
|||
ruBtn.AddHandler(MouseDownEvent, new RoutedEventHandler(OperateOnvifMouseDown), true); |
|||
rBtn.AddHandler(MouseDownEvent, new RoutedEventHandler(OperateOnvifMouseDown), true); |
|||
rdBtn.AddHandler(MouseDownEvent, new RoutedEventHandler(OperateOnvifMouseDown), true); |
|||
|
|||
luBtn.AddHandler(MouseUpEvent, new RoutedEventHandler(OperateOnvifMouseUp), true); |
|||
lBtn.AddHandler(MouseUpEvent, new RoutedEventHandler(OperateOnvifMouseUp), true); |
|||
ldBtn.AddHandler(MouseUpEvent, new RoutedEventHandler(OperateOnvifMouseUp), true); |
|||
uBtn.AddHandler(MouseUpEvent, new RoutedEventHandler(OperateOnvifMouseUp), true); |
|||
cBtn.AddHandler(MouseUpEvent, new RoutedEventHandler(OperateOnvifMouseUp), true); |
|||
dBtn.AddHandler(MouseUpEvent, new RoutedEventHandler(OperateOnvifMouseUp), true); |
|||
ruBtn.AddHandler(MouseUpEvent, new RoutedEventHandler(OperateOnvifMouseUp), true); |
|||
rBtn.AddHandler(MouseUpEvent, new RoutedEventHandler(OperateOnvifMouseUp), true); |
|||
rdBtn.AddHandler(MouseUpEvent, new RoutedEventHandler(OperateOnvifMouseUp), true); |
|||
} |
|||
|
|||
private bool IsOperateOnvif { get; set; } |
|||
|
|||
private void OperateOnvifMouseDown(object sender, RoutedEventArgs e) |
|||
{ |
|||
if (_onvifClient == null || IsOperateOnvif) |
|||
return; |
|||
IsOperateOnvif = true; |
|||
var btnName = ((Button)sender).Name; |
|||
var step = (float)stepSlider.Value; |
|||
var dist = step * OnvifClient.atomDist; |
|||
var speed = step * OnvifClient.atomSpeed; |
|||
float[] ptz = new float[] { 0, 0, 0 };//ptx,pty,zx
|
|||
switch (btnName) |
|||
{ |
|||
case "luBtn": |
|||
ptz = new float[] { -1, 1, 0 }; |
|||
break; |
|||
|
|||
case "uBtn": |
|||
ptz = new float[] { 0, 1, 0 }; |
|||
break; |
|||
|
|||
case "ruBtn": |
|||
ptz = new float[] { 1, 1, 0 }; |
|||
break; |
|||
|
|||
case "lBtn": |
|||
ptz = new float[] { -1, 0, 0 }; |
|||
break; |
|||
|
|||
case "cBtn": |
|||
ptz = new float[] { 0, 0, 0 }; |
|||
break; |
|||
|
|||
case "rBtn": |
|||
ptz = new float[] { 1, 0, 0 }; |
|||
break; |
|||
|
|||
case "ldBtn": |
|||
ptz = new float[] { -1, -1, 0 }; |
|||
break; |
|||
|
|||
case "dBtn": |
|||
ptz = new float[] { 0, -1, 0 }; |
|||
break; |
|||
|
|||
case "rdBtn": |
|||
ptz = new float[] { 1, -1, 0 }; |
|||
break; |
|||
} |
|||
//_onvifClient.RelativeMoveAsync(ptz[0] * dist, ptz[1] * dist, ptz[2] * dist);
|
|||
_onvifClient.ContinuousMoveAsync(ptz[0] * speed, ptz[1] * speed, ptz[2] * speed); |
|||
} |
|||
|
|||
private void OperateOnvifMouseUp(object sender, RoutedEventArgs e) |
|||
{ |
|||
if (_onvifClient == null) |
|||
return; |
|||
IsOperateOnvif = false; |
|||
_onvifClient.StopAsync(); |
|||
} |
|||
|
|||
#endregion ListenEvent
|
|||
} |
|||
} |
@ -0,0 +1,13 @@ |
|||
using ECMonitor.Code.Models; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
|
|||
namespace ECMonitor.Page.CameraMonitor |
|||
{ |
|||
public class CameraAdjustViewModel : BaseModel |
|||
{ |
|||
public CameraAdjustViewModel(IRegionManager regionManager, IEventAggregator ea) : base(regionManager, ea) |
|||
{ |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,29 @@ |
|||
<UserControl x:Class="ECMonitor.Page.CameraMonitor.CameraTreeView" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:mvvm="http://prismlibrary.com/" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
xmlns:video="clr-namespace:EC.Entity.Video;assembly=EC.Entity" |
|||
mc:Ignorable="d" |
|||
mvvm:ViewModelLocator.AutoWireViewModel="True" |
|||
d:DesignHeight="450" d:DesignWidth="300"> |
|||
|
|||
<Grid MinWidth="200"> |
|||
|
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height="*" /> |
|||
</Grid.RowDefinitions> |
|||
|
|||
<TreeView Grid.Row="0" ItemsSource="{Binding MsVideoRecorderList,Mode=OneWay}" MinWidth="200" MouseDoubleClick="TreeView_MouseDoubleClick"> |
|||
<TreeView.Resources> |
|||
<HierarchicalDataTemplate DataType="{x:Type video:MsVideoRecorder}" ItemsSource="{Binding MsCameraSettingList}"> |
|||
<TextBlock Text="{Binding DeviceName}" Margin="3,2" /> |
|||
</HierarchicalDataTemplate> |
|||
<DataTemplate DataType="{x:Type video:MonitorCamera}"> |
|||
<TextBlock Text="{Binding CameraName}" Margin="3 2" /> |
|||
</DataTemplate> |
|||
</TreeView.Resources> |
|||
</TreeView> |
|||
</Grid> |
|||
</UserControl> |
@ -0,0 +1,49 @@ |
|||
using EC.Entity.Video; |
|||
using EC.UsingEventAggregator; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
using System.Windows.Controls; |
|||
using System.Windows.Input; |
|||
|
|||
namespace ECMonitor.Page.CameraMonitor |
|||
{ |
|||
/// <summary>
|
|||
/// UCMainLeft.xaml 的交互逻辑
|
|||
/// </summary>
|
|||
public partial class CameraTreeView : UserControl |
|||
{ |
|||
public IRegionManager _regionManager { get; set; } |
|||
public IEventAggregator _ea { get; set; } |
|||
|
|||
public CameraTreeView(IRegionManager regionManager, IEventAggregator ea) |
|||
{ |
|||
_regionManager = regionManager; |
|||
_ea = ea; |
|||
InitializeComponent(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// TreesView's SelectedItem is read-only. Hence we can't bind it. There is a way to obtain a selected item.
|
|||
/// </summary>
|
|||
/// <param name="sender"></param>
|
|||
/// <param name="mouseButtonEventArgs"></param>
|
|||
private void TreeView_MouseDoubleClick(object sender, MouseButtonEventArgs mouseButtonEventArgs) |
|||
{ |
|||
var node = (TreeView)sender; |
|||
var item = node.SelectedItem; |
|||
var type = item?.GetType(); |
|||
|
|||
if (type == null) |
|||
return; |
|||
if (type == typeof(MsVideoRecorder)) |
|||
{ |
|||
var recoder = (MsVideoRecorder)item; |
|||
} |
|||
else if (type == typeof(MonitorCamera)) |
|||
{ |
|||
var camera = (MonitorCamera)item; |
|||
_ea.GetEvent<ShowVoideInMainEvent>().Publish(camera.Ip); |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,26 @@ |
|||
using EC.Entity.Video; |
|||
using ECMonitor.Code; |
|||
using ECMonitor.Code.Models; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
using System.Collections.Generic; |
|||
|
|||
namespace ECMonitor.Page.CameraMonitor |
|||
{ |
|||
public class CameraTreeViewModel : BaseModel |
|||
{ |
|||
private IEventAggregator _ea; |
|||
public List<MsVideoRecorder> MsVideoRecorderList { get; set; } |
|||
|
|||
public CameraTreeViewModel(IRegionManager regionManager, IEventAggregator ea) : base(regionManager, ea) |
|||
{ |
|||
_ea = ea; |
|||
LoadData(); |
|||
} |
|||
|
|||
private void LoadData() |
|||
{ |
|||
MsVideoRecorderList = CameraManager.LoadData(); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,83 @@ |
|||
<UserControl x:Class="ECMonitor.Page.CameraMonitor.CameraVideo" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:prism="http://prismlibrary.com/" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
prism:ViewModelLocator.AutoWireViewModel="True" |
|||
mc:Ignorable="d" |
|||
d:DesignHeight="450" d:DesignWidth="800" Loaded="UserControl_Loaded" SizeChanged="UserControl_SizeChanged"> |
|||
|
|||
<Grid Background="{DynamicResource PrimaryBackGroupBrush}"> |
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height=" *" /> |
|||
<RowDefinition Height="30" /> |
|||
</Grid.RowDefinitions> |
|||
<WrapPanel x:Name="panMain" Grid.Row="0" Grid.Column="0" Margin="2,2,2,2"> |
|||
</WrapPanel> |
|||
<!--panMain1用于最大化--> |
|||
<WrapPanel x:Name="panMain1" Grid.Row="0" Grid.Column="0" Panel.ZIndex="1" Margin="2,2,2,2"> |
|||
</WrapPanel> |
|||
<StackPanel |
|||
Orientation="Horizontal" |
|||
|
|||
Grid.Column="0" |
|||
Grid.Row="1" |
|||
Margin="0,0,0,0" |
|||
Background="{DynamicResource PrimaryBodyBrush}"> |
|||
|
|||
<!-- the following based on https://material.io/guidelines/components/buttons.html#buttons-toggle-buttons --> |
|||
<ListBox |
|||
Style="{StaticResource MaterialDesignToolToggleListBox}" |
|||
SelectedIndex="0" |
|||
Padding="0,0,0,0" SelectionChanged="BarButtons_SelectionChanged" |
|||
Name="barButtons"> |
|||
|
|||
<ListBoxItem Padding="5,0,5,0"> |
|||
<Border BorderThickness="2" BorderBrush="#FFFFFF" Height="20" Width="20"> |
|||
<Border Grid.Row="0" Background="#FFFFFF" Height="10" Width="10" Margin="2,2" /> |
|||
</Border> |
|||
</ListBoxItem> |
|||
<ListBoxItem Padding="5,0,5,0"> |
|||
<Grid Width="20" Height="20"> |
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height=" 50*" /> |
|||
<RowDefinition Height="50*" /> |
|||
</Grid.RowDefinitions> |
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width=" 50*" /> |
|||
<ColumnDefinition Width="50*" /> |
|||
</Grid.ColumnDefinitions> |
|||
<Border Grid.Row="0" Grid.Column="0" Background="#FFFFFF" Width="9" Height="9" Margin="0,0" /> |
|||
<Border Grid.Row="1" Grid.Column="0" Background="#FFFFFF" Width="9" Height="9" Margin="0,0" /> |
|||
<Border Grid.Row="1" Grid.Column="1" Background="#FFFFFF" Width="9" Height="9" Margin="0,0" /> |
|||
<Border Grid.Row="0" Grid.Column="1" Background="#FFFFFF" Width="9" Height="9" Margin="0,0" /> |
|||
</Grid> |
|||
</ListBoxItem> |
|||
<ListBoxItem Padding="5,0,5,0"> |
|||
<Grid Width="20" Height="20"> |
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height="10*" /> |
|||
<RowDefinition Height="10*" /> |
|||
<RowDefinition Height="10*" /> |
|||
</Grid.RowDefinitions> |
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width="10*" /> |
|||
<ColumnDefinition Width="10*" /> |
|||
<ColumnDefinition Width="10*" /> |
|||
</Grid.ColumnDefinitions> |
|||
<Border Grid.Row="0" Grid.Column="0" Background="#FFFFFF" Width="6" Height="6" Margin="0,0,1,1" /> |
|||
<Border Grid.Row="0" Grid.Column="1" Background="#FFFFFF" Width="6" Height="6" Margin="0,0,1,1" /> |
|||
<Border Grid.Row="0" Grid.Column="2" Background="#FFFFFF" Width="6" Height="6" Margin="0,0,1,1" /> |
|||
<Border Grid.Row="1" Grid.Column="0" Background="#FFFFFF" Width="6" Height="6" Margin="0,0,1,1" /> |
|||
<Border Grid.Row="1" Grid.Column="1" Background="#FFFFFF" Width="6" Height="6" Margin="0,0,1,1" /> |
|||
<Border Grid.Row="1" Grid.Column="2" Background="#FFFFFF" Width="6" Height="6" Margin="0,0,1,1" /> |
|||
<Border Grid.Row="2" Grid.Column="0" Background="#FFFFFF" Width="6" Height="6" Margin="0,0,1,1" /> |
|||
<Border Grid.Row="2" Grid.Column="1" Background="#FFFFFF" Width="6" Height="6" Margin="0,0,1,1" /> |
|||
<Border Grid.Row="2" Grid.Column="2" Background="#FFFFFF" Width="6" Height="6" Margin="0,0,1,1" /> |
|||
</Grid> |
|||
</ListBoxItem> |
|||
</ListBox> |
|||
</StackPanel> |
|||
</Grid> |
|||
</UserControl> |
@ -0,0 +1,358 @@ |
|||
using EC.Entity.Video; |
|||
using EC.UsingEventAggregator; |
|||
using ECMonitor.Code; |
|||
using ECMonitor.Manager; |
|||
using ECMonitor.UC.Videos; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
using System.Linq; |
|||
using System.Threading; |
|||
using System.Windows; |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Page.CameraMonitor |
|||
{ |
|||
/// <summary>
|
|||
/// MainVideo.xaml 的交互逻辑
|
|||
/// </summary>
|
|||
public partial class CameraVideo : UserControl |
|||
{ |
|||
public IRegionManager _regionManager { get; set; } |
|||
public IEventAggregator _ea { get; set; } |
|||
|
|||
private VideoPlayManager _videoPlayManager { get; set; } = new VideoPlayManager(); |
|||
private double _videoWidth = 400; |
|||
private double _videoHeight = 300; |
|||
|
|||
//窗体长宽比,防止窗体变化时 窗体变形
|
|||
private double _videoWH { get; set; } = -1; |
|||
|
|||
/// <summary>
|
|||
/// 当前选中播放器好
|
|||
/// </summary>
|
|||
private int _playerSelectIndex { get; set; } = 0; |
|||
|
|||
/// <summary>
|
|||
/// 当天窗体内播放器数量
|
|||
/// </summary>
|
|||
private int _videoNumber { get; set; } = 1; |
|||
|
|||
/// <summary>
|
|||
/// 上一次选择 按钮 窗体数 1窗 4窗
|
|||
/// </summary>
|
|||
private int _barButtonSelectedIndex = 0; |
|||
|
|||
public CameraVideo(IRegionManager regionManager, IEventAggregator ea) |
|||
{ |
|||
_regionManager = regionManager; |
|||
_ea = ea; |
|||
InitializeComponent(); |
|||
_ea.GetEvent<ShowVoideInMainEvent>().Subscribe(PlayVideoReceived); |
|||
} |
|||
|
|||
private void BarButtons_SelectionChanged(object sender, SelectionChangedEventArgs e) |
|||
{ |
|||
if (barButtons.SelectedIndex == -1) |
|||
{ |
|||
barButtons.SelectedIndex = _barButtonSelectedIndex; |
|||
return; |
|||
} |
|||
if (barButtons.SelectedIndex != _barButtonSelectedIndex) |
|||
{ |
|||
BarButtonsSelectedChange(barButtons.SelectedIndex); |
|||
} |
|||
} |
|||
|
|||
private void BarButtonsSelectedChange(int selectedIndex) |
|||
{ |
|||
if (_barButtonSelectedIndex == selectedIndex) |
|||
{ |
|||
return; |
|||
} |
|||
_barButtonSelectedIndex = selectedIndex; |
|||
switch (selectedIndex) |
|||
{ |
|||
case 0: |
|||
ChangePlayerGridByRowNum(1); |
|||
break; |
|||
|
|||
case 1: |
|||
ChangePlayerGridByRowNum(2); |
|||
break; |
|||
|
|||
case 2: |
|||
ChangePlayerGridByRowNum(3); |
|||
break; |
|||
} |
|||
_playerSelectIndex = 0; |
|||
_videoPlayManager.SetALLUnSelected(); |
|||
_videoPlayManager.GetUCVideoList()[_playerSelectIndex]?.SetSelected(true); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 设置窗体每行播放器数量
|
|||
/// </summary>
|
|||
/// <param name="rowNumber"></param>
|
|||
private void ChangePlayerGridByRowNum(int rowNumber = 1) |
|||
{ |
|||
if (_videoWH < 0) |
|||
{ |
|||
return; |
|||
} |
|||
double width = panMain.ActualWidth; |
|||
double height = _videoWH * width; |
|||
//Padding =2,2,2,2
|
|||
width = width - 4; |
|||
height = height - 4; |
|||
_videoWidth = width / rowNumber - 4; |
|||
_videoHeight = height / rowNumber - 4; |
|||
int showVideoNumber = rowNumber * rowNumber; |
|||
_videoNumber = showVideoNumber; |
|||
int addedVideoNumber = _videoPlayManager.GetUCVideoList().Count(); |
|||
|
|||
int dif = showVideoNumber - addedVideoNumber; |
|||
//已经添加的 多余界面
|
|||
if (dif < 0) |
|||
{ |
|||
//设置界面大小
|
|||
for (int i = 0; i < showVideoNumber; i++) |
|||
{ |
|||
var videoPlay = _videoPlayManager.GetUCVideoList()[i]; |
|||
videoPlay.ReSetSize(_videoWidth, _videoHeight); |
|||
|
|||
string ucname = videoPlay.GetName(); |
|||
var rtspVideo = (UserControl)this.panMain.FindName(ucname); |
|||
if (rtspVideo == null)//如果没有添加的添加
|
|||
{ |
|||
this.panMain.Children.Add(videoPlay.GetControl()); |
|||
this.panMain.RegisterName(videoPlay.GetName(), videoPlay.GetControl()); |
|||
} |
|||
} |
|||
//从界面删除
|
|||
for (int i = showVideoNumber; i < addedVideoNumber; i++) |
|||
{ |
|||
var videoPlay = _videoPlayManager.GetUCVideoList()[i]; |
|||
string ucname = videoPlay.GetName(); |
|||
var rtspVideo = (UserControl)this.panMain.FindName(ucname); |
|||
if (rtspVideo != null) |
|||
{ |
|||
videoPlay.Stop(); |
|||
// videoPlay.SetIsShow(false);
|
|||
this.panMain.Children.Remove(rtspVideo); |
|||
this.panMain.UnregisterName(ucname); |
|||
} |
|||
} |
|||
} |
|||
else if (dif >= 0) ///已经添加的少于界面
|
|||
{ |
|||
//设置界面大小
|
|||
for (int i = 0; i < addedVideoNumber; i++) |
|||
{ |
|||
var videoPlay = _videoPlayManager.GetUCVideoList()[i]; |
|||
videoPlay.ReSetSize(_videoWidth, _videoHeight); |
|||
string ucname = videoPlay.GetName(); |
|||
var rtspVideo = (UserControl)this.panMain.FindName(ucname); |
|||
if (rtspVideo == null) |
|||
{ |
|||
this.panMain.Children.Add(videoPlay.GetControl()); |
|||
this.panMain.RegisterName(videoPlay.GetName(), videoPlay.GetControl()); |
|||
} |
|||
} |
|||
//添加新的视频窗体
|
|||
for (int i = 0; i < dif; i++) |
|||
{ |
|||
var iUCVideo = _videoPlayManager.CreateVideo(_ea, _videoWidth, _videoHeight); |
|||
var ucvideo = iUCVideo.GetControl(); |
|||
ucvideo.Margin = new Thickness(2, 2, 2, 2); |
|||
this.panMain.Children.Add(ucvideo); |
|||
this.panMain.RegisterName(ucvideo.Name, ucvideo); |
|||
iUCVideo.PlayerMouseDown += PlayerMouseDown; |
|||
iUCVideo.PlayerMouseDoubleClick += PlayerMouseDoubleClick; |
|||
iUCVideo.OnFromClose += OnFromClose; |
|||
} |
|||
} |
|||
} |
|||
|
|||
private void OnFromClose(object sender, int index) |
|||
{ |
|||
StaticData.MainPlayerIp = ""; |
|||
} |
|||
|
|||
//双击 最大化、最小化
|
|||
private void PlayerMouseDoubleClick(object sender, int index) |
|||
{ |
|||
IUCPlayer player = (sender as IUCPlayer); |
|||
|
|||
double width = panMain.ActualWidth; |
|||
double height = _videoWH * width; |
|||
//Padding =2,2,2,2
|
|||
width = width - 4; |
|||
height = height - 4; |
|||
|
|||
bool isMax = player.SetMaximized(width, height); |
|||
if (isMax) |
|||
{ |
|||
this.panMain.Children.Remove(player.GetControl()); |
|||
this.panMain.UnregisterName(player.GetName()); |
|||
this.panMain1.Children.Add(player.GetControl()); |
|||
this.panMain1.RegisterName(player.GetName(), player.GetControl()); |
|||
} |
|||
else |
|||
{ |
|||
this.panMain1.Children.Remove(player.GetControl()); |
|||
this.panMain1.UnregisterName(player.GetName()); |
|||
|
|||
this.panMain.Children.Insert(index, player.GetControl()); |
|||
this.panMain.RegisterName(player.GetName(), player.GetControl()); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 选中设置
|
|||
/// </summary>
|
|||
/// <param name="sender"></param>
|
|||
/// <param name="e"></param>
|
|||
private void PlayerMouseDown(object sender, int videoIndex) |
|||
{ |
|||
_videoPlayManager.SetALLUnSelected(); |
|||
IUCPlayer ucPlayer = (sender as IUCPlayer); |
|||
ucPlayer.SetSelected(true); |
|||
_playerSelectIndex = videoIndex; |
|||
|
|||
//rightRegion.
|
|||
if (ucPlayer.IsPlaying()) |
|||
{ |
|||
//MonitorCamera curCamera = ucPlayer.GetCamera();
|
|||
var curOnvifClient = ucPlayer.GetOnvifClient(); |
|||
_ea.GetEvent<SendOnvifClientEvent>().Publish(curOnvifClient); |
|||
} |
|||
else |
|||
{ |
|||
_ea.GetEvent<SendOnvifClientEvent>().Publish(null); |
|||
} |
|||
|
|||
///
|
|||
} |
|||
|
|||
//private void CreateVideo(string cameraIp)
|
|||
//{
|
|||
// IUCVideo ucVideo = _videoPlayManager.GetUCVideo(cameraIp);
|
|||
// if (ucVideo != null)
|
|||
// {
|
|||
// ucVideo.UPDateTime();
|
|||
// return;
|
|||
// }
|
|||
// MonitorCamera camera = CameraManager.GetCamera(cameraIp);
|
|||
// if (camera == null)
|
|||
// {
|
|||
// ShowLog("相机Ip:" + cameraIp + "不存在", true);
|
|||
// return;
|
|||
// }
|
|||
// UCRtspVlcVideo rtspVideo = new UCRtspVlcVideo(_videoWidth,_videoHeight);
|
|||
|
|||
// this.panMain.Children.Add(rtspVideo);
|
|||
// rtspVideo.Play();
|
|||
|
|||
// this.panMain.RegisterName(rtspVideo.Name, rtspVideo);
|
|||
// _videoPlayManager.Add(ucVideo);
|
|||
//}
|
|||
|
|||
//private void btnStop_Click(object sender, RoutedEventArgs e)
|
|||
//{
|
|||
// var rtspVideo = _videoPlayManager.GetUCVideo("192.168.1.65");
|
|||
// if (rtspVideo != null)
|
|||
// {
|
|||
// rtspVideo.Stop();
|
|||
|
|||
// }
|
|||
|
|||
//}
|
|||
|
|||
private void UserControl_Loaded(object sender, RoutedEventArgs e) |
|||
{ |
|||
_videoWidth = panMain.ActualWidth; |
|||
_videoHeight = panMain.ActualHeight; |
|||
_videoWH = _videoHeight / _videoWidth; |
|||
barButtons.SelectedIndex = ConfigHelper.MainBarButtonSelectedIndex(); |
|||
} |
|||
|
|||
private void Button_Click(object sender, RoutedEventArgs e) |
|||
{ |
|||
// await MessageManager.MessageBox("测试");
|
|||
|
|||
// Play("192.168.1.651");
|
|||
_ea.GetEvent<ShowVoideInMainEvent>().Publish("192.168.1.65"); |
|||
} |
|||
|
|||
public virtual void PlayVideoReceived(string cameraIp) |
|||
{ |
|||
Play(cameraIp); |
|||
} |
|||
|
|||
private void Play(string ip) |
|||
{ |
|||
var videoPlay = _videoPlayManager.GetUCVideoList()[_playerSelectIndex]; |
|||
if (videoPlay == null) |
|||
{ |
|||
MessageManager.ShowMessage("当前选中的播放器 SelectIndex=" + _playerSelectIndex.ToString(), true); |
|||
|
|||
return; |
|||
} |
|||
if (!videoPlay.IsNullPlay()) |
|||
{ |
|||
if (videoPlay.GetCameraIp() == ip) |
|||
{ |
|||
if (videoPlay.IsPlaying()) |
|||
{ |
|||
return; |
|||
} |
|||
} |
|||
videoPlay.Stop(); |
|||
Thread.Sleep(1000); |
|||
} |
|||
MonitorCamera camera = CameraManager.GetCamera(ip); |
|||
if (camera == null) |
|||
{ |
|||
MessageManager.ShowMessage(ip + "相机不存在", true); |
|||
return; |
|||
} |
|||
|
|||
bool play = videoPlay.Play(camera); |
|||
AddSelectVideoIndex(); |
|||
} |
|||
|
|||
public void AddSelectVideoIndex() |
|||
{ |
|||
_playerSelectIndex++; |
|||
if (_playerSelectIndex >= _videoNumber) |
|||
{ |
|||
_playerSelectIndex = 0; |
|||
} |
|||
_videoPlayManager.SetALLUnSelected(); |
|||
var ucPlayer = _videoPlayManager.GetUCVideoList()[_playerSelectIndex]; |
|||
if (ucPlayer != null) |
|||
{ |
|||
ucPlayer.SetSelected(true); |
|||
if (ucPlayer.IsPlaying()) |
|||
{ |
|||
//MonitorCamera curCamera = ucPlayer.GetCamera();
|
|||
var curOnvifClient = ucPlayer.GetOnvifClient(); |
|||
_ea.GetEvent<SendOnvifClientEvent>().Publish(curOnvifClient); |
|||
} |
|||
else |
|||
{ |
|||
_ea.GetEvent<SendOnvifClientEvent>().Publish(null); |
|||
} |
|||
} |
|||
} |
|||
|
|||
//窗体尺寸该表
|
|||
private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e) |
|||
{ |
|||
if (_videoWH < 0) return; |
|||
int toSelectIndex = _barButtonSelectedIndex; |
|||
_barButtonSelectedIndex = -1; |
|||
BarButtonsSelectedChange(toSelectIndex); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,13 @@ |
|||
using ECMonitor.Code.Models; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
|
|||
namespace ECMonitor.Page.CameraMonitor |
|||
{ |
|||
public sealed class CameraVideoViewModel : BaseModel |
|||
{ |
|||
public CameraVideoViewModel(IRegionManager regionManager, IEventAggregator ea) : base(regionManager, ea) |
|||
{ |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,21 @@ |
|||
<UserControl x:Class="ECMonitor.Page.CameraMonitor.Main" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:prism="http://prismlibrary.com/" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
xmlns:names="clr-namespace:ECMonitor.Page.Name" |
|||
prism:ViewModelLocator.AutoWireViewModel="True" |
|||
mc:Ignorable="d" |
|||
d:DesignHeight="450" d:DesignWidth="800"> |
|||
<Grid> |
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width="200" /> |
|||
<ColumnDefinition Width="*" /> |
|||
<ColumnDefinition Width="200" /> |
|||
</Grid.ColumnDefinitions> |
|||
<ContentControl Grid.Column="0" prism:RegionManager.RegionName="{x:Static names:RegionsName.CameraMonitorLeft}" /> |
|||
<ContentControl Grid.Column="1" prism:RegionManager.RegionName="{x:Static names:RegionsName.CameraMonitorCenter}" /> |
|||
<ContentControl Grid.Column="2" prism:RegionManager.RegionName="{x:Static names:RegionsName.CameraMonitorRight}" /> |
|||
</Grid> |
|||
</UserControl> |
@ -0,0 +1,21 @@ |
|||
using ECMonitor.Page.Name; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Page.CameraMonitor |
|||
{ |
|||
/// <summary>
|
|||
/// FrmMain.xaml 的交互逻辑
|
|||
/// </summary>
|
|||
public partial class Main : UserControl |
|||
{ |
|||
public Main(IRegionManager regionManager, IEventAggregator ea) |
|||
{ |
|||
InitializeComponent(); |
|||
_ = regionManager.RegisterViewWithRegion(RegionsName.CameraMonitorLeft, typeof(CameraTreeView)); |
|||
_ = regionManager.RegisterViewWithRegion(RegionsName.CameraMonitorCenter, typeof(CameraVideo)); |
|||
_ = regionManager.RegisterViewWithRegion(RegionsName.CameraMonitorRight, typeof(CameraAdjust)); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,13 @@ |
|||
using ECMonitor.Code.Models; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
|
|||
namespace ECMonitor.Page.CameraMonitor |
|||
{ |
|||
public class MainViewModel : BaseModel |
|||
{ |
|||
public MainViewModel(IRegionManager regionManager, IEventAggregator ea) : base(regionManager, ea) |
|||
{ |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,31 @@ |
|||
namespace ECMonitor.Page.Name |
|||
{ |
|||
public static class RegionsName |
|||
{ |
|||
#region MainWindow
|
|||
|
|||
public static string MainWindowTop { get; } = "MainWindowTopRegion"; |
|||
|
|||
public static string MainWindowCenter { get; } = "MainWindowCenterRegion"; |
|||
|
|||
#endregion MainWindow
|
|||
|
|||
#region CameraMonitor
|
|||
|
|||
public static string CameraMonitorLeft { get; } = "CameraMonitorLeftRegion"; |
|||
public static string CameraMonitorCenter { get; } = "CameraMonitorCenterRegion"; |
|||
public static string CameraMonitorRight { get; } = "CameraMonitorRightRegion"; |
|||
|
|||
#endregion CameraMonitor
|
|||
|
|||
#region SystemSet
|
|||
|
|||
public static string SystemSetLeft { get; } = "SystemSetLeftRegion"; |
|||
|
|||
public static string SystemSetCenter { get; } = "SystemSetCenterRegion"; |
|||
|
|||
public static string SystemSetManageIpcCenter { get; } = "SystemSetManageIpcCenterRegion"; |
|||
|
|||
#endregion SystemSet
|
|||
} |
|||
} |
@ -0,0 +1,52 @@ |
|||
namespace ECMonitor.Page.Name |
|||
{ |
|||
public static class ViewsName |
|||
{ |
|||
#region MainWindow
|
|||
|
|||
public static string MainWindow { get; } = "MainWindow"; |
|||
|
|||
#endregion MainWindow
|
|||
|
|||
#region CameraMonitor
|
|||
|
|||
public static string CameraMonitorMain { get; } = "CameraMonitorMain"; |
|||
|
|||
public static string CameraMonitorTree { get; } = "CameraMonitorTree"; |
|||
|
|||
public static string CameraMonitorVideo { get; } = "CameraMonitorVideo"; |
|||
|
|||
public static string CameraMonitorAdjust { get; } = "CameraMonitorAdjust"; |
|||
|
|||
#endregion CameraMonitor
|
|||
|
|||
#region SystemSet
|
|||
|
|||
/// <summary>
|
|||
/// 主页面
|
|||
/// </summary>
|
|||
public static string SystemSetMain { get; } = "SystemSetMain"; |
|||
|
|||
/// <summary>
|
|||
/// 系统设置页面
|
|||
/// </summary>
|
|||
public static string SystemSetManageSet { get; } = "SystemSetManageSet"; |
|||
|
|||
/// <summary>
|
|||
/// 录像机页面
|
|||
/// </summary>
|
|||
public static string SystemSetManageNvr { get; } = "SystemSetManageNvr"; |
|||
|
|||
/// <summary>
|
|||
/// 摄像机页面
|
|||
/// </summary>
|
|||
public static string SystemSetManageIpc { get; } = "SystemSetManageIpc"; |
|||
|
|||
/// <summary>
|
|||
/// 搜索摄像机页面
|
|||
/// </summary>
|
|||
public static string SystemSetSearchIpc { get; } = "SystemSetSearchIpc"; |
|||
|
|||
#endregion SystemSet
|
|||
} |
|||
} |
@ -0,0 +1,127 @@ |
|||
<UserControl x:Class="ECMonitor.Page.SystemSet.Main" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:prism="http://prismlibrary.com/" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
xmlns:names="clr-namespace:ECMonitor.Page.Name" |
|||
prism:ViewModelLocator.AutoWireViewModel="True" |
|||
mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> |
|||
|
|||
<UserControl.Resources> |
|||
|
|||
<SolidColorBrush x:Key="BtnInActiveBrush" Color="Transparent" /> |
|||
<SolidColorBrush x:Key="BtnActiveBrush" Color="#478cb6" /> |
|||
|
|||
<Style x:Key="leftBtnBorder" TargetType="{x:Type Border}"> |
|||
<Setter Property="Margin" Value="0,0,0,6" /> |
|||
<Setter Property="Padding" Value="0" /> |
|||
<Setter Property="CornerRadius" Value="5" /> |
|||
<Setter Property="Background" Value="Transparent" /> |
|||
<Setter Property="Cursor" Value="Hand" /> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
</Style> |
|||
<Style x:Key="leftBtn" TargetType="{x:Type Button}" BasedOn="{StaticResource MaterialDesignFlatButton}"> |
|||
<Setter Property="Width" Value="90" /> |
|||
<Setter Property="Height" Value="65" /> |
|||
<Setter Property="Padding" Value="0" /> |
|||
<Setter Property="Background" Value="Transparent" /> |
|||
<Setter Property="Cursor" Value="Hand" /> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
</Style> |
|||
<Style x:Key="leftBtnPanel" TargetType="{x:Type StackPanel}"> |
|||
<!--<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" />--> |
|||
</Style> |
|||
<Style x:Key="leftBtnImg" TargetType="{x:Type Image}"> |
|||
<Setter Property="Width" Value="30" /> |
|||
<Setter Property="Height" Value="30" /> |
|||
<Setter Property="Margin" Value="0,0,0,5" /> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
</Style> |
|||
<Style x:Key="leftBtnTxt" TargetType="{x:Type TextBlock}"> |
|||
<Setter Property="FontSize" Value="13" /> |
|||
<Setter Property="Foreground" Value="White" /> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
</Style> |
|||
</UserControl.Resources> |
|||
|
|||
<Grid Background="{DynamicResource PageBgBrush}"> |
|||
|
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width="120" /> |
|||
<ColumnDefinition Width="*" /> |
|||
</Grid.ColumnDefinitions> |
|||
|
|||
<Border Grid.Column="0" BorderBrush="{StaticResource PageBorderBrush}" BorderThickness="0,0,1,0"> |
|||
<StackPanel Orientation="Vertical" HorizontalAlignment="Stretch" |
|||
Background="{DynamicResource PageBodyBrush}"> |
|||
<ListBox x:Name="listBox" Style="{StaticResource MaterialDesignToolVerticalToggleListBox}" |
|||
Background="Transparent" Padding="0,10,0,0" SelectedIndex="0"> |
|||
<ListBox.ItemContainerStyle> |
|||
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}"> |
|||
<Setter Property="Template"> |
|||
<Setter.Value> |
|||
<ControlTemplate TargetType="{x:Type ListBoxItem}"> |
|||
<Border x:Name="border" Style="{StaticResource leftBtnBorder}"> |
|||
<ContentPresenter></ContentPresenter> |
|||
</Border> |
|||
<ControlTemplate.Triggers> |
|||
<Trigger Property="IsSelected" Value="True"> |
|||
<Setter TargetName="border" Property="Background" Value="{StaticResource BtnActiveBrush}" /> |
|||
</Trigger> |
|||
<Trigger Property="IsSelected" Value="False"> |
|||
<Setter TargetName="border" Property="Background" Value="{StaticResource BtnInActiveBrush}" /> |
|||
</Trigger> |
|||
<Trigger Property="IsMouseOver" Value="True"> |
|||
<Setter TargetName="border" Property="Background" Value="{StaticResource BtnActiveBrush}" /> |
|||
</Trigger> |
|||
</ControlTemplate.Triggers> |
|||
</ControlTemplate> |
|||
</Setter.Value> |
|||
</Setter> |
|||
<EventSetter Event="Selected" Handler="ListBoxItem_Selected" /> |
|||
</Style> |
|||
</ListBox.ItemContainerStyle> |
|||
|
|||
<!--<ListBoxItem> |
|||
<Button Style="{StaticResource leftBtn}" |
|||
Command="{Binding NavigateCommand}" CommandParameter="{x:Static names:ViewsName.SystemSetManageSet}"> |
|||
<StackPanel Style="{StaticResource leftBtnPanel}"> |
|||
<Image Style="{StaticResource leftBtnImg}" Source="/set1.png" /> |
|||
<TextBlock Style="{StaticResource leftBtnTxt}" Text="系统设置 " /> |
|||
</StackPanel> |
|||
</Button> |
|||
</ListBoxItem>--> |
|||
|
|||
<ListBoxItem> |
|||
<Button Style="{StaticResource leftBtn}" |
|||
Command="{Binding NavigateCommand}" CommandParameter="{x:Static names:ViewsName.SystemSetManageNvr}"> |
|||
<StackPanel Style="{StaticResource leftBtnPanel}"> |
|||
<Image Style="{StaticResource leftBtnImg}" Source="/camera1.png" /> |
|||
<TextBlock Style="{StaticResource leftBtnTxt}" Text="录像机管理" /> |
|||
</StackPanel> |
|||
</Button> |
|||
</ListBoxItem> |
|||
|
|||
<ListBoxItem> |
|||
<Button Style="{StaticResource leftBtn}" |
|||
Command="{Binding NavigateCommand}" CommandParameter="{x:Static names:ViewsName.SystemSetManageIpc}"> |
|||
<StackPanel Style="{StaticResource leftBtnPanel}"> |
|||
<Image Style="{StaticResource leftBtnImg}" Source="/camera1.png" /> |
|||
<TextBlock Style="{StaticResource leftBtnTxt}" Text="摄像机管理" /> |
|||
</StackPanel> |
|||
</Button> |
|||
</ListBoxItem> |
|||
</ListBox> |
|||
</StackPanel> |
|||
</Border> |
|||
|
|||
<ContentControl Grid.Column="1" Margin="8" |
|||
prism:RegionManager.RegionName="{x:Static names:RegionsName.SystemSetCenter}" /> |
|||
</Grid> |
|||
</UserControl> |
@ -0,0 +1,44 @@ |
|||
using ECMonitor.Page.Name; |
|||
using Prism.Regions; |
|||
using System.Reflection; |
|||
using System.Windows; |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Page.SystemSet |
|||
{ |
|||
public partial class Main : UserControl |
|||
{ |
|||
public Main(IRegionManager regionManager) |
|||
{ |
|||
InitializeComponent(); |
|||
_ = regionManager.RegisterViewWithRegion(RegionsName.SystemSetCenter, typeof(ManageNvr)); |
|||
|
|||
InitPage(); |
|||
} |
|||
|
|||
#region Init
|
|||
|
|||
private void InitPage() |
|||
{ |
|||
} |
|||
|
|||
#endregion Init
|
|||
|
|||
#region Event
|
|||
|
|||
private void ListBoxItem_Selected(object sender, RoutedEventArgs e) |
|||
{ |
|||
ListBoxItem item = (ListBoxItem)sender; |
|||
Button button = (Button)item.Content; |
|||
|
|||
//模拟按钮点击
|
|||
MethodInfo method = button.GetType().GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance); |
|||
_ = (method?.Invoke(button, null)); |
|||
//模拟按钮点击
|
|||
//IInvokeProvider invokeProv = new ButtonAutomationPeer(button).GetPattern(PatternInterface.Invoke) as IInvokeProvider;
|
|||
//invokeProv?.Invoke();
|
|||
} |
|||
|
|||
#endregion Event
|
|||
} |
|||
} |
@ -0,0 +1,26 @@ |
|||
using ECMonitor.Code.Models; |
|||
using ECMonitor.Page.Name; |
|||
using Prism.Commands; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
|
|||
namespace ECMonitor.Page.SystemSet |
|||
{ |
|||
public class MainViewModel : BaseModel |
|||
{ |
|||
public DelegateCommand<string> NavigateCommand { get; private set; } |
|||
|
|||
public MainViewModel(IRegionManager regionManager, IEventAggregator ea) : base(regionManager, ea) |
|||
{ |
|||
NavigateCommand = new DelegateCommand<string>(Navigate); |
|||
} |
|||
|
|||
private void Navigate(string navigatePath) |
|||
{ |
|||
if (navigatePath != null) |
|||
{ |
|||
_regionManager.RequestNavigate(RegionsName.SystemSetCenter, navigatePath); |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,345 @@ |
|||
<UserControl x:Class="ECMonitor.Page.SystemSet.ManageIpc" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" |
|||
xmlns:prism="http://prismlibrary.com/" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:i="http://schemas.microsoft.com/xaml/behaviors" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
xmlns:mvvm="clr-namespace:ECMonitor.MVVM" |
|||
xmlns:names="clr-namespace:ECMonitor.Page.Name" |
|||
prism:ViewModelLocator.AutoWireViewModel="True" |
|||
mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800" |
|||
x:Name="ThatPage"> |
|||
|
|||
<i:Interaction.Triggers> |
|||
<i:EventTrigger EventName="Loaded"> |
|||
<i:InvokeCommandAction Command="{Binding LoadedCommand}" CommandParameter="{Binding ElementName=ThatPage}" /> |
|||
</i:EventTrigger> |
|||
</i:Interaction.Triggers> |
|||
|
|||
<UserControl.Resources> |
|||
|
|||
<SolidColorBrush x:Key="BtnInActiveBrush" Color="#393d46" /> |
|||
<SolidColorBrush x:Key="BtnActiveBrush" Color="#478cb6" /> |
|||
<SolidColorBrush x:Key="DGHeaderBrush" Color="#424242" /> |
|||
<SolidColorBrush x:Key="DGBorderBrush" Color="{StaticResource PageBorderColor}" Opacity="0.8" /> |
|||
<SolidColorBrush x:Key="DGLineBrush" Color="{StaticResource PageBorderColor}" Opacity="0.9" /> |
|||
|
|||
<Style x:Key="topBtn" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}"> |
|||
<Setter Property="Margin" Value="0,0,6,0" /> |
|||
<Setter Property="Background" Value="{StaticResource BtnInActiveBrush}" /> |
|||
<Setter Property="Foreground" Value="WhiteSmoke" /> |
|||
<Setter Property="BorderBrush" Value="{StaticResource PageBorderBrush}" /> |
|||
<Setter Property="BorderThickness" Value="1" /> |
|||
<Setter Property="Cursor" Value="Hand" /> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
<Setter Property="materialDesign:ButtonAssist.CornerRadius" Value="5" /> |
|||
<Style.Triggers> |
|||
<Trigger Property="IsPressed" Value="True"> |
|||
<Setter Property="Background" Value="{StaticResource BtnActiveBrush}" /> |
|||
</Trigger> |
|||
<Trigger Property="IsMouseOver" Value="True"> |
|||
<Setter Property="Background" Value="{StaticResource BtnActiveBrush}" /> |
|||
</Trigger> |
|||
</Style.Triggers> |
|||
</Style> |
|||
<Style x:Key="topBtnPanel" TargetType="{x:Type StackPanel}"> |
|||
<Setter Property="Orientation" Value="Horizontal" /> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
</Style> |
|||
<Style x:Key="topBtnImg" TargetType="{x:Type Control}"> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
</Style> |
|||
<Style x:Key="topBtnTxt" TargetType="{x:Type TextBlock}"> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
</Style> |
|||
</UserControl.Resources> |
|||
|
|||
<Grid Background="{DynamicResource PageBodyBrush}"> |
|||
|
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height="50" /> |
|||
<RowDefinition Height="3*" /> |
|||
<RowDefinition Height="2*" /> |
|||
</Grid.RowDefinitions> |
|||
|
|||
<StackPanel Grid.Row="0" Orientation="Horizontal"> |
|||
<Button Style="{StaticResource topBtn}" Command="{Binding AddCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="AddThick" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="添加" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button> |
|||
<Button Style="{StaticResource topBtn}" Command="{Binding DeleteCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="MinusThick" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="删除" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button> |
|||
<Button Style="{StaticResource topBtn}" Command="{Binding SaveCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="CheckThick" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="保存" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button> |
|||
<!--<Button Style="{StaticResource topBtn}" Command="{Binding RevokeCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="CloseThick" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="撤销" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button>--> |
|||
<Button Style="{StaticResource topBtn}" Command="{Binding RefreshCommand}" Cursor="Hand"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="Refresh" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="刷新" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button> |
|||
<!--<Button Style="{StaticResource topBtn}" Command="{Binding ImportCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="ArrowDownThick" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="导入" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button> |
|||
<Button Style="{StaticResource topBtn}" Command="{Binding ExportCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="ArrowUpThick" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="导出" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button>--> |
|||
</StackPanel> |
|||
|
|||
<DockPanel Grid.Row="1"> |
|||
<DataGrid x:Name="InfoGrid" ItemsSource="{Binding InfoList,Mode=TwoWay }"> |
|||
|
|||
<DataGrid.Style> |
|||
<Style TargetType="DataGrid" BasedOn="{StaticResource MaterialDesignDataGrid}"> |
|||
<Setter Property="Background" Value="{StaticResource PageBodyBrush}" /> |
|||
<Setter Property="GridLinesVisibility" Value="All" /> |
|||
<Setter Property="HorizontalGridLinesBrush" Value="{StaticResource DGLineBrush}" /> |
|||
<Setter Property="VerticalGridLinesBrush" Value="{StaticResource DGLineBrush}" /> |
|||
<Setter Property="BorderBrush" Value="{StaticResource DGLineBrush}" /> |
|||
<Setter Property="BorderThickness" Value="1" /> |
|||
<Setter Property="HeadersVisibility" Value="Column" /> |
|||
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" /> |
|||
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" /> |
|||
<Setter Property="AutoGenerateColumns" Value="False" /> |
|||
<Setter Property="CanUserAddRows" Value="False" /> |
|||
<Setter Property="CanUserDeleteRows" Value="False" /> |
|||
<Setter Property="CanUserResizeRows" Value="False" /> |
|||
<Setter Property="CanUserResizeColumns" Value="True" /> |
|||
<Setter Property="CanUserReorderColumns" Value="False" /> |
|||
<Setter Property="CanUserSortColumns" Value="False" /> |
|||
</Style> |
|||
</DataGrid.Style> |
|||
|
|||
<DataGrid.RowHeaderStyle> |
|||
<Style TargetType="DataGridRowHeader" BasedOn="{StaticResource MaterialDesignDataGridRowHeader}"> |
|||
<Setter Property="HorizontalContentAlignment" Value="Center" /> |
|||
<Setter Property="VerticalContentAlignment" Value="Center" /> |
|||
</Style> |
|||
</DataGrid.RowHeaderStyle> |
|||
|
|||
<DataGrid.ColumnHeaderStyle> |
|||
<Style TargetType="DataGridColumnHeader" BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}"> |
|||
<Setter Property="Background" Value="{StaticResource DGHeaderBrush}" /> |
|||
<Setter Property="HorizontalContentAlignment" Value="Center" /> |
|||
</Style> |
|||
</DataGrid.ColumnHeaderStyle> |
|||
|
|||
<i:Interaction.Triggers> |
|||
<i:EventTrigger EventName="CellEditEnding"> |
|||
<mvvm:ExtendEventCommand Command="{Binding UpdateCommand}" /> |
|||
</i:EventTrigger> |
|||
</i:Interaction.Triggers> |
|||
|
|||
<DataGrid.Columns> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="序号" Width="60" IsReadOnly="True" |
|||
Binding="{Binding Number, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<!--<DataGridTextColumn |
|||
Binding="{Binding IpcId}" Header="编号" Width="60" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</DataGridTextColumn>--> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="名称" Width="120" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
<DataGridTextColumn.Binding> |
|||
<Binding Path="IpcName" UpdateSourceTrigger="PropertyChanged"> |
|||
<Binding.ValidationRules> |
|||
<mvvm:VerifyRule Type="{x:Static mvvm:VerifyRuleType.NotEmpty}" ValidatesOnTargetUpdated="True" /> |
|||
</Binding.ValidationRules> |
|||
</Binding> |
|||
</DataGridTextColumn.Binding> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<materialDesign:DataGridComboBoxColumn |
|||
Header="录像机" Width="120" |
|||
ItemsSourceBinding="{Binding DataContext.NvrNameList, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"> |
|||
<DataGridComboBoxColumn.SelectedValueBinding> |
|||
<Binding Path="NvrName" UpdateSourceTrigger="PropertyChanged"> |
|||
<Binding.ValidationRules> |
|||
<mvvm:VerifyRule Type="{x:Static mvvm:VerifyRuleType.NotEmpty}" ValidatesOnTargetUpdated="True" /> |
|||
</Binding.ValidationRules> |
|||
</Binding> |
|||
</DataGridComboBoxColumn.SelectedValueBinding> |
|||
</materialDesign:DataGridComboBoxColumn> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="类型" Width="90" |
|||
Binding="{Binding IpcType, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="地址" Width="120" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
<DataGridTextColumn.Binding> |
|||
<Binding Path="IpcIp" UpdateSourceTrigger="PropertyChanged"> |
|||
<Binding.ValidationRules> |
|||
<mvvm:VerifyRule Type="{x:Static mvvm:VerifyRuleType.IP}" ValidatesOnTargetUpdated="True" /> |
|||
</Binding.ValidationRules> |
|||
</Binding> |
|||
</DataGridTextColumn.Binding> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="用户姓名" Width="120" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
<DataGridTextColumn.Binding> |
|||
<Binding Path="UserName" UpdateSourceTrigger="PropertyChanged"> |
|||
<Binding.ValidationRules> |
|||
<mvvm:VerifyRule Type="{x:Static mvvm:VerifyRuleType.NotEmpty}" ValidatesOnTargetUpdated="True" /> |
|||
</Binding.ValidationRules> |
|||
</Binding> |
|||
</DataGridTextColumn.Binding> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="用户密码" Width="120" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
<DataGridTextColumn.Binding> |
|||
<Binding Path="UserPwd" UpdateSourceTrigger="PropertyChanged"> |
|||
<Binding.ValidationRules> |
|||
<mvvm:VerifyRule Type="{x:Static mvvm:VerifyRuleType.NotEmpty}" ValidatesOnTargetUpdated="True" /> |
|||
</Binding.ValidationRules> |
|||
</Binding> |
|||
</DataGridTextColumn.Binding> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="主码流地址" Width="*" |
|||
Binding="{Binding RtspMain, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="子码流地址" Width="*" |
|||
Binding="{Binding RtspSub, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<!--<DataGridTextColumn |
|||
Binding="{Binding IpcPosition}" Header="经纬度" Width="*" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</DataGridTextColumn>--> |
|||
|
|||
<DataGridCheckBoxColumn |
|||
Header="启用" Width="60" |
|||
Binding="{Binding IpcEnableBool, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"> |
|||
</DataGridCheckBoxColumn> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="安装位置" Width="*" |
|||
Binding="{Binding IpcAddr, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<!--<DataGridCheckBoxColumn |
|||
Binding="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"> |
|||
<DataGridCheckBoxColumn.Header> |
|||
<Border Background="Transparent"> |
|||
<CheckBox /> |
|||
|
|||
<CheckBox IsChecked="{Binding Data.IsAllItems1Selected, Source={StaticResource DataContextProxy}}" /> |
|||
</Border> |
|||
</DataGridCheckBoxColumn.Header> |
|||
<DataGridCheckBoxColumn.HeaderStyle> |
|||
<Style |
|||
TargetType="{x:Type DataGridColumnHeader}" |
|||
BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}"> |
|||
<Setter Property="HorizontalContentAlignment" Value="Center" /> |
|||
</Style> |
|||
</DataGridCheckBoxColumn.HeaderStyle> |
|||
</DataGridCheckBoxColumn> |
|||
|
|||
<DataGridTextColumn |
|||
Binding="{Binding IpcImage}" |
|||
Header="IpcImage" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</DataGridTextColumn> |
|||
|
|||
<DataGridTextColumn |
|||
Binding="{Binding IpcX}" |
|||
Header="IpcX" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</DataGridTextColumn> |
|||
|
|||
<DataGridTextColumn |
|||
Binding="{Binding IpcY}" |
|||
Header="IpcY" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</DataGridTextColumn> |
|||
|
|||
<DataGridTextColumn |
|||
Binding="{Binding OnvifAddr}" Header="Onvif地址" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</DataGridTextColumn> |
|||
|
|||
<DataGridTextColumn |
|||
Binding="{Binding MediaAddr}" Header="Media地址" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</DataGridTextColumn> |
|||
|
|||
<DataGridTextColumn |
|||
Binding="{Binding PtzAddr}" Header="Ptz地址" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</DataGridTextColumn>--> |
|||
</DataGrid.Columns> |
|||
</DataGrid> |
|||
</DockPanel> |
|||
|
|||
<ContentControl Grid.Row="2" |
|||
prism:RegionManager.RegionName="{x:Static names:RegionsName.SystemSetManageIpcCenter}" /> |
|||
</Grid> |
|||
</UserControl> |
@ -0,0 +1,18 @@ |
|||
using ECMonitor.Page.Name; |
|||
using Prism.Regions; |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Page.SystemSet |
|||
{ |
|||
/// <summary>
|
|||
/// ManageIpc.xaml 的交互逻辑
|
|||
/// </summary>
|
|||
public partial class ManageIpc : UserControl |
|||
{ |
|||
public ManageIpc(IRegionManager regionManager) |
|||
{ |
|||
InitializeComponent(); |
|||
_ = regionManager.RegisterViewWithRegion(RegionsName.SystemSetManageIpcCenter, typeof(SearchIpc)); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,281 @@ |
|||
using EC.Entity.CameraInfo; |
|||
using EC.Service.CameraInfo; |
|||
using EC.UsingEventAggregator; |
|||
using ECMonitor.Code.Models; |
|||
using ECMonitor.MVVM; |
|||
using Prism.Commands; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Collections.ObjectModel; |
|||
using System.Threading; |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Page.SystemSet |
|||
{ |
|||
public class ManageIpcViewModel : BaseModel |
|||
{ |
|||
private ManageIpc ThatPage { get; set; } |
|||
|
|||
public ObservableCollection<IpcInfo> InfoList { get; set; } = new(); |
|||
|
|||
private ReaderWriterLockSlim InfoListrwl { get; } = new(); |
|||
|
|||
private List<int> AddNumberList { get; } = new(); |
|||
|
|||
private List<int> UpdateNumberList { get; } = new(); |
|||
|
|||
public ObservableCollection<string> NvrNameList { get; set; } = new(); |
|||
|
|||
#region Command
|
|||
|
|||
public DelegateCommand<UserControl> LoadedCommand { get; private set; } |
|||
|
|||
public DelegateCommand AddCommand { get; private set; } |
|||
|
|||
public DelegateCommand DeleteCommand { get; private set; } |
|||
|
|||
public ExtendCommand<DataGridCellEditEndingEventArgs> UpdateCommand { get; private set; } |
|||
|
|||
public DelegateCommand SaveCommand { get; private set; } |
|||
|
|||
public DelegateCommand RevokeCommand { get; private set; } |
|||
|
|||
public DelegateCommand RefreshCommand { get; private set; } |
|||
|
|||
public DelegateCommand ImportCommand { get; private set; } |
|||
|
|||
public DelegateCommand ExportCommand { get; private set; } |
|||
|
|||
#endregion Command
|
|||
|
|||
public ManageIpcViewModel(IRegionManager regionManager, IEventAggregator ea) : base(regionManager, ea) |
|||
{ |
|||
LoadedCommand = new DelegateCommand<UserControl>(LoadedPageAction); |
|||
|
|||
AddCommand = new DelegateCommand(AddInfoAction); |
|||
DeleteCommand = new DelegateCommand(DeleteInfoAction); |
|||
UpdateCommand = new ExtendCommand<DataGridCellEditEndingEventArgs>(UpdateInfoAction); |
|||
SaveCommand = new DelegateCommand(SaveInfosAction); |
|||
RevokeCommand = new DelegateCommand(RevokeInfoAction); |
|||
RefreshCommand = new DelegateCommand(RefreshAction); |
|||
ImportCommand = new DelegateCommand(ImportInfosAction); |
|||
ExportCommand = new DelegateCommand(ExportInfosAction); |
|||
_ea.GetEvent<SendIpcInfoListEvent>().Subscribe(SubscribeIpcInfoListAction); |
|||
} |
|||
|
|||
#region Event Action
|
|||
|
|||
private void LoadedPageAction(UserControl view) |
|||
{ |
|||
if (ThatPage != null) { return; } |
|||
ThatPage = (ManageIpc)view; |
|||
RefreshAction(); |
|||
} |
|||
|
|||
#endregion Event Action
|
|||
|
|||
#region Operate Action
|
|||
|
|||
private void AddInfoAction() |
|||
{ |
|||
IpcInfo info = new(); |
|||
info.Number = GetInfoNewNumber(); |
|||
info.IpcName = $"摄像机#{info.Number}"; |
|||
info.IpcEnableBool = true; |
|||
OperateInfoListByLock(() => { AddInfo(info); }); |
|||
|
|||
DataGrid infoGrid = ThatPage.InfoGrid; |
|||
infoGrid.SelectedIndex = infoGrid.Items.Count - 1; |
|||
} |
|||
|
|||
private async void DeleteInfoAction() |
|||
{ |
|||
DataGrid infoGrid = ThatPage.InfoGrid; |
|||
IpcInfo info = (IpcInfo)infoGrid.SelectedItem; |
|||
int index = ThatPage.InfoGrid.SelectedIndex; |
|||
if (info == null) { return; } |
|||
|
|||
if (info.IpcId <= 0) |
|||
{ |
|||
OperateInfoListByLock(() => { RemoveInfo(info); }); |
|||
infoGrid.SelectedIndex = (index < infoGrid.Items.Count) ? index : infoGrid.Items.Count - 1; |
|||
return; |
|||
} |
|||
|
|||
using IpcInfoContext ctx = new(); |
|||
_ = ctx.Remove(info); |
|||
int ret = await ctx.SaveChangesAsync(); |
|||
if (ret > 0) |
|||
{ |
|||
OperateInfoListByLock(() => { RemoveInfo(info); }); |
|||
infoGrid.SelectedIndex = (index < infoGrid.Items.Count) ? index : infoGrid.Items.Count - 1; |
|||
} |
|||
} |
|||
|
|||
private void UpdateInfoAction(DataGridCellEditEndingEventArgs e) |
|||
{ |
|||
if (e.EditAction != DataGridEditAction.Commit) { return; } |
|||
|
|||
var elm = e.EditingElement; |
|||
DataGridRow row = e.Row; |
|||
DataGridColumn column = e.Column; |
|||
IpcInfo info = (IpcInfo)row.Item; |
|||
if (info != null && info.IpcId > 0) |
|||
{ |
|||
if (!UpdateNumberList.Exists(item => item.Equals(info.Number))) |
|||
{ |
|||
UpdateNumberList.Add(info.Number); |
|||
} |
|||
} |
|||
} |
|||
|
|||
private async void SaveInfosAction() |
|||
{ |
|||
//ValidationError validationError = WPFAssist.GetDataGridRowsFirstError(ThatPage.InfoGrid);
|
|||
//if (WPFAssist.GetDataGridRowsHasError(ThatPage.InfoGrid)) { return; }
|
|||
|
|||
List<IpcInfo> list = null; |
|||
using IpcInfoContext ctx = new(); |
|||
int ret = 0; |
|||
|
|||
if (AddNumberList.Count > 0) |
|||
{ |
|||
list ??= GetInfoList(); |
|||
foreach (int number in AddNumberList) |
|||
{ |
|||
IpcInfo info = list.Find(item => item.Number.Equals(number)); |
|||
if (info != null) { _ = ctx.Add(info); } |
|||
} |
|||
ret = await ctx.SaveChangesAsync(); |
|||
if (ret > 0) { AddNumberList.Clear(); } |
|||
else { return; } |
|||
} |
|||
|
|||
if (UpdateNumberList.Count > 0) |
|||
{ |
|||
list ??= GetInfoList(); |
|||
foreach (int number in UpdateNumberList) |
|||
{ |
|||
IpcInfo info = list.Find(item => item.Number.Equals(number)); |
|||
if (info != null) { _ = ctx.Update(info); } |
|||
} |
|||
ret = await ctx.SaveChangesAsync(); |
|||
if (ret > 0) { UpdateNumberList.Clear(); } |
|||
else { return; } |
|||
} |
|||
|
|||
RefreshAction(); |
|||
} |
|||
|
|||
private void RevokeInfoAction() |
|||
{ |
|||
} |
|||
|
|||
private void RefreshAction() |
|||
{ |
|||
OperateInfoListByLock(() => |
|||
{ |
|||
AddNumberList.Clear(); |
|||
UpdateNumberList.Clear(); |
|||
|
|||
LoadNvrNameList(); |
|||
LoadInfoList(); |
|||
}); |
|||
} |
|||
|
|||
private void ImportInfosAction() |
|||
{ |
|||
} |
|||
|
|||
private void ExportInfosAction() |
|||
{ |
|||
} |
|||
|
|||
#endregion Operate Action
|
|||
|
|||
#region Operate InfoList
|
|||
|
|||
private void OperateInfoListByLock(Action action) |
|||
{ |
|||
if (InfoListrwl.IsWriteLockHeld) { return; } |
|||
if (!InfoListrwl.TryEnterWriteLock(100)) { return; } |
|||
try |
|||
{ |
|||
action?.Invoke(); |
|||
} |
|||
finally |
|||
{ |
|||
InfoListrwl.ExitWriteLock(); |
|||
} |
|||
} |
|||
|
|||
private async void LoadInfoList() |
|||
{ |
|||
InfoList.Clear(); |
|||
using IpcInfoContext ctx = new(); |
|||
List<IpcInfo> list = await ctx.GetListAsync(); |
|||
int number = 0; |
|||
foreach (IpcInfo info in list) |
|||
{ |
|||
info.Number = ++number; |
|||
InfoList.Add(info); |
|||
} |
|||
} |
|||
|
|||
private void AddInfo(IpcInfo info) |
|||
{ |
|||
InfoList.Add(info); |
|||
if (!AddNumberList.Exists(item => item.Equals(info.Number))) |
|||
{ |
|||
AddNumberList.Add(info.Number); |
|||
} |
|||
} |
|||
|
|||
private void RemoveInfo(IpcInfo info) |
|||
{ |
|||
_ = InfoList.Remove(info); |
|||
_ = AddNumberList.RemoveAll(item => item.Equals(info.Number)); |
|||
_ = UpdateNumberList.RemoveAll(item => item.Equals(info.Number)); |
|||
} |
|||
|
|||
private List<IpcInfo> GetInfoList() |
|||
{ |
|||
return new(InfoList); |
|||
} |
|||
|
|||
private int GetInfoNewNumber() |
|||
{ |
|||
int number = InfoList.Count > 0 ? InfoList[^1].Number + 1 : 1; |
|||
return number; |
|||
} |
|||
|
|||
private void SubscribeIpcInfoListAction(List<IpcInfo> infoList) |
|||
{ |
|||
OperateInfoListByLock(() => |
|||
{ |
|||
foreach (IpcInfo item in infoList) |
|||
{ |
|||
item.Number = GetInfoNewNumber(); |
|||
item.IpcName = $"摄像机#{item.Number}"; |
|||
AddInfo(item); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
#endregion Operate InfoList
|
|||
|
|||
#region Operate OtherList
|
|||
|
|||
private async void LoadNvrNameList() |
|||
{ |
|||
NvrNameList.Clear(); |
|||
using NvrInfoContext ctx = new(); |
|||
List<string> list = await ctx.GetNvrNameListAsync(); |
|||
list.ForEach(item => { NvrNameList.Add(item); }); |
|||
} |
|||
|
|||
#endregion Operate OtherList
|
|||
} |
|||
} |
@ -0,0 +1,274 @@ |
|||
<UserControl x:Class="ECMonitor.Page.SystemSet.ManageNvr" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" |
|||
xmlns:prism="http://prismlibrary.com/" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:i="http://schemas.microsoft.com/xaml/behaviors" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
xmlns:mvvm="clr-namespace:ECMonitor.MVVM" |
|||
prism:ViewModelLocator.AutoWireViewModel="True" |
|||
mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800" |
|||
x:Name="ThatPage"> |
|||
|
|||
<i:Interaction.Triggers> |
|||
<i:EventTrigger EventName="Loaded"> |
|||
<i:InvokeCommandAction Command="{Binding LoadedCommand}" CommandParameter="{Binding ElementName=ThatPage}" /> |
|||
</i:EventTrigger> |
|||
</i:Interaction.Triggers> |
|||
|
|||
<UserControl.Resources> |
|||
|
|||
<SolidColorBrush x:Key="BtnInActiveBrush" Color="#393d46" /> |
|||
<SolidColorBrush x:Key="BtnActiveBrush" Color="#478cb6" /> |
|||
<SolidColorBrush x:Key="DGHeaderBrush" Color="#424242" /> |
|||
<SolidColorBrush x:Key="DGBorderBrush" Color="{StaticResource PageBorderColor}" Opacity="0.8" /> |
|||
<SolidColorBrush x:Key="DGLineBrush" Color="{StaticResource PageBorderColor}" Opacity="0.9" /> |
|||
|
|||
<Style x:Key="topBtn" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}"> |
|||
<Setter Property="Margin" Value="0,0,6,0" /> |
|||
<Setter Property="Background" Value="{StaticResource BtnInActiveBrush}" /> |
|||
<Setter Property="Foreground" Value="WhiteSmoke" /> |
|||
<Setter Property="BorderBrush" Value="{StaticResource PageBorderBrush}" /> |
|||
<Setter Property="BorderThickness" Value="1" /> |
|||
<Setter Property="Cursor" Value="Hand" /> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
<Setter Property="materialDesign:ButtonAssist.CornerRadius" Value="5" /> |
|||
<Style.Triggers> |
|||
<Trigger Property="IsPressed" Value="True"> |
|||
<Setter Property="Background" Value="{StaticResource BtnActiveBrush}" /> |
|||
</Trigger> |
|||
<Trigger Property="IsMouseOver" Value="True"> |
|||
<Setter Property="Background" Value="{StaticResource BtnActiveBrush}" /> |
|||
</Trigger> |
|||
</Style.Triggers> |
|||
</Style> |
|||
<Style x:Key="topBtnPanel" TargetType="{x:Type StackPanel}"> |
|||
<Setter Property="Orientation" Value="Horizontal" /> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
</Style> |
|||
<Style x:Key="topBtnImg" TargetType="{x:Type Control}"> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
</Style> |
|||
<Style x:Key="topBtnTxt" TargetType="{x:Type TextBlock}"> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
</Style> |
|||
</UserControl.Resources> |
|||
|
|||
<Grid Background="{DynamicResource PageBodyBrush}"> |
|||
|
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height="50" /> |
|||
<RowDefinition Height="*" /> |
|||
</Grid.RowDefinitions> |
|||
|
|||
<StackPanel Grid.Row="0" Orientation="Horizontal"> |
|||
<Button Style="{StaticResource topBtn}" Command="{Binding AddCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="AddThick" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="添加" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button> |
|||
<Button Style="{StaticResource topBtn}" Command="{Binding DeleteCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="MinusThick" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="删除" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button> |
|||
<Button Style="{StaticResource topBtn}" Command="{Binding SaveCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="CheckThick" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="保存" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button> |
|||
<!--<Button Style="{StaticResource topBtn}" Command="{Binding RevokeCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="CloseThick" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="撤销" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button>--> |
|||
<Button Style="{StaticResource topBtn}" Command="{Binding RefreshCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="Refresh" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="刷新" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button> |
|||
<!--<Button Style="{StaticResource topBtn}" Command="{Binding ImportCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="ArrowDownThick" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="导入" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button> |
|||
<Button Style="{StaticResource topBtn}" Command="{Binding ExportCommand}"> |
|||
<StackPanel Style="{StaticResource topBtnPanel}"> |
|||
<materialDesign:PackIcon Kind="ArrowUpThick" Style="{StaticResource topBtnImg}" /> |
|||
<TextBlock Text="导出" Style="{StaticResource topBtnTxt}" /> |
|||
</StackPanel> |
|||
</Button>--> |
|||
</StackPanel> |
|||
|
|||
<DockPanel Grid.Row="1"> |
|||
<DataGrid x:Name="InfoGrid" ItemsSource="{Binding InfoList,Mode=TwoWay}"> |
|||
|
|||
<DataGrid.Style> |
|||
<Style TargetType="DataGrid" BasedOn="{StaticResource MaterialDesignDataGrid}"> |
|||
<Setter Property="Background" Value="{StaticResource PageBodyBrush}" /> |
|||
<Setter Property="GridLinesVisibility" Value="All" /> |
|||
<Setter Property="HorizontalGridLinesBrush" Value="{StaticResource DGLineBrush}" /> |
|||
<Setter Property="VerticalGridLinesBrush" Value="{StaticResource DGLineBrush}" /> |
|||
<Setter Property="BorderBrush" Value="{StaticResource DGLineBrush}" /> |
|||
<Setter Property="BorderThickness" Value="1" /> |
|||
<Setter Property="HeadersVisibility" Value="Column" /> |
|||
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" /> |
|||
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" /> |
|||
<Setter Property="AutoGenerateColumns" Value="False" /> |
|||
<Setter Property="CanUserAddRows" Value="False" /> |
|||
<Setter Property="CanUserDeleteRows" Value="False" /> |
|||
<Setter Property="CanUserResizeRows" Value="False" /> |
|||
<Setter Property="CanUserResizeColumns" Value="True" /> |
|||
<Setter Property="CanUserReorderColumns" Value="False" /> |
|||
<Setter Property="CanUserSortColumns" Value="False" /> |
|||
</Style> |
|||
</DataGrid.Style> |
|||
|
|||
<DataGrid.RowHeaderStyle> |
|||
<Style TargetType="DataGridRowHeader" BasedOn="{StaticResource MaterialDesignDataGridRowHeader}"> |
|||
<Setter Property="HorizontalContentAlignment" Value="Center" /> |
|||
<Setter Property="VerticalContentAlignment" Value="Center" /> |
|||
</Style> |
|||
</DataGrid.RowHeaderStyle> |
|||
|
|||
<DataGrid.ColumnHeaderStyle> |
|||
<Style TargetType="DataGridColumnHeader" BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}"> |
|||
<Setter Property="Background" Value="{StaticResource DGHeaderBrush}" /> |
|||
<Setter Property="HorizontalContentAlignment" Value="Center" /> |
|||
</Style> |
|||
</DataGrid.ColumnHeaderStyle> |
|||
|
|||
<i:Interaction.Triggers> |
|||
<i:EventTrigger EventName="CellEditEnding"> |
|||
<mvvm:ExtendEventCommand Command="{Binding UpdateCommand}" /> |
|||
</i:EventTrigger> |
|||
</i:Interaction.Triggers> |
|||
|
|||
<DataGrid.Columns> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="序号" Width="60" IsReadOnly="True" |
|||
Binding="{Binding Number}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<!--<materialDesign:DataGridTextColumn |
|||
Binding="{Binding NvrId}" Header="编号" Width="60" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn>--> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="名称" Width="120" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
<DataGridTextColumn.Binding> |
|||
<Binding Path="NvrName" UpdateSourceTrigger="PropertyChanged"> |
|||
<Binding.ValidationRules> |
|||
<mvvm:VerifyRule Type="{x:Static mvvm:VerifyRuleType.NotEmpty}" ValidatesOnTargetUpdated="True" /> |
|||
</Binding.ValidationRules> |
|||
</Binding> |
|||
</DataGridTextColumn.Binding> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<materialDesign:DataGridComboBoxColumn |
|||
Header="类型" Width="90" |
|||
ItemsSourceBinding="{Binding DataContext.NvrDeviceList, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"> |
|||
<DataGridComboBoxColumn.SelectedValueBinding> |
|||
<Binding Path="NvrType" UpdateSourceTrigger="PropertyChanged"> |
|||
<Binding.ValidationRules> |
|||
<mvvm:VerifyRule Type="{x:Static mvvm:VerifyRuleType.NotEmpty}" ValidatesOnTargetUpdated="True" /> |
|||
</Binding.ValidationRules> |
|||
</Binding> |
|||
</DataGridComboBoxColumn.SelectedValueBinding> |
|||
</materialDesign:DataGridComboBoxColumn> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="地址" Width="120" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
<DataGridTextColumn.Binding> |
|||
<Binding Path="NvrIp" UpdateSourceTrigger="PropertyChanged"> |
|||
<Binding.ValidationRules> |
|||
<mvvm:VerifyRule Type="{x:Static mvvm:VerifyRuleType.IP}" ValidatesOnTargetUpdated="True" /> |
|||
</Binding.ValidationRules> |
|||
</Binding> |
|||
</DataGridTextColumn.Binding> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="用户姓名" Width="120" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
<DataGridTextColumn.Binding> |
|||
<Binding Path="UserName" UpdateSourceTrigger="PropertyChanged"> |
|||
<Binding.ValidationRules> |
|||
<mvvm:VerifyRule Type="{x:Static mvvm:VerifyRuleType.NotEmpty}" ValidatesOnTargetUpdated="True" /> |
|||
</Binding.ValidationRules> |
|||
</Binding> |
|||
</DataGridTextColumn.Binding> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="用户密码" Width="120" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
<DataGridTextColumn.Binding> |
|||
<Binding Path="UserPwd" UpdateSourceTrigger="PropertyChanged"> |
|||
<Binding.ValidationRules> |
|||
<mvvm:VerifyRule Type="{x:Static mvvm:VerifyRuleType.NotEmpty}" ValidatesOnTargetUpdated="True" /> |
|||
</Binding.ValidationRules> |
|||
</Binding> |
|||
</DataGridTextColumn.Binding> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<DataGridCheckBoxColumn |
|||
Header="启用" Width="60" |
|||
Binding="{Binding NvrEnableBool, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"> |
|||
</DataGridCheckBoxColumn> |
|||
|
|||
<materialDesign:DataGridTextColumn |
|||
Header="安装位置" Width="*" |
|||
Binding="{Binding NvrAddr, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
|
|||
<!--<DataGridCheckBoxColumn Binding="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"> |
|||
<DataGridCheckBoxColumn.Header> |
|||
<Border Background="Transparent"> |
|||
<CheckBox /> |
|||
--> |
|||
<!--<CheckBox IsChecked="{Binding Data.IsAllItems1Selected, Source={StaticResource DataContextProxy}}" />--> |
|||
<!-- |
|||
</Border> |
|||
</DataGridCheckBoxColumn.Header> |
|||
<DataGridCheckBoxColumn.HeaderStyle> |
|||
<Style |
|||
TargetType="{x:Type DataGridColumnHeader}" |
|||
BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}"> |
|||
<Setter Property="HorizontalContentAlignment" Value="Center" /> |
|||
</Style> |
|||
</DataGridCheckBoxColumn.HeaderStyle> |
|||
</DataGridCheckBoxColumn>--> |
|||
</DataGrid.Columns> |
|||
</DataGrid> |
|||
</DockPanel> |
|||
</Grid> |
|||
</UserControl> |
@ -0,0 +1,21 @@ |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Page.SystemSet |
|||
{ |
|||
/// <summary>
|
|||
/// ManageNvr.xaml 的交互逻辑
|
|||
/// </summary>
|
|||
public partial class ManageNvr : UserControl |
|||
{ |
|||
public ManageNvr() |
|||
{ |
|||
InitializeComponent(); |
|||
|
|||
Init(); |
|||
} |
|||
|
|||
private void Init() |
|||
{ |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,276 @@ |
|||
using EC.Entity.CameraInfo; |
|||
using EC.Service.CameraInfo; |
|||
using ECMonitor.Code.Models; |
|||
using ECMonitor.MVVM; |
|||
using Prism.Commands; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Collections.ObjectModel; |
|||
using System.Threading; |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Page.SystemSet |
|||
{ |
|||
public class ManageNvrViewModel : BaseModel |
|||
{ |
|||
private ManageNvr ThatPage { get; set; } |
|||
|
|||
public ObservableCollection<NvrInfo> InfoList { get; set; } = new(); |
|||
|
|||
private ReaderWriterLockSlim InfoListrwl { get; } = new(); |
|||
|
|||
private List<int> AddNumberList { get; } = new(); |
|||
|
|||
private List<int> UpdateNumberList { get; } = new(); |
|||
|
|||
public ObservableCollection<string> NvrDeviceList { get; set; } = new(); |
|||
|
|||
#region Command
|
|||
|
|||
public DelegateCommand<UserControl> LoadedCommand { get; private set; } |
|||
|
|||
public DelegateCommand<DataGrid> LoadedCommand2 { get; private set; } |
|||
|
|||
public DelegateCommand AddCommand { get; private set; } |
|||
|
|||
public DelegateCommand DeleteCommand { get; private set; } |
|||
|
|||
public ExtendCommand<DataGridCellEditEndingEventArgs> UpdateCommand { get; private set; } |
|||
|
|||
public DelegateCommand SaveCommand { get; private set; } |
|||
|
|||
public DelegateCommand RevokeCommand { get; private set; } |
|||
|
|||
public DelegateCommand RefreshCommand { get; private set; } |
|||
|
|||
public DelegateCommand ImportCommand { get; private set; } |
|||
|
|||
public DelegateCommand ExportCommand { get; private set; } |
|||
|
|||
#endregion Command
|
|||
|
|||
public ManageNvrViewModel(IRegionManager regionManager, IEventAggregator ea) : base(regionManager, ea) |
|||
{ |
|||
LoadedCommand = new DelegateCommand<UserControl>(LoadedPageAction); |
|||
|
|||
AddCommand = new DelegateCommand(AddInfoAction); |
|||
DeleteCommand = new DelegateCommand(DeleteInfoAction); |
|||
UpdateCommand = new ExtendCommand<DataGridCellEditEndingEventArgs>(UpdateInfoAction); |
|||
SaveCommand = new DelegateCommand(SaveInfosAction); |
|||
RevokeCommand = new DelegateCommand(RevokeInfoAction); |
|||
RefreshCommand = new DelegateCommand(RefreshAction); |
|||
ImportCommand = new DelegateCommand(ImportInfosAction); |
|||
ExportCommand = new DelegateCommand(ExportInfosAction); |
|||
} |
|||
|
|||
#region Event Action
|
|||
|
|||
private void LoadedPageAction(UserControl view) |
|||
{ |
|||
if (ThatPage != null) { return; } |
|||
ThatPage = (ManageNvr)view; |
|||
RefreshAction(); |
|||
} |
|||
|
|||
#endregion Event Action
|
|||
|
|||
#region Operate Action
|
|||
|
|||
private void AddInfoAction() |
|||
{ |
|||
NvrInfo info = new(); |
|||
info.Number = GetInfoNewNumber(); |
|||
info.NvrName = $"录像机#{info.Number}"; |
|||
info.NvrEnableBool = true; |
|||
OperateInfoListByLock(() => { AddInfo(info); }); |
|||
|
|||
DataGrid infoGrid = ThatPage.InfoGrid; |
|||
infoGrid.SelectedIndex = infoGrid.Items.Count - 1; |
|||
} |
|||
|
|||
private async void DeleteInfoAction() |
|||
{ |
|||
DataGrid infoGrid = ThatPage.InfoGrid; |
|||
NvrInfo info = (NvrInfo)infoGrid.SelectedItem; |
|||
int index = infoGrid.SelectedIndex; |
|||
if (info == null) { return; } |
|||
|
|||
if (info.NvrId <= 0) |
|||
{ |
|||
OperateInfoListByLock(() => { RemoveInfo(info); }); |
|||
infoGrid.SelectedIndex = (index < infoGrid.Items.Count) ? index : infoGrid.Items.Count - 1; |
|||
return; |
|||
} |
|||
|
|||
int ret = 0; |
|||
using IpcInfoContext ctx1 = new(); |
|||
List<IpcInfo> ipcInfoList = await ctx1.GetListAsync(); |
|||
ipcInfoList.ForEach(ipc => { if (ipc.NvrName.Equals(info.NvrName)) { ctx1.Remove(ipc); } }); |
|||
ret = await ctx1.SaveChangesAsync(); |
|||
if (ret > 0) |
|||
{ |
|||
using NvrInfoContext ctx2 = new(); |
|||
_ = ctx2.Remove(info); |
|||
ret = await ctx2.SaveChangesAsync(); |
|||
if (ret > 0) |
|||
{ |
|||
OperateInfoListByLock(() => { RemoveInfo(info); }); |
|||
infoGrid.SelectedIndex = (index < infoGrid.Items.Count) ? index : infoGrid.Items.Count - 1; |
|||
} |
|||
} |
|||
} |
|||
|
|||
private void UpdateInfoAction(DataGridCellEditEndingEventArgs e) |
|||
{ |
|||
if (e.EditAction != DataGridEditAction.Commit) { return; } |
|||
|
|||
var elm = e.EditingElement; |
|||
DataGridRow row = e.Row; |
|||
DataGridColumn column = e.Column; |
|||
NvrInfo info = (NvrInfo)row.Item; |
|||
if (info != null && info.NvrId > 0) |
|||
{ |
|||
if (!UpdateNumberList.Exists(item => item.Equals(info.Number))) |
|||
{ |
|||
UpdateNumberList.Add(info.Number); |
|||
} |
|||
} |
|||
} |
|||
|
|||
private async void SaveInfosAction() |
|||
{ |
|||
//ValidationError validationError = WPFAssist.GetDataGridRowsFirstError(ThatPage.InfoGrid);
|
|||
//if (WPFAssist.GetDataGridRowsHasError(ThatPage.InfoGrid)) { return; }
|
|||
|
|||
List<NvrInfo> list = null; |
|||
using NvrInfoContext ctx = new(); |
|||
int ret = 0; |
|||
|
|||
if (AddNumberList.Count > 0) |
|||
{ |
|||
list ??= GetInfoList(); |
|||
foreach (int number in AddNumberList) |
|||
{ |
|||
NvrInfo info = list.Find(item => item.Number.Equals(number)); |
|||
if (info != null) { _ = ctx.Add(info); } |
|||
} |
|||
ret = await ctx.SaveChangesAsync(); |
|||
if (ret > 0) { AddNumberList.Clear(); } |
|||
else { return; } |
|||
} |
|||
|
|||
if (UpdateNumberList.Count > 0) |
|||
{ |
|||
list ??= GetInfoList(); |
|||
foreach (int number in UpdateNumberList) |
|||
{ |
|||
NvrInfo info = list.Find(item => item.Number.Equals(number)); |
|||
if (info != null) { _ = ctx.Update(info); } |
|||
} |
|||
ret = await ctx.SaveChangesAsync(); |
|||
if (ret > 0) { UpdateNumberList.Clear(); } |
|||
else { return; } |
|||
} |
|||
|
|||
RefreshAction(); |
|||
} |
|||
|
|||
private void RevokeInfoAction() |
|||
{ |
|||
} |
|||
|
|||
private void RefreshAction() |
|||
{ |
|||
OperateInfoListByLock(() => |
|||
{ |
|||
AddNumberList.Clear(); |
|||
UpdateNumberList.Clear(); |
|||
|
|||
LoadNvrDeviceList(); |
|||
LoadInfoList(); |
|||
}); |
|||
} |
|||
|
|||
private void ImportInfosAction() |
|||
{ |
|||
} |
|||
|
|||
private void ExportInfosAction() |
|||
{ |
|||
} |
|||
|
|||
#endregion Operate Action
|
|||
|
|||
#region Operate InfoList
|
|||
|
|||
private void OperateInfoListByLock(Action action) |
|||
{ |
|||
if (InfoListrwl.IsWriteLockHeld) { return; } |
|||
if (!InfoListrwl.TryEnterWriteLock(100)) { return; } |
|||
try |
|||
{ |
|||
action?.Invoke(); |
|||
} |
|||
finally |
|||
{ |
|||
InfoListrwl.ExitWriteLock(); |
|||
} |
|||
} |
|||
|
|||
private async void LoadInfoList() |
|||
{ |
|||
InfoList.Clear(); |
|||
using NvrInfoContext ctx = new(); |
|||
List<NvrInfo> list = await ctx.GetListAsync(); |
|||
int number = 0; |
|||
foreach (NvrInfo info in list) |
|||
{ |
|||
info.Number = ++number; |
|||
InfoList.Add(info); |
|||
} |
|||
} |
|||
|
|||
private void AddInfo(NvrInfo info) |
|||
{ |
|||
InfoList.Add(info); |
|||
if (!AddNumberList.Exists(item => item.Equals(info.Number))) |
|||
{ |
|||
AddNumberList.Add(info.Number); |
|||
} |
|||
} |
|||
|
|||
private void RemoveInfo(NvrInfo info) |
|||
{ |
|||
_ = InfoList.Remove(info); |
|||
_ = AddNumberList.RemoveAll(item => item.Equals(info.Number)); |
|||
_ = UpdateNumberList.RemoveAll(item => item.Equals(info.Number)); |
|||
} |
|||
|
|||
private List<NvrInfo> GetInfoList() |
|||
{ |
|||
return new(InfoList); |
|||
} |
|||
|
|||
private int GetInfoNewNumber() |
|||
{ |
|||
int number = InfoList.Count > 0 ? InfoList[^1].Number + 1 : 1; |
|||
return number; |
|||
} |
|||
|
|||
#endregion Operate InfoList
|
|||
|
|||
#region Operate OtherList
|
|||
|
|||
private void LoadNvrDeviceList() |
|||
{ |
|||
NvrDeviceList.Clear(); |
|||
using NvrInfoContext ctx = new(); |
|||
List<string> list = ctx.GetNvrDeviceList(); |
|||
list.ForEach(item => { NvrDeviceList.Add(item); }); |
|||
} |
|||
|
|||
#endregion Operate OtherList
|
|||
} |
|||
} |
@ -0,0 +1,16 @@ |
|||
<UserControl x:Class="ECMonitor.Page.SystemSet.ManageSet" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
mc:Ignorable="d" |
|||
d:DesignHeight="450" d:DesignWidth="800"> |
|||
|
|||
<Grid Background="{DynamicResource PageBodyBrush}"> |
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height="50" /> |
|||
<RowDefinition Height="*" /> |
|||
</Grid.RowDefinitions> |
|||
<TextBlock Grid.Row="0" Text="系统设置" FontSize="48" HorizontalAlignment="Center" VerticalAlignment="Center" /> |
|||
</Grid> |
|||
</UserControl> |
@ -0,0 +1,15 @@ |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Page.SystemSet |
|||
{ |
|||
/// <summary>
|
|||
/// ManageSet.xaml 的交互逻辑
|
|||
/// </summary>
|
|||
public partial class ManageSet : UserControl |
|||
{ |
|||
public ManageSet() |
|||
{ |
|||
InitializeComponent(); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,13 @@ |
|||
using ECMonitor.Code.Models; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
|
|||
namespace ECMonitor.Page.SystemSet |
|||
{ |
|||
public class ManageSetViewModel : BaseModel |
|||
{ |
|||
public ManageSetViewModel(IRegionManager regionManager, IEventAggregator ea) : base(regionManager, ea) |
|||
{ |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,247 @@ |
|||
<UserControl x:Class="ECMonitor.Page.SystemSet.SearchIpc" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" |
|||
xmlns:prism="http://prismlibrary.com/" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:i="http://schemas.microsoft.com/xaml/behaviors" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
xmlns:mvvm="clr-namespace:ECMonitor.MVVM" |
|||
prism:ViewModelLocator.AutoWireViewModel="True" |
|||
mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800" |
|||
x:Name="ThatPage"> |
|||
|
|||
<i:Interaction.Triggers> |
|||
<i:EventTrigger EventName="Loaded"> |
|||
<i:InvokeCommandAction Command="{Binding LoadedCommand}" CommandParameter="{Binding ElementName=ThatPage}" /> |
|||
</i:EventTrigger> |
|||
</i:Interaction.Triggers> |
|||
|
|||
<UserControl.Resources> |
|||
|
|||
<SolidColorBrush x:Key="BtnInActiveBrush" Color="#393d46" /> |
|||
<SolidColorBrush x:Key="BtnActiveBrush" Color="#478cb6" /> |
|||
<SolidColorBrush x:Key="DGHeaderBrush" Color="#424242" /> |
|||
<SolidColorBrush x:Key="DGBorderBrush" Color="{StaticResource PageBorderColor}" Opacity="0.8" /> |
|||
<SolidColorBrush x:Key="DGLineBrush" Color="{StaticResource PageBorderColor}" Opacity="0.9" /> |
|||
|
|||
<Style x:Key="paramPanel" TargetType="{x:Type StackPanel}"> |
|||
<Setter Property="Orientation" Value="Horizontal" /> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
</Style> |
|||
<Style x:Key="paramLabel" TargetType="{x:Type Label}" BasedOn="{StaticResource MaterialDesignLabel}"> |
|||
</Style> |
|||
<Style x:Key="paramTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource MaterialDesignTextBox}"> |
|||
<Setter Property="Width" Value="100" /> |
|||
<Setter Property="BorderThickness" Value="1" /> |
|||
<Setter Property="BorderBrush" Value="SlateGray" /> |
|||
<Setter Property="Foreground" Value="AntiqueWhite" /> |
|||
<Setter Property="materialDesign:TextFieldAssist.TextFieldCornerRadius" Value="4" /> |
|||
</Style> |
|||
<Style x:Key="paramPasswordBox" TargetType="{x:Type PasswordBox}" BasedOn="{StaticResource MaterialDesignPasswordBox}"> |
|||
<Setter Property="Width" Value="100" /> |
|||
<Setter Property="BorderThickness" Value="1" /> |
|||
<Setter Property="BorderBrush" Value="SlateGray" /> |
|||
<Setter Property="Foreground" Value="AntiqueWhite" /> |
|||
<Setter Property="materialDesign:TextFieldAssist.TextFieldCornerRadius" Value="4" /> |
|||
<Setter Property="materialDesign:TextFieldAssist.HasClearButton" Value="True" /> |
|||
</Style> |
|||
<!--<Style x:Key="paramComboBox" TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">--> |
|||
<Style x:Key="paramComboBox" TargetType="{x:Type ComboBox}" BasedOn="{StaticResource MaterialDesignComboBox}"> |
|||
<Setter Property="Width" Value="100" /> |
|||
<Setter Property="BorderThickness" Value="1" /> |
|||
<Setter Property="BorderBrush" Value="SlateGray" /> |
|||
<Setter Property="Foreground" Value="AntiqueWhite" /> |
|||
<!--<Setter Property="SelectedIndex" Value="0" />--> |
|||
<Setter Property="materialDesign:TextFieldAssist.TextFieldCornerRadius" Value="4" /> |
|||
</Style> |
|||
<Style x:Key="btnPanel" TargetType="{x:Type StackPanel}"> |
|||
<Setter Property="Orientation" Value="Horizontal" /> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
</Style> |
|||
<Style x:Key="paramButton" TargetType="{x:Type Button}" BasedOn="{StaticResource MaterialDesignFlatDarkBgButton}"> |
|||
<Setter Property="Margin" Value="0,0,6,0" /> |
|||
<Setter Property="Background" Value="{StaticResource BtnInActiveBrush}" /> |
|||
<Setter Property="Foreground" Value="WhiteSmoke" /> |
|||
<Setter Property="BorderBrush" Value="{StaticResource PageBorderBrush}" /> |
|||
<Setter Property="BorderThickness" Value="1" /> |
|||
<Setter Property="FontSize" Value="12" /> |
|||
<Setter Property="Cursor" Value="Hand" /> |
|||
<Setter Property="HorizontalAlignment" Value="Center" /> |
|||
<Setter Property="VerticalAlignment" Value="Center" /> |
|||
<Setter Property="materialDesign:ButtonAssist.CornerRadius" Value="5" /> |
|||
<Style.Triggers> |
|||
<Trigger Property="IsPressed" Value="True"> |
|||
<Setter Property="Background" Value="{StaticResource BtnActiveBrush}" /> |
|||
</Trigger> |
|||
<Trigger Property="IsMouseOver" Value="True"> |
|||
<Setter Property="Background" Value="{StaticResource BtnActiveBrush}" /> |
|||
</Trigger> |
|||
</Style.Triggers> |
|||
</Style> |
|||
</UserControl.Resources> |
|||
|
|||
<Grid Background="{DynamicResource PageBodyBrush}"> |
|||
|
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width="*" /> |
|||
<ColumnDefinition Width="200" /> |
|||
</Grid.ColumnDefinitions> |
|||
|
|||
<DockPanel Grid.Column="0"> |
|||
<DataGrid x:Name="InfoGrid" ItemsSource="{Binding InfoList, Mode=OneWay}"> |
|||
|
|||
<DataGrid.Style> |
|||
<Style TargetType="DataGrid" BasedOn="{StaticResource MaterialDesignDataGrid}"> |
|||
<Setter Property="Background" Value="{StaticResource PageBodyBrush}" /> |
|||
<Setter Property="GridLinesVisibility" Value="All" /> |
|||
<Setter Property="HorizontalGridLinesBrush" Value="{StaticResource DGLineBrush}" /> |
|||
<Setter Property="VerticalGridLinesBrush" Value="{StaticResource DGLineBrush}" /> |
|||
<Setter Property="BorderBrush" Value="{StaticResource DGLineBrush}" /> |
|||
<Setter Property="BorderThickness" Value="1" /> |
|||
<Setter Property="HeadersVisibility" Value="Column" /> |
|||
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" /> |
|||
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" /> |
|||
<Setter Property="AutoGenerateColumns" Value="False" /> |
|||
<Setter Property="CanUserAddRows" Value="False" /> |
|||
<Setter Property="CanUserDeleteRows" Value="False" /> |
|||
<Setter Property="CanUserResizeRows" Value="False" /> |
|||
<Setter Property="CanUserResizeColumns" Value="True" /> |
|||
<Setter Property="CanUserReorderColumns" Value="False" /> |
|||
<Setter Property="CanUserSortColumns" Value="False" /> |
|||
</Style> |
|||
</DataGrid.Style> |
|||
|
|||
<DataGrid.RowHeaderStyle> |
|||
<Style TargetType="DataGridRowHeader" BasedOn="{StaticResource MaterialDesignDataGridRowHeader}"> |
|||
<Setter Property="HorizontalContentAlignment" Value="Center" /> |
|||
<Setter Property="VerticalContentAlignment" Value="Center" /> |
|||
</Style> |
|||
</DataGrid.RowHeaderStyle> |
|||
|
|||
<DataGrid.ColumnHeaderStyle> |
|||
<Style TargetType="DataGridColumnHeader" BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}"> |
|||
<Setter Property="Background" Value="{StaticResource DGHeaderBrush}" /> |
|||
<Setter Property="HorizontalContentAlignment" Value="Center" /> |
|||
</Style> |
|||
</DataGrid.ColumnHeaderStyle> |
|||
|
|||
<DataGrid.Columns> |
|||
<materialDesign:DataGridTextColumn |
|||
Header="类型" Width="90" IsReadOnly="True" |
|||
Binding="{Binding IpcType, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
<materialDesign:DataGridTextColumn |
|||
Header="地址" Width="120" IsReadOnly="True" |
|||
Binding="{Binding IpcIp, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
<materialDesign:DataGridTextColumn |
|||
Header="设备地址" Width="*" IsReadOnly="True" |
|||
Binding="{Binding OnvifAddr, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
<materialDesign:DataGridTextColumn |
|||
Header="媒体地址" Width="*" IsReadOnly="True" |
|||
Binding="{Binding MediaAddr, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
<materialDesign:DataGridTextColumn |
|||
Header="云台地址" Width="*" IsReadOnly="True" |
|||
Binding="{Binding PtzAddr, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
<materialDesign:DataGridTextColumn |
|||
Header="主码流" Width="*" IsReadOnly="True" |
|||
Binding="{Binding RtspMain, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
<materialDesign:DataGridTextColumn |
|||
Header="子码流" Width="*" IsReadOnly="True" |
|||
Binding="{Binding RtspSub, UpdateSourceTrigger=PropertyChanged}" |
|||
ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}" |
|||
EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"> |
|||
</materialDesign:DataGridTextColumn> |
|||
</DataGrid.Columns> |
|||
</DataGrid> |
|||
</DockPanel> |
|||
|
|||
<Border Grid.Column="1" BorderBrush="{StaticResource PageBorderBrush}" BorderThickness="1"> |
|||
<StackPanel VerticalAlignment="Top"> |
|||
<Grid> |
|||
|
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height="40" /> |
|||
<RowDefinition Height="40" /> |
|||
<RowDefinition Height="40" /> |
|||
<RowDefinition Height="40" /> |
|||
<RowDefinition Height="40" /> |
|||
<RowDefinition Height="40" /> |
|||
<RowDefinition Height="40" /> |
|||
<RowDefinition Height="40" /> |
|||
</Grid.RowDefinitions> |
|||
|
|||
<StackPanel Grid.Row="0" Style="{StaticResource paramPanel}"> |
|||
<Label Content="录 像 机 " Style="{StaticResource paramLabel}" /> |
|||
<ComboBox x:Name="NvrInfoComboBox" Style="{StaticResource paramComboBox}" |
|||
ItemsSource="{Binding NvrInfoList}" DisplayMemberPath="NvrName" SelectedValue="{Binding SelectedNvrInfo}"> |
|||
<i:Interaction.Triggers> |
|||
<i:EventTrigger EventName="SelectionChanged"> |
|||
<mvvm:ExtendEventCommand Command="{Binding NvrInfoComboBoxSelectionChangedCommand}" /> |
|||
</i:EventTrigger> |
|||
</i:Interaction.Triggers> |
|||
</ComboBox> |
|||
</StackPanel> |
|||
|
|||
<StackPanel Grid.Row="1" Style="{StaticResource paramPanel}"> |
|||
<Label Content="用户姓名" Style="{StaticResource paramLabel}" /> |
|||
<TextBox Text="{Binding UserName,Mode=TwoWay}" Style="{StaticResource paramTextBox}" /> |
|||
</StackPanel> |
|||
|
|||
<StackPanel Grid.Row="2" Style="{StaticResource paramPanel}"> |
|||
<Label Content="用户密码" Style="{StaticResource paramLabel}" /> |
|||
<PasswordBox mvvm:PasswordBoxHelper.Password="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource paramPasswordBox}" /> |
|||
</StackPanel> |
|||
|
|||
<StackPanel Grid.Row="3" Style="{StaticResource paramPanel}"> |
|||
<Label Content="选择网卡" Style="{StaticResource paramLabel}" /> |
|||
<ComboBox x:Name="NetworkCardComboBox" Style="{StaticResource paramComboBox}" |
|||
ItemsSource="{Binding NetworkCardList}" DisplayMemberPath="Name" SelectedValue="{Binding SelectedNetworkCard}"> |
|||
</ComboBox> |
|||
</StackPanel> |
|||
|
|||
<StackPanel Grid.Row="4" Style="{StaticResource paramPanel}"> |
|||
<Label Content="搜索时长" Style="{StaticResource paramLabel}" /> |
|||
<ComboBox x:Name="TimeoutComboBox" Style="{StaticResource paramComboBox}" |
|||
ItemsSource="{Binding TimeoutList}" SelectedValue="{Binding SelectedTimeout}"> |
|||
</ComboBox> |
|||
</StackPanel> |
|||
|
|||
<StackPanel Grid.Row="5" Style="{StaticResource btnPanel}"> |
|||
<Button Style="{StaticResource paramButton}" Content="广播搜索" Command="{Binding BroadcastSearchCommand}" /> |
|||
<Button Style="{StaticResource paramButton}" Content="刷 新" Command="{Binding RefreshCommand}" /> |
|||
</StackPanel> |
|||
|
|||
<StackPanel Grid.Row="6" Style="{StaticResource btnPanel}"> |
|||
<Button Style="{StaticResource paramButton}" Content="获取所有" Command="{Binding GainAllCommand}" /> |
|||
<Button Style="{StaticResource paramButton}" Content="获取当前" Command="{Binding GainSelectedCommand}" /> |
|||
</StackPanel> |
|||
|
|||
<StackPanel Grid.Row="7" Style="{StaticResource btnPanel}"> |
|||
<Button Style="{StaticResource paramButton}" Content="添加所有" Command="{Binding PublishAllCommand}" /> |
|||
<Button Style="{StaticResource paramButton}" Content="添加当前" Command="{Binding PublishSelectedCommand}" /> |
|||
</StackPanel> |
|||
</Grid> |
|||
</StackPanel> |
|||
</Border> |
|||
</Grid> |
|||
</UserControl> |
@ -0,0 +1,16 @@ |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Page.SystemSet |
|||
{ |
|||
/// <summary>
|
|||
/// SearchIpc.xaml 的交互逻辑
|
|||
/// </summary>
|
|||
public partial class SearchIpc : UserControl |
|||
{ |
|||
public SearchIpc() |
|||
{ |
|||
InitializeComponent(); |
|||
} |
|||
|
|||
} |
|||
} |
@ -0,0 +1,346 @@ |
|||
using EC.Entity.CameraInfo; |
|||
using EC.Onvif; |
|||
using EC.Onvif.Common; |
|||
using EC.Onvif.Device; |
|||
using EC.Onvif.Media; |
|||
using EC.Onvif.RemoteDiscovery; |
|||
using EC.Service.CameraInfo; |
|||
using EC.UsingEventAggregator; |
|||
using ECMonitor.Code.Models; |
|||
using ECMonitor.MVVM; |
|||
using Prism.Commands; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Collections.ObjectModel; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Page.SystemSet |
|||
{ |
|||
public class SearchIpcViewModel : BaseModel |
|||
{ |
|||
private SearchIpc ThatPage { get; set; } |
|||
|
|||
public ObservableCollection<IpcInfo> InfoList { get; set; } = new(); |
|||
|
|||
private ReaderWriterLockSlim InfoListrwl { get; } = new(); |
|||
|
|||
#region Parameter
|
|||
|
|||
public ObservableCollection<NvrInfo> NvrInfoList { get; set; } = new(); |
|||
|
|||
public NvrInfo SelectedNvrInfo { get; set; } |
|||
|
|||
private string _userName { get; set; } |
|||
|
|||
public string UserName |
|||
{ get { return _userName; } set { _userName = value; RaisePropertyChanged(nameof(UserName)); } } |
|||
|
|||
private string _password { get; set; } |
|||
|
|||
public string Password |
|||
{ get { return _password; } set { _password = value; RaisePropertyChanged(nameof(Password)); } } |
|||
|
|||
public ObservableCollection<System.Net.NetworkInformation.NetworkInterface> NetworkCardList { get; set; } = new(); |
|||
|
|||
public System.Net.NetworkInformation.NetworkInterface SelectedNetworkCard { get; set; } |
|||
|
|||
public ObservableCollection<int> TimeoutList { get; set; } = new(); |
|||
|
|||
public int SelectedTimeout { get; set; } |
|||
|
|||
#endregion Parameter
|
|||
|
|||
#region Command
|
|||
|
|||
public DelegateCommand<UserControl> LoadedCommand { get; private set; } |
|||
|
|||
public ExtendCommand<SelectionChangedEventArgs> NvrInfoComboBoxSelectionChangedCommand { get; private set; } |
|||
|
|||
public DelegateCommand RefreshCommand { get; private set; } |
|||
|
|||
public DelegateCommand BroadcastSearchCommand { get; private set; } |
|||
|
|||
public DelegateCommand UnicastSearchCommand { get; private set; } |
|||
|
|||
public DelegateCommand GainAllCommand { get; private set; } |
|||
|
|||
public DelegateCommand GainSelectedCommand { get; private set; } |
|||
|
|||
public DelegateCommand PublishAllCommand { get; private set; } |
|||
|
|||
public DelegateCommand PublishSelectedCommand { get; private set; } |
|||
|
|||
#endregion Command
|
|||
|
|||
public SearchIpcViewModel(IRegionManager regionManager, IEventAggregator ea) : base(regionManager, ea) |
|||
{ |
|||
LoadedCommand = new DelegateCommand<UserControl>(LoadedPageAction); |
|||
NvrInfoComboBoxSelectionChangedCommand = new ExtendCommand<SelectionChangedEventArgs>(NvrInfoComboBoxSelectionChangedAction); |
|||
|
|||
RefreshCommand = new DelegateCommand(RefreshAction); |
|||
BroadcastSearchCommand = new DelegateCommand(BroadcastSearchAction); |
|||
UnicastSearchCommand = new DelegateCommand(UnicastSearchAction); |
|||
GainAllCommand = new DelegateCommand(GainAllAction); |
|||
GainSelectedCommand = new DelegateCommand(GainSelectedAction); |
|||
PublishAllCommand = new DelegateCommand(PublishAllIpcInfoAction); |
|||
PublishSelectedCommand = new DelegateCommand(PublishSelectedIpcInfoAction); |
|||
} |
|||
|
|||
#region Event Action
|
|||
|
|||
private void LoadedPageAction(UserControl view) |
|||
{ |
|||
if (ThatPage != null) { return; } |
|||
ThatPage = (SearchIpc)view; |
|||
RefreshAction(); |
|||
} |
|||
|
|||
private void NvrInfoComboBoxSelectionChangedAction(SelectionChangedEventArgs e) |
|||
{ |
|||
NvrInfo selectedNvrInfo = (NvrInfo)ThatPage.NvrInfoComboBox.SelectedItem; |
|||
UserName = selectedNvrInfo?.UserName; |
|||
Password = selectedNvrInfo?.UserPwd; |
|||
} |
|||
|
|||
#endregion Event Action
|
|||
|
|||
#region Operate Action
|
|||
|
|||
private void RefreshAction() |
|||
{ |
|||
OperateInfoListByLock(() => |
|||
{ |
|||
LoadNvrInfoList(); |
|||
LoadNetworkCardList(); |
|||
LoadTimeoutList(); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 广播搜索
|
|||
/// </summary>
|
|||
private void BroadcastSearchAction() |
|||
{ |
|||
OperateInfoListByLock(async () => |
|||
{ |
|||
InfoList.Clear(); |
|||
Discovery onvifDiscovery = new(); |
|||
IEnumerable<DiscoveryDevice> deviceList = await onvifDiscovery.DiscoverByAdapter(new[] { SelectedNetworkCard }, SelectedTimeout); |
|||
foreach (DiscoveryDevice device in deviceList) |
|||
{ |
|||
IpcInfo info = new(); |
|||
info.IpcType = device.Mfr; |
|||
info.IpcIp = device.Address; |
|||
info.OnvifAddr = device.XAdresses.Count > 0 ? device.XAdresses[0] : string.Empty; |
|||
info.IpcEnableBool = true; |
|||
InfoList.Add(info); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 单播搜索
|
|||
/// </summary>
|
|||
private void UnicastSearchAction() |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 获取所有
|
|||
/// </summary>
|
|||
private void GainAllAction() |
|||
{ |
|||
OperateInfoListByLock(async () => |
|||
{ |
|||
foreach (IpcInfo info in InfoList) |
|||
{ |
|||
if (!VerifyUnit.CheckIp(info.IpcIp)) |
|||
{ |
|||
continue; |
|||
} |
|||
await GainInfo(info); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 获取选中
|
|||
/// </summary>
|
|||
private void GainSelectedAction() |
|||
{ |
|||
OperateInfoListByLock(async () => |
|||
{ |
|||
IpcInfo info = (IpcInfo)ThatPage.InfoGrid.SelectedItem; |
|||
if (info == null) { return; } |
|||
await GainInfo(info); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 添加所有
|
|||
/// </summary>
|
|||
private void PublishAllIpcInfoAction() |
|||
{ |
|||
List<IpcInfo> list = new(); |
|||
string nvrName = SelectedNvrInfo.NvrName; |
|||
foreach (IpcInfo item in InfoList) |
|||
{ |
|||
IpcInfo info = item.DeepCopy<IpcInfo>(); |
|||
info.NvrName = nvrName; |
|||
list.Add(info); |
|||
} |
|||
_ea.GetEvent<SendIpcInfoListEvent>().Publish(list); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 添加当前
|
|||
/// </summary>
|
|||
private void PublishSelectedIpcInfoAction() |
|||
{ |
|||
IpcInfo item = (IpcInfo)ThatPage.InfoGrid.SelectedItem; |
|||
if (item == null) { return; } |
|||
List<IpcInfo> list = new(); |
|||
string nvrName = SelectedNvrInfo.NvrName; |
|||
IpcInfo info = item.DeepCopy<IpcInfo>(); |
|||
info.NvrName = nvrName; |
|||
list.Add(info); |
|||
_ea.GetEvent<SendIpcInfoListEvent>().Publish(list); |
|||
} |
|||
|
|||
#endregion Operate Action
|
|||
|
|||
#region Operate List
|
|||
|
|||
private void OperateInfoListByLock(Action action) |
|||
{ |
|||
if (InfoListrwl.IsWriteLockHeld) { return; } |
|||
if (!InfoListrwl.TryEnterWriteLock(100)) { return; } |
|||
try |
|||
{ |
|||
action?.Invoke(); |
|||
} |
|||
finally |
|||
{ |
|||
InfoListrwl.ExitWriteLock(); |
|||
} |
|||
} |
|||
|
|||
private async void LoadNvrInfoList() |
|||
{ |
|||
NvrInfoList.Clear(); |
|||
using NvrInfoContext ctx = new(); |
|||
List<NvrInfo> list = await ctx.GetListAsync(); |
|||
list.ForEach(info => NvrInfoList.Add(info)); |
|||
ThatPage.NvrInfoComboBox.SelectedIndex = 0; |
|||
} |
|||
|
|||
private void LoadNetworkCardList() |
|||
{ |
|||
NetworkCardList.Clear(); |
|||
IEnumerable<System.Net.NetworkInformation.NetworkInterface> adapterList = OnvifUdpClient.GetVaildNetworkAdapters(); |
|||
foreach (System.Net.NetworkInformation.NetworkInterface adapter in adapterList) |
|||
{ |
|||
NetworkCardList.Add(adapter); |
|||
} |
|||
ThatPage.NetworkCardComboBox.SelectedIndex = 0; |
|||
} |
|||
|
|||
private void LoadTimeoutList() |
|||
{ |
|||
TimeoutList.Clear(); |
|||
TimeoutList.Add(2); |
|||
TimeoutList.Add(5); |
|||
TimeoutList.Add(10); |
|||
TimeoutList.Add(15); |
|||
TimeoutList.Add(30); |
|||
ThatPage.TimeoutComboBox.SelectedIndex = 0; |
|||
} |
|||
|
|||
#endregion Operate List
|
|||
|
|||
#region Helper
|
|||
|
|||
private StreamSetup RtspStreamSetup { get; } = new() |
|||
{ |
|||
Stream = StreamType.RTPUnicast, |
|||
Transport = new() { Protocol = TransportProtocol.RTSP } |
|||
}; |
|||
|
|||
private async Task GainInfo(IpcInfo info) |
|||
{ |
|||
bool isMediaGain = info.IsUriGain(info.MediaAddr); |
|||
bool isPtzGain = info.IsUriGain(info.PtzAddr); |
|||
bool isRtspGain = info.IsUriGain(info.RtspMain) || info.IsUriGain(info.RtspSub); |
|||
|
|||
if (!isMediaGain || !isPtzGain) |
|||
{ |
|||
try |
|||
{ |
|||
DeviceClient device = await OnvifClientFactory.CreateDeviceClientAsync(info.IpcIp, UserName, Password); |
|||
if (string.IsNullOrEmpty(info.IpcType)) |
|||
{ |
|||
GetDeviceInformationResponse resp = await device.GetDeviceInformationAsync(new()); |
|||
info.SetValue("IpcType", resp.Manufacturer); |
|||
} |
|||
GetCapabilitiesResponse caps; |
|||
if (!isMediaGain) |
|||
{ |
|||
caps = await device.GetCapabilitiesAsync(new[] { CapabilityCategory.Media }); |
|||
info.SetValue("MediaAddr", caps.Capabilities.Media.XAddr); |
|||
}; |
|||
if (!isPtzGain) |
|||
{ |
|||
caps = await device.GetCapabilitiesAsync(new[] { CapabilityCategory.PTZ }); |
|||
info.SetValue("PtzAddr", caps.Capabilities.PTZ.XAddr); |
|||
}; |
|||
} |
|||
catch (Exception) |
|||
{ |
|||
} |
|||
finally |
|||
{ |
|||
if (!info.IsUriGain(info.MediaAddr)) { info.SetValue("MediaAddr", info.FaultUri); } |
|||
if (!info.IsUriGain(info.PtzAddr)) { info.SetValue("PtzAddr", info.FaultUri); } |
|||
} |
|||
} |
|||
|
|||
if (!isRtspGain) |
|||
{ |
|||
try |
|||
{ |
|||
MediaClient media = await OnvifClientFactory.CreateMediaClientAsync(info.IpcIp, UserName, Password); |
|||
info.SetValue("UserName", UserName); |
|||
info.SetValue("UserPwd", Password); |
|||
GetProfilesResponse profiles = await media.GetProfilesAsync(); |
|||
string profileToken; |
|||
if (profiles.Profiles.Length >= 1) |
|||
{ |
|||
profileToken = profiles.Profiles[0].token; |
|||
MediaUri streamUri = await media.GetStreamUriAsync(RtspStreamSetup, profileToken); |
|||
info.SetValue("RtspMain", streamUri.Uri); |
|||
} |
|||
if (profiles.Profiles.Length >= 2) |
|||
{ |
|||
profileToken = profiles.Profiles[1].token; |
|||
MediaUri streamUri = await media.GetStreamUriAsync(RtspStreamSetup, profileToken); |
|||
info.SetValue("RtspSub", streamUri.Uri); |
|||
} |
|||
} |
|||
catch (Exception) |
|||
{ |
|||
} |
|||
finally |
|||
{ |
|||
if (!info.IsUriGain(info.RtspMain)) { info.SetValue("RtspMain", info.FaultUri); } |
|||
if (!info.IsUriGain(info.RtspSub)) { info.SetValue("RtspSub", info.FaultUri); } |
|||
} |
|||
} |
|||
} |
|||
|
|||
#endregion Helper
|
|||
} |
|||
} |
@ -0,0 +1,21 @@ |
|||
<UserControl x:Class="ECMonitor.Page.Test.Main" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:prism="http://prismlibrary.com/" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
prism:ViewModelLocator.AutoWireViewModel="True" |
|||
mc:Ignorable="d" |
|||
d:DesignHeight="450" d:DesignWidth="800"> |
|||
<Grid> |
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width="200" /> |
|||
<ColumnDefinition Width="*" /> |
|||
</Grid.ColumnDefinitions> |
|||
<!--<ContentControl Grid.Column="0" />--> |
|||
<TextBlock Grid.Column="0" Text="ViewTest" FontSize="48" HorizontalAlignment="Center" VerticalAlignment="Center" /> |
|||
<ContentControl Grid.Column="1" /> |
|||
<!--<ContentControl Grid.Column="0" prism:RegionManager.RegionName="ContentRegionLeft" />--> |
|||
<!--<ContentControl Grid.Column="1" prism:RegionManager.RegionName="ContentRegionCenter" />--> |
|||
</Grid> |
|||
</UserControl> |
@ -0,0 +1,15 @@ |
|||
using System.Windows.Controls; |
|||
|
|||
namespace ECMonitor.Page.Test |
|||
{ |
|||
/// <summary>
|
|||
/// FrmSetMain.xaml 的交互逻辑
|
|||
/// </summary>
|
|||
public partial class Main : UserControl |
|||
{ |
|||
public Main() |
|||
{ |
|||
InitializeComponent(); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,16 @@ |
|||
using ECMonitor.Code.Models; |
|||
using Prism.Events; |
|||
using Prism.Regions; |
|||
|
|||
namespace ECMonitor.Page.Test |
|||
{ |
|||
public class MainViewModel : BaseModel |
|||
{ |
|||
private IEventAggregator _ea; |
|||
|
|||
public MainViewModel(IRegionManager regionManager, IEventAggregator ea) : base(regionManager, ea) |
|||
{ |
|||
_ea = ea; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,275 @@ |
|||
using Microsoft.Win32; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.IO; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using System.Windows; |
|||
using System.Windows.Controls; |
|||
using System.Windows.Controls.Primitives; |
|||
using System.Windows.Media; |
|||
|
|||
namespace ECMonitor.PlayerDraw.Code |
|||
{ |
|||
public enum ColorEnum |
|||
{ |
|||
绿色, |
|||
黄色, |
|||
红色, |
|||
白色, |
|||
青色, |
|||
蓝色, |
|||
紫色, |
|||
黑色, |
|||
灰色, |
|||
橙色 |
|||
} |
|||
/// <summary>
|
|||
/// 表示部分音频文件的类型
|
|||
/// </summary>
|
|||
public enum FileTypes |
|||
{ |
|||
MKV = 2669, |
|||
MP4 = 00, |
|||
INI = 255254, |
|||
MP3 = 7368, |
|||
WAV = 8273, |
|||
WMA = 4838, |
|||
AVI = 8273, |
|||
WMV = 4838, |
|||
|
|||
} |
|||
public class BlackboardClass |
|||
{ |
|||
/// <summary>
|
|||
/// 初始化BlackboardClass
|
|||
/// </summary>
|
|||
public BlackboardClass() |
|||
{ |
|||
|
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 添加或删除启动项
|
|||
/// </summary>
|
|||
/// <param name="isStart">true为添加启动项,否则为删除启动项</param>
|
|||
/// <param name="startName">启动项的名称</param>
|
|||
/// <param name="applicationPath">要开机启动的应用程序的exe文件的路径</param>
|
|||
/// <returns>表示是否完成添加或删除任务</returns>
|
|||
public static bool RunItem(bool isStart, string startName, string applicationPath) |
|||
{ |
|||
bool result = true; |
|||
RegistryKey HKLM = Registry.CurrentUser; |
|||
RegistryKey run = HKLM.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\"); |
|||
|
|||
if (isStart) |
|||
{ |
|||
try |
|||
{ |
|||
run.SetValue(startName, applicationPath); |
|||
HKLM.Close(); |
|||
} |
|||
catch (Exception) |
|||
{ |
|||
|
|||
|
|||
} |
|||
} |
|||
else |
|||
{ |
|||
try |
|||
{ |
|||
run.DeleteValue(startName); |
|||
HKLM.Close(); |
|||
} |
|||
catch (Exception) |
|||
{ |
|||
|
|||
|
|||
} |
|||
} |
|||
result = run.GetValue("智能版") != null; |
|||
HKLM.Close(); |
|||
|
|||
return result; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 初始化BlackboardClass
|
|||
/// </summary>
|
|||
/// <param name="moveControl">要移动的控件</param>
|
|||
public BlackboardClass(UserControl moveControl) |
|||
{ |
|||
MoveControl = moveControl; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 要移动的控件
|
|||
/// </summary>
|
|||
public UserControl MoveControl { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 提供一个Thumb在Grid上的DragDelta处理程序
|
|||
/// </summary>
|
|||
/// <param name="sender"></param>
|
|||
/// <param name="e"></param>
|
|||
public void ThumbMove(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) |
|||
{ |
|||
if (MoveControl != null) |
|||
{ |
|||
double top = MoveControl.Margin.Top + e.VerticalChange,//上边距
|
|||
left = MoveControl.Margin.Left + e.HorizontalChange;//左边距
|
|||
MoveControl.Margin = new System.Windows.Thickness(left, top, 0, 0); |
|||
} |
|||
} |
|||
|
|||
public static bool IsAudio(string path) |
|||
{ |
|||
FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read); |
|||
BinaryReader read = new BinaryReader(fileStream); |
|||
|
|||
byte code; |
|||
string fileTypeCode = String.Empty; |
|||
|
|||
try |
|||
{ |
|||
for (int i = 0; i < 2; i++) |
|||
{ |
|||
code = read.ReadByte(); |
|||
fileTypeCode += code.ToString(); |
|||
} |
|||
} |
|||
catch (Exception) |
|||
{ |
|||
|
|||
return false; |
|||
} |
|||
fileStream.Close(); |
|||
read.Close(); |
|||
|
|||
int tryVal; |
|||
return !Int32.TryParse(((FileTypes)Enum.Parse(typeof(FileTypes), fileTypeCode)).ToString(), out tryVal); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 改变颜色
|
|||
/// </summary>
|
|||
/// <param name="color">要返回的颜色</param>
|
|||
public static Color ChangeColor(ColorEnum color) |
|||
{ |
|||
switch (color) |
|||
{ |
|||
case ColorEnum.白色: |
|||
return Colors.White; |
|||
case ColorEnum.黄色: |
|||
return Colors.Yellow; |
|||
case ColorEnum.黑色: |
|||
return Colors.Black; |
|||
case ColorEnum.红色: |
|||
return Colors.Red; |
|||
case ColorEnum.灰色: |
|||
return Colors.Gray; |
|||
case ColorEnum.蓝色: |
|||
return Colors.Blue; |
|||
case ColorEnum.绿色: |
|||
return Colors.Green; |
|||
case ColorEnum.青色: |
|||
return Colors.Cyan; |
|||
case ColorEnum.紫色: |
|||
return Colors.Purple; |
|||
case ColorEnum.橙色: |
|||
return Colors.Orange; |
|||
default: |
|||
return new Color(); |
|||
} |
|||
} |
|||
|
|||
public void ChangSize(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) |
|||
{ |
|||
double wibth = this.MoveControl.ActualWidth; |
|||
double heigth = this.MoveControl.ActualHeight; |
|||
switch ((sender as Thumb).Name) |
|||
{ |
|||
case "LeftTop": |
|||
double left = MoveControl.Margin.Left, |
|||
top = MoveControl.Margin.Top; |
|||
|
|||
if (MoveControl.ActualWidth - e.HorizontalChange <= this.MoveControl.MaxWidth && |
|||
MoveControl.ActualWidth - e.HorizontalChange >= this.MoveControl.MinWidth) |
|||
{ |
|||
wibth = MoveControl.ActualWidth - e.HorizontalChange; |
|||
left = MoveControl.Margin.Left + e.HorizontalChange; |
|||
} |
|||
|
|||
if (MoveControl.ActualHeight - e.VerticalChange <= this.MoveControl.MaxHeight && |
|||
MoveControl.ActualHeight - e.VerticalChange >= this.MoveControl.MinHeight) |
|||
{ |
|||
heigth = MoveControl.ActualHeight - e.VerticalChange; |
|||
top = MoveControl.Margin.Top + e.VerticalChange; |
|||
} |
|||
|
|||
MoveControl.Margin = new Thickness(left, top, 0, 0); |
|||
break; |
|||
case "LeftBottom": |
|||
left = this.MoveControl.Margin.Left; |
|||
double bottom = this.MoveControl.Margin.Bottom; |
|||
|
|||
if (MoveControl.ActualWidth - e.HorizontalChange <= this.MoveControl.MaxWidth && |
|||
MoveControl.ActualWidth - e.HorizontalChange >= this.MoveControl.MinWidth) |
|||
{ |
|||
wibth = MoveControl.ActualWidth - e.HorizontalChange; |
|||
left = MoveControl.Margin.Left + e.HorizontalChange; |
|||
} |
|||
|
|||
if (MoveControl.ActualHeight + e.VerticalChange <= this.MoveControl.MaxHeight && |
|||
MoveControl.ActualHeight + e.VerticalChange >= this.MoveControl.MinHeight) |
|||
{ |
|||
heigth = MoveControl.ActualHeight + e.VerticalChange; |
|||
bottom = MoveControl.Margin.Bottom - e.VerticalChange; |
|||
} |
|||
MoveControl.Margin = new Thickness(left, MoveControl.Margin.Top, 0, bottom); |
|||
break; |
|||
case "RightTop": |
|||
top = this.MoveControl.Margin.Top; |
|||
|
|||
if (MoveControl.ActualWidth + e.HorizontalChange <= this.MoveControl.MaxWidth && |
|||
MoveControl.ActualWidth + e.HorizontalChange >= this.MoveControl.MinWidth) |
|||
wibth = MoveControl.ActualWidth + e.HorizontalChange; |
|||
|
|||
if (MoveControl.ActualHeight - e.VerticalChange <= this.MoveControl.MaxHeight && |
|||
MoveControl.ActualHeight - e.VerticalChange >= this.MoveControl.MinHeight) |
|||
{ |
|||
heigth = MoveControl.ActualHeight - e.VerticalChange; |
|||
top = MoveControl.Margin.Top + e.VerticalChange; |
|||
} |
|||
|
|||
MoveControl.Margin = new Thickness(MoveControl.Margin.Left, |
|||
top, 0, MoveControl.Margin.Bottom); |
|||
break; |
|||
default: |
|||
double right = this.MoveControl.Margin.Right; |
|||
bottom = this.MoveControl.Margin.Bottom; |
|||
|
|||
if (MoveControl.ActualWidth + e.HorizontalChange <= this.MoveControl.MaxWidth && |
|||
MoveControl.ActualWidth + e.HorizontalChange >= this.MoveControl.MinWidth) |
|||
{ |
|||
wibth = MoveControl.ActualWidth + e.HorizontalChange; |
|||
right = MoveControl.Margin.Right - e.HorizontalChange; |
|||
} |
|||
|
|||
if (MoveControl.ActualHeight + e.VerticalChange <= this.MoveControl.MaxHeight && |
|||
MoveControl.ActualHeight + e.VerticalChange >= this.MoveControl.MinHeight) |
|||
{ |
|||
heigth = MoveControl.ActualHeight + e.VerticalChange; |
|||
bottom = this.MoveControl.Margin.Bottom - e.VerticalChange; |
|||
} |
|||
MoveControl.Margin = new Thickness(MoveControl.Margin.Left, |
|||
MoveControl.Margin.Top, right, bottom); |
|||
break; |
|||
} |
|||
MoveControl.Width = wibth; |
|||
MoveControl.Height = heigth; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,117 @@ |
|||
using EC.Entity.Warning; |
|||
using Prism.Mvvm; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Diagnostics; |
|||
using System.IO; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using System.Xml.Serialization; |
|||
|
|||
namespace ECMonitor.PlayerDraw.Code |
|||
{ |
|||
/// <summary>
|
|||
/// 记录Blackboard的相关数据
|
|||
/// </summary>
|
|||
[Serializable] |
|||
public class BlackboardData : BindableBase |
|||
{ |
|||
public BlackboardData() |
|||
{ |
|||
|
|||
|
|||
} |
|||
|
|||
|
|||
private double lineWidthValue = 5D; |
|||
private int lineColor = (int)ColorEnum.红色; |
|||
private bool? isRun = true; |
|||
private int blackboardColor = (int)ColorEnum.绿色; |
|||
|
|||
/// <summary>
|
|||
/// 黑板颜色
|
|||
/// </summary>
|
|||
public int BlackboardColor |
|||
{ |
|||
get { return blackboardColor; } |
|||
set{ SetProperty(ref blackboardColor, value); } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 表示是否开机启动此程序
|
|||
/// </summary>
|
|||
public bool? IsRun |
|||
{ |
|||
get |
|||
{ |
|||
return isRun; |
|||
} |
|||
set |
|||
{ |
|||
isRun = BlackboardClass.RunItem(value.Value, "视频监控", Process.GetCurrentProcess().MainModule.FileName); |
|||
|
|||
SetProperty(ref isRun, value); |
|||
} |
|||
} |
|||
|
|||
[NonSerialized] |
|||
private int drawType =5;//画图类型
|
|||
|
|||
/// <summary>
|
|||
/// 画图类型
|
|||
/// </summary>
|
|||
public int DrawType |
|||
{ |
|||
get { return drawType; } |
|||
set |
|||
{ |
|||
SetProperty(ref drawType, value); |
|||
} |
|||
} |
|||
|
|||
[NonSerialized] |
|||
private bool? draw = false;//绘图模式是否已启动
|
|||
|
|||
/// <summary>
|
|||
/// 绘图模式是否已启动
|
|||
/// </summary>
|
|||
|
|||
public bool? Draw |
|||
{ |
|||
get { return draw; } |
|||
set |
|||
{ |
|||
SetProperty(ref draw, value); |
|||
|
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 线条的颜色
|
|||
/// </summary>
|
|||
public int LineColor |
|||
{ |
|||
get { return lineColor; } |
|||
set |
|||
{ |
|||
SetProperty(ref lineColor, value); |
|||
} |
|||
} |
|||
/// <summary>
|
|||
/// 线条粗细的值
|
|||
/// </summary>
|
|||
public double LineWidthValue |
|||
{ |
|||
get { return lineWidthValue; } |
|||
set |
|||
{ |
|||
SetProperty(ref lineWidthValue, value); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
} |
|||
} |
@ -0,0 +1,67 @@ |
|||
using Prism.Mvvm; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.ComponentModel; |
|||
using System.IO; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace ECMonitor.PlayerDraw.Code |
|||
{ |
|||
/// <summary>
|
|||
/// 数据模型基类
|
|||
/// </summary>
|
|||
[Serializable] |
|||
public abstract class DataBase : BindableBase, INotifyPropertyChanged |
|||
{ |
|||
public DataBase(string fileName) |
|||
{ |
|||
string directory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), |
|||
"Computer Madman"); |
|||
if (!Directory.Exists(directory)) |
|||
Directory.CreateDirectory(directory); |
|||
DataPath = Path.Combine(directory, fileName); |
|||
} |
|||
|
|||
[NonSerialized] |
|||
string dataPath; |
|||
|
|||
/// <summary>
|
|||
/// 保存文件的路径
|
|||
/// </summary>
|
|||
public string DataPath |
|||
{ |
|||
get |
|||
{ |
|||
return dataPath; |
|||
} |
|||
set |
|||
{ |
|||
dataPath = value; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 在更改属性值时发生。
|
|||
/// </summary>
|
|||
public event PropertyChangedEventHandler PropertyChanged; |
|||
|
|||
/// <summary>
|
|||
/// 用于触发INotifyPropertyChanged的PropertyChanged事件
|
|||
/// </summary>
|
|||
/// <param name="propertyName">属性名</param>
|
|||
protected void DataChanged(string propertyName) |
|||
{ |
|||
if (PropertyChanged != null) |
|||
PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); |
|||
} |
|||
|
|||
private string _title = ""; |
|||
public string Title |
|||
{ |
|||
get { return _title; } |
|||
set { SetProperty(ref _title, value); } |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,195 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using System.Windows.Controls; |
|||
using System.Windows.Ink; |
|||
using System.Windows.Input; |
|||
using System.Windows.Media; |
|||
|
|||
namespace ECMonitor.PlayerDraw.Code |
|||
{ |
|||
|
|||
/// <summary>
|
|||
/// 画图类
|
|||
/// </summary>
|
|||
public class Draw |
|||
{ |
|||
/// <summary>
|
|||
/// 初始化对象
|
|||
/// </summary>
|
|||
/// <param name="broad">画布</param>
|
|||
public Draw(InkCanvas broad) |
|||
{ |
|||
this.broad = broad; |
|||
|
|||
arcs = new StylusPointCollection[8]; |
|||
for (int i = 0; i < arcs.Length; i++) |
|||
{ |
|||
arcs[i] = new StylusPointCollection(); |
|||
} |
|||
} |
|||
|
|||
InkCanvas broad; |
|||
|
|||
|
|||
public StrokeEx Line(StylusPoint a, StylusPoint b, int warningLevel) |
|||
{ |
|||
StylusPointCollection points = new StylusPointCollection { a, b }; |
|||
StrokeEx line = new StrokeEx(points); |
|||
line.DrawType = DrawTypes.线段; |
|||
line.WarningLevel = warningLevel; |
|||
line.DrawingAttributes = broad.DefaultDrawingAttributes.Clone(); |
|||
line.DrawingAttributes.Color = BlackboardClass.ChangeColor((ColorEnum)warningLevel); |
|||
return line; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 以矩形的两个对角坐标为根据画矩形
|
|||
/// </summary>
|
|||
/// <param name="a">一个顶点坐标</param>
|
|||
/// <param name="c">与a相对点的坐标</param>
|
|||
/// <returns></returns>
|
|||
public StrokeEx Rectangle(StylusPoint a, StylusPoint c,int warningLevel) |
|||
{ |
|||
StylusPoint b = new StylusPoint(c.X, a.Y), |
|||
d = new StylusPoint(a.X, c.Y); |
|||
StylusPointCollection points = new StylusPointCollection { a, b, c, d, a }; |
|||
StrokeEx rectangle = new StrokeEx(points); |
|||
rectangle.DrawType = DrawTypes.矩形; |
|||
rectangle.WarningLevel = warningLevel; |
|||
rectangle.DrawingAttributes = broad.DefaultDrawingAttributes.Clone(); |
|||
rectangle.DrawingAttributes.StylusTip = StylusTip.Rectangle; |
|||
rectangle.DrawingAttributes.Color = BlackboardClass.ChangeColor((ColorEnum)warningLevel); |
|||
return rectangle; |
|||
} |
|||
|
|||
|
|||
/// <summary>
|
|||
/// 绘制三角形
|
|||
/// </summary>
|
|||
/// <param name="a">点a</param>
|
|||
/// <param name="b">点b</param>
|
|||
/// <param name="c">点c</param>
|
|||
/// <returns></returns>
|
|||
public Stroke Triangle(StylusPoint a, StylusPoint b, StylusPoint c) |
|||
{ |
|||
StylusPointCollection points = new StylusPointCollection { a, b, c, a }; |
|||
StrokeEx triangle = new StrokeEx(points); |
|||
triangle.DrawType = DrawTypes.三角形; |
|||
triangle.DrawingAttributes = broad.DefaultDrawingAttributes.Clone(); |
|||
|
|||
return triangle; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 绘制多边形
|
|||
/// </summary>
|
|||
/// <param name="points">多边形的顶点</param>
|
|||
/// <returns></returns>
|
|||
public Stroke Polygon(StylusPointCollection points, int warningLevel) |
|||
{ |
|||
points.Add(points[0]); |
|||
StrokeEx polygon = new StrokeEx(points); |
|||
polygon.DrawType = DrawTypes.多边形; |
|||
polygon.WarningLevel = warningLevel; |
|||
polygon.DrawingAttributes = broad.DefaultDrawingAttributes.Clone(); |
|||
polygon.DrawingAttributes.Color = BlackboardClass.ChangeColor((ColorEnum)warningLevel); |
|||
return polygon; |
|||
|
|||
|
|||
} |
|||
public Stroke Lines(StylusPointCollection points, int warningLevel) |
|||
{ |
|||
|
|||
StrokeEx polygon = new StrokeEx(points); |
|||
polygon.DrawType = DrawTypes.多边形; |
|||
polygon.WarningLevel = warningLevel; |
|||
polygon.DrawingAttributes = broad.DefaultDrawingAttributes.Clone(); |
|||
polygon.DrawingAttributes.Color = BlackboardClass.ChangeColor((ColorEnum)warningLevel); |
|||
return polygon; |
|||
|
|||
|
|||
} |
|||
|
|||
public Stroke Circle(StylusPoint o, StylusPoint p,int warningLevel) |
|||
{ |
|||
StylusPointCollection points = OriginalArc(o, p); |
|||
|
|||
|
|||
|
|||
StrokeEx circle = new StrokeEx(points); |
|||
circle.DrawType = DrawTypes.圆; |
|||
circle.WarningLevel = warningLevel; |
|||
circle.DrawingAttributes = broad.DefaultDrawingAttributes.Clone(); |
|||
circle.DrawingAttributes.Color = BlackboardClass.ChangeColor((ColorEnum)warningLevel); |
|||
for (int i = 0; i < arcs.Length; i++) |
|||
{ |
|||
arcs[i] = new StylusPointCollection(); |
|||
} |
|||
return circle; |
|||
} |
|||
|
|||
private StylusPointCollection OriginalArc(StylusPoint o, StylusPoint p) |
|||
{ |
|||
|
|||
StylusPointCollection points = new StylusPointCollection(); |
|||
|
|||
double r = |
|||
Math.Sqrt(Math.Pow(p.X - o.X, 2) + Math.Pow(p.Y - o.Y, 2));//该圆的半径
|
|||
double d = 3 - 2 * r; |
|||
StylusPoint motionPoint = new StylusPoint(); |
|||
motionPoint.X = 0; |
|||
motionPoint.Y = r; |
|||
CirclePoints(o, motionPoint); |
|||
while (motionPoint.X < motionPoint.Y) |
|||
{ |
|||
if (d < 0) |
|||
d = d + 4 * motionPoint.X + 6; |
|||
else |
|||
{ |
|||
d = d + 4 * (motionPoint.X - motionPoint.Y) + 10; |
|||
motionPoint.Y--; |
|||
|
|||
} |
|||
motionPoint.X++; |
|||
CirclePoints(o, motionPoint); |
|||
} |
|||
for (int i = 0; i < arcs.Length; i++) |
|||
{ |
|||
if (i % 2 != 0) |
|||
{ |
|||
for (int index = arcs[i].Count - 1; index >= 0; index--) |
|||
{ |
|||
points.Add(arcs[i][index]); |
|||
} |
|||
} |
|||
else |
|||
points.Add(arcs[i]); |
|||
} |
|||
return points; |
|||
} |
|||
StylusPointCollection[] arcs;//表示一个圆的八个弧
|
|||
|
|||
private void CirclePoints(StylusPoint o, StylusPoint p) |
|||
{ |
|||
arcs[0].Add(new StylusPoint(p.X + o.X, p.Y + o.Y)); |
|||
arcs[1].Add(new StylusPoint(p.Y + o.X, p.X + o.Y)); |
|||
arcs[2].Add(new StylusPoint(-p.Y + o.X, p.X + o.Y)); |
|||
arcs[3].Add(new StylusPoint(-p.X + o.X, p.Y + o.Y)); |
|||
arcs[4].Add(new StylusPoint(-p.X + o.X, -p.Y + o.Y)); |
|||
arcs[5].Add(new StylusPoint(-p.Y + o.X, -p.X + o.Y)); |
|||
arcs[6].Add(new StylusPoint(p.Y + o.X, -p.X + o.Y)); |
|||
arcs[7].Add(new StylusPoint(p.X + o.X, -p.Y + o.Y)); |
|||
} |
|||
} |
|||
} |
|||
/* |
|||
备注: |
|||
*网上关于“中点画圆法”的弧上点位置的说法只适用于单纯用点画圆, |
|||
而不适用于用线来画圆。 |
|||
* 我的方法是,创建一个字段,用来存储圆的坐标,当遇到奇数弧时坐标列表从后往前 |
|||
存储。 |
|||
*/ |
|||
|
@ -0,0 +1,17 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace ECMonitor.PlayerDraw.Code |
|||
{ |
|||
public enum DrawTypes |
|||
{ |
|||
线段, |
|||
多边形, |
|||
矩形, |
|||
圆, |
|||
三角形 |
|||
} |
|||
} |
@ -0,0 +1,406 @@ |
|||
using EC.Entity.Warning; |
|||
using ECMonitor.Code.DB; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using System.Windows; |
|||
using System.Windows.Controls; |
|||
using System.Windows.Input; |
|||
using System.Windows.Media; |
|||
using System.Windows.Shapes; |
|||
|
|||
namespace ECMonitor.PlayerDraw.Code |
|||
{ |
|||
public class ECDrawing |
|||
{ |
|||
Button drawFinished; |
|||
Polygon drawPolygon;//预览多边形
|
|||
Rectangle circular;//预览圆
|
|||
InkCanvas writeBorad;//画布
|
|||
Grid contenter { get; set; }// 控件容器
|
|||
StylusPointCollection drawPoints { get; set; } = new StylusPointCollection();//添加到画布图像的点
|
|||
PointCollection drawingPoints { get; set; } = new PointCollection();//预览图形的点
|
|||
BlackboardData data { get; set; } |
|||
|
|||
|
|||
|
|||
public ECDrawing(BlackboardData data, Grid contenter, InkCanvas writeBorad) |
|||
{ |
|||
this.data = data; |
|||
this.contenter = contenter; |
|||
this.writeBorad = writeBorad; |
|||
|
|||
this.writeBorad.EditingModeChanged += writeBorad_EditingModeChanged; |
|||
this.data.PropertyChanged += data_PropertyChanged; |
|||
} |
|||
|
|||
void writeBorad_EditingModeChanged(object sender, RoutedEventArgs e) |
|||
{ |
|||
|
|||
StopDraw(); |
|||
} |
|||
|
|||
void data_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) |
|||
{ |
|||
if (drawPoints.Count() != 0 && (e.PropertyName == "DrawType" || e.PropertyName == "Draw")) |
|||
{ |
|||
StopDraw(); |
|||
} |
|||
} |
|||
|
|||
private void StopDraw() |
|||
{ |
|||
|
|||
drawPoints.Clear(); |
|||
if (drawPolygon != null) |
|||
{ |
|||
contenter.Children.Remove(drawPolygon); |
|||
drawPolygon = null; |
|||
} |
|||
if (circular != null) |
|||
{ |
|||
contenter.Children.Remove(circular); |
|||
drawPolygon = null; |
|||
} |
|||
if (drawFinished != null) |
|||
{ |
|||
contenter.Children.Remove(drawFinished); |
|||
drawFinished = null; |
|||
} |
|||
drawingPoints.Clear(); |
|||
} |
|||
|
|||
|
|||
|
|||
public void MouseLeftButtonUp(object sender, MouseButtonEventArgs e) |
|||
{ |
|||
if (this.data.Draw == true && writeBorad.EditingMode == InkCanvasEditingMode.None && |
|||
(drawPolygon != null || circular != null)) |
|||
{ |
|||
Draw createDraw = new Draw(writeBorad); |
|||
|
|||
Point point = e.GetPosition(writeBorad); |
|||
if (!drawingPoints.Contains(point)) |
|||
{ |
|||
drawPoints.Add(new StylusPoint(point.X, point.Y)); |
|||
drawingPoints.Add(point); |
|||
} |
|||
DrawTypes drawType = (DrawTypes)data.DrawType; |
|||
|
|||
switch (drawType) |
|||
{ |
|||
case DrawTypes.矩形: |
|||
if (drawPoints.Count == 2) |
|||
{ |
|||
|
|||
writeBorad.Strokes.Add(createDraw.Rectangle(drawPoints[0], drawPoints[1], data.LineColor)); |
|||
drawPoints.Clear(); |
|||
drawingPoints.Clear(); |
|||
contenter.Children.Remove(drawPolygon); |
|||
drawPolygon = null; |
|||
} |
|||
break; |
|||
case DrawTypes.线段: |
|||
if (drawPoints.Count == 2) |
|||
{ |
|||
writeBorad.Strokes.Add(createDraw.Line(drawPoints[0], drawPoints[1], data.LineColor)); |
|||
drawPoints.Clear(); |
|||
drawingPoints.Clear(); |
|||
contenter.Children.Remove(drawPolygon); |
|||
drawPolygon = null; |
|||
} |
|||
break; |
|||
case DrawTypes.圆: |
|||
if (drawPoints.Count == 2) |
|||
{ |
|||
writeBorad.Strokes.Add(createDraw.Circle(drawPoints[0], drawPoints[1], data.LineColor)); |
|||
drawPoints.Clear(); |
|||
drawingPoints.Clear(); |
|||
contenter.Children.Remove(circular); |
|||
circular = null; |
|||
} |
|||
break; |
|||
case DrawTypes.三角形: |
|||
if (drawPoints.Count == 3) |
|||
{ |
|||
writeBorad.Strokes.Add(createDraw.Triangle(drawPoints[0], drawPoints[1], drawPoints[2])); |
|||
drawPoints.Clear(); |
|||
drawingPoints.Clear(); |
|||
contenter.Children.Remove(drawPolygon); |
|||
drawPolygon = null; |
|||
} |
|||
break; |
|||
case DrawTypes.多边形: |
|||
if (drawFinished == null) |
|||
{ |
|||
drawFinished = new Button |
|||
{ |
|||
Content = "完成", |
|||
Background = Brushes.Green, |
|||
BorderBrush = Brushes.Black, |
|||
BorderThickness = new Thickness(1), |
|||
FontSize = 18, |
|||
Foreground = Brushes.Black, |
|||
VerticalAlignment = VerticalAlignment.Top, |
|||
HorizontalAlignment = HorizontalAlignment.Left, |
|||
}; |
|||
Panel.SetZIndex(drawFinished, 20); |
|||
drawFinished.Click += |
|||
delegate (object a, RoutedEventArgs b) |
|||
{ |
|||
drawPoints.RemoveAt(drawPoints.Count - 1); |
|||
writeBorad.Strokes.Add(createDraw.Polygon(drawPoints.Clone(), data.LineColor)); |
|||
drawPoints.Clear(); |
|||
drawingPoints.Clear(); |
|||
contenter.Children.Remove(drawPolygon); |
|||
drawPolygon = null; |
|||
contenter.Children.Remove(drawFinished); |
|||
drawFinished = null; |
|||
}; |
|||
contenter.Children.Add(drawFinished); |
|||
} |
|||
drawFinished.Margin = new Thickness(point.X, point.Y, 0, 0); |
|||
break; |
|||
//case DrawTypes.折线:
|
|||
// if (drawFinished == null)
|
|||
// {
|
|||
// drawFinished = new Button
|
|||
// {
|
|||
// Content = "完成",
|
|||
// Background = Brushes.Green,
|
|||
// BorderBrush = Brushes.Black,
|
|||
// BorderThickness = new Thickness(1),
|
|||
// FontSize = 18,
|
|||
// Foreground = Brushes.Black,
|
|||
// VerticalAlignment = VerticalAlignment.Top,
|
|||
// HorizontalAlignment = HorizontalAlignment.Left,
|
|||
// };
|
|||
// Panel.SetZIndex(drawFinished, 20);
|
|||
// drawFinished.Click +=
|
|||
// delegate (object a, RoutedEventArgs b)
|
|||
// {
|
|||
// drawPoints.RemoveAt(drawPoints.Count - 1);
|
|||
// writeBorad.Strokes.Add(createDraw.Lines(drawPoints.Clone(), data.LineColor));
|
|||
// drawPoints.Clear();
|
|||
// drawingPoints.Clear();
|
|||
// contenter.Children.Remove(drawPolygon);
|
|||
// drawPolygon = null;
|
|||
// contenter.Children.Remove(drawFinished);
|
|||
// drawFinished = null;
|
|||
// };
|
|||
// contenter.Children.Add(drawFinished);
|
|||
// }
|
|||
// drawFinished.Margin = new Thickness(point.X, point.Y, 0, 0);
|
|||
// break;
|
|||
} |
|||
writeBorad.IsEnabled = true; |
|||
|
|||
} |
|||
} |
|||
|
|||
public void MouseMove(object sender, MouseEventArgs e) |
|||
{ |
|||
if (e.LeftButton == MouseButtonState.Pressed && data.Draw == true && |
|||
writeBorad.EditingMode == InkCanvasEditingMode.None && contenter.IsMouseOver) |
|||
writeBorad.IsEnabled = false; |
|||
else writeBorad.IsEnabled = true; |
|||
if (drawPoints.Count != 0) |
|||
{ |
|||
Point point = new Point(e.GetPosition(writeBorad).X - 1, e.GetPosition(writeBorad).Y - 1); |
|||
DrawTypes drawType = (DrawTypes)data.DrawType; |
|||
if (drawType != DrawTypes.圆 && drawPolygon == null) |
|||
{ |
|||
|
|||
drawPolygon = new Polygon |
|||
{ |
|||
Stroke = Brushes.Black, |
|||
StrokeThickness = 2, |
|||
StrokeDashCap = PenLineCap.Square, |
|||
StrokeDashArray = new DoubleCollection { 6 } |
|||
}; |
|||
|
|||
} |
|||
switch (drawType) |
|||
{ |
|||
case DrawTypes.矩形: |
|||
if (drawPoints.Count == 1) |
|||
{ |
|||
Point a = new Point(drawPoints[0].X, drawPoints[0].Y); |
|||
PointCollection points = new PointCollection { a, new Point(a.X, point.Y), point, new Point(point.X, a.Y) }; |
|||
drawPolygon.Points = points.Clone(); |
|||
if (!drawPolygon.IsLoaded) |
|||
contenter.Children.Add(drawPolygon); |
|||
} |
|||
break; |
|||
case DrawTypes.线段: |
|||
if (drawPoints.Count == 1) |
|||
{ |
|||
PointCollection points = new PointCollection |
|||
{ |
|||
new Point(drawPoints[0].X,drawPoints[0].Y), |
|||
point |
|||
}; |
|||
drawPolygon.Points = points.Clone(); |
|||
if (!drawPolygon.IsLoaded) |
|||
contenter.Children.Add(drawPolygon); |
|||
|
|||
} |
|||
break; |
|||
case DrawTypes.圆: |
|||
if (drawPoints.Count == 1) |
|||
{ |
|||
double r = Math.Sqrt(Math.Pow(point.X - drawPoints[0].X, 2) + |
|||
Math.Pow(point.Y - drawPoints[0].Y, 2)); |
|||
double top = drawPoints[0].Y - r, |
|||
left = drawPoints[0].X - r; |
|||
if (circular == null) |
|||
{ |
|||
circular = new Rectangle |
|||
{ |
|||
Stroke = Brushes.Black, |
|||
StrokeThickness = 2, |
|||
StrokeDashCap = PenLineCap.Square, |
|||
StrokeDashArray = new DoubleCollection { 6 }, |
|||
|
|||
}; |
|||
|
|||
contenter.Children.Add(circular); |
|||
|
|||
} |
|||
circular.RadiusX = circular.RadiusY = r; |
|||
circular.VerticalAlignment = VerticalAlignment.Stretch; |
|||
circular.HorizontalAlignment = HorizontalAlignment.Stretch; |
|||
circular.Width = circular.Height = 2 * r; |
|||
circular.VerticalAlignment = VerticalAlignment.Top; |
|||
circular.HorizontalAlignment = HorizontalAlignment.Left; |
|||
circular.Margin = |
|||
new Thickness(left, top, 0, 0); |
|||
|
|||
|
|||
} |
|||
break; |
|||
case DrawTypes.三角形: |
|||
if (drawPoints.Count == 2) |
|||
{ |
|||
if (!drawPolygon.IsLoaded) |
|||
contenter.Children.Add(drawPolygon); |
|||
drawPolygon.Points = drawingPoints.Clone(); |
|||
drawPolygon.Points.Add(point); |
|||
} |
|||
break; |
|||
case DrawTypes.多边形: |
|||
if (!drawPolygon.IsLoaded) |
|||
contenter.Children.Add(drawPolygon); |
|||
drawPolygon.Points = drawingPoints.Clone(); |
|||
drawPolygon.Points.Add(point); |
|||
break; |
|||
//case DrawTypes.折线:
|
|||
// if (!drawPolygon.IsLoaded)
|
|||
// contenter.Children.Add(drawPolygon);
|
|||
// drawPolygon.Points = drawingPoints.Clone();
|
|||
// drawPolygon.Points.Add(point);
|
|||
// break;
|
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
public void MouseDown(object sender, MouseButtonEventArgs e) |
|||
{ |
|||
//InkCanvasEditingMode.None;
|
|||
//InkCanvasEditingMode.None
|
|||
// InkCanvasEditingMode.GestureOnly
|
|||
// InkCanvasEditingMode.NoneAndGesture
|
|||
if (data.Draw == true && writeBorad.EditingMode == InkCanvasEditingMode.None && contenter.IsMouseOver) |
|||
{ |
|||
|
|||
Point point = e.GetPosition(contenter); |
|||
drawPoints.Add(new StylusPoint(point.X, point.Y)); |
|||
drawingPoints.Add(point); |
|||
} |
|||
} |
|||
public void ClearSharpe() |
|||
{ |
|||
writeBorad.Strokes.Clear(); |
|||
contenter.Children.Clear(); |
|||
contenter.Children.Add(writeBorad); |
|||
//contenter.Width = SystemParameters.PrimaryScreenWidth;
|
|||
//contenter.Height = SystemParameters.PrimaryScreenHeight;
|
|||
} |
|||
public void LoadDrawShape(string ip,double width,double height, bool reload = true) |
|||
{ |
|||
if (reload) |
|||
{ |
|||
ClearSharpe(); |
|||
} |
|||
|
|||
var drawShapeList = DBDataHelper.GetDrawShape(ip); |
|||
Draw createDraw = new Draw(writeBorad); |
|||
foreach (DrawShape shape in drawShapeList) |
|||
{ |
|||
var drawType = (DrawTypes)shape.DrawType; |
|||
data.LineColor = shape.WarningLevel; |
|||
List<Point> points1 = new List<Point>(); |
|||
foreach (var drPoint in shape.PointList) |
|||
{ |
|||
// Point point = new Point(drPoint.X, drPoint.Y);
|
|||
Point point = new Point(drPoint.X * width, drPoint.Y * height); |
|||
points1.Add(point); |
|||
} |
|||
StylusPointCollection stylusPointCollection = new StylusPointCollection(points1); |
|||
|
|||
switch (drawType) |
|||
{ |
|||
case DrawTypes.矩形: |
|||
if (stylusPointCollection.Count >3) |
|||
{ |
|||
|
|||
writeBorad.Strokes.Add(createDraw.Rectangle(stylusPointCollection[0], stylusPointCollection[2], data.LineColor)); |
|||
|
|||
} |
|||
break; |
|||
case DrawTypes.线段: |
|||
if (stylusPointCollection.Count == 2) |
|||
{ |
|||
writeBorad.Strokes.Add(createDraw.Line(stylusPointCollection[0],stylusPointCollection[1], data.LineColor)); |
|||
|
|||
} |
|||
break; |
|||
case DrawTypes.圆: |
|||
if (stylusPointCollection.Count == 2) |
|||
{ |
|||
writeBorad.Strokes.Add(createDraw.Circle(stylusPointCollection[0], stylusPointCollection[1], data.LineColor)); |
|||
|
|||
} |
|||
break; |
|||
case DrawTypes.三角形: |
|||
if (stylusPointCollection.Count == 3) |
|||
{ |
|||
writeBorad.Strokes.Add(createDraw.Triangle(stylusPointCollection[0], stylusPointCollection[1], stylusPointCollection[2])); |
|||
|
|||
} |
|||
break; |
|||
case DrawTypes.多边形: |
|||
|
|||
//drawPoints.RemoveAt(drawPoints.Count - 1);
|
|||
writeBorad.Strokes.Add(createDraw.Polygon(stylusPointCollection.Clone(), data.LineColor)); |
|||
//drawPoints.Clear();
|
|||
//drawingPoints.Clear();
|
|||
//contenter.Children.Remove(drawPolygon);
|
|||
//drawPolygon = null;
|
|||
//contenter.Children.Remove(drawFinished);
|
|||
//drawFinished = null;
|
|||
|
|||
|
|||
|
|||
break; |
|||
} |
|||
writeBorad.IsEnabled = false; |
|||
writeBorad.EditingMode = InkCanvasEditingMode.Select; |
|||
data.Draw = false; |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,31 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using System.Windows.Ink; |
|||
using System.Windows.Input; |
|||
|
|||
namespace ECMonitor.PlayerDraw.Code |
|||
{ |
|||
public class StrokeEx: Stroke |
|||
{ |
|||
/// <summary>
|
|||
/// 画图形状
|
|||
/// </summary>
|
|||
public DrawTypes DrawType { get; set; } |
|||
/// <summary>
|
|||
/// 预警级别
|
|||
/// </summary>
|
|||
public int WarningLevel { get; set; } |
|||
/// <summary>
|
|||
/// 线 时方向
|
|||
/// </summary>
|
|||
public int WaringDirection { get; set; } |
|||
|
|||
public StrokeEx(StylusPointCollection stylusPoints) : base(stylusPoints) |
|||
{ |
|||
|
|||
} |
|||
} |
|||
} |
@ -0,0 +1,148 @@ |
|||
<Window x:Class="ECMonitor.PlayerDraw.FrmWarningDraw" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
mc:Ignorable="d" |
|||
Title="视频布防" Height="800" Width="1200" Loaded="Window_Loaded" SizeChanged="Window_SizeChanged" WindowStyle="None" WindowStartupLocation="CenterScreen" > |
|||
|
|||
<!--<Window.Resources> |
|||
<ResourceDictionary> |
|||
<ResourceDictionary.MergedDictionaries> |
|||
<ResourceDictionary> |
|||
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> |
|||
|
|||
</ResourceDictionary> |
|||
--><!--<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.TabControl.xaml" />--><!-- |
|||
</ResourceDictionary.MergedDictionaries> |
|||
|
|||
</ResourceDictionary> |
|||
</Window.Resources>--> |
|||
|
|||
<Grid Background="{DynamicResource PrimaryBackGroupBrush}"> |
|||
<Grid.RowDefinitions> |
|||
<RowDefinition Height="40" /> |
|||
<RowDefinition Height="*" /> |
|||
|
|||
</Grid.RowDefinitions> |
|||
<DockPanel Grid.Row="0" MouseMove="DockPanel_MouseMove" > |
|||
<DockPanel.Background> |
|||
<ImageBrush ImageSource="/topbar.png" TileMode="Tile" Stretch="Fill" /> |
|||
</DockPanel.Background> |
|||
|
|||
<DockPanel DockPanel.Dock="Left" SnapsToDevicePixels="True" Margin="0,0,5,0"> |
|||
|
|||
<ListBox Margin="0,0,10,0" |
|||
Style="{StaticResource MaterialDesignToolToggleListBox }" |
|||
SelectedIndex="{Binding LineColor}" |
|||
Padding="0,0,0,0" SelectionChanged="LevelButtons_SelectionChanged" |
|||
Name="barLevelButtons"> |
|||
|
|||
<ListBoxItem > |
|||
<StackPanel Orientation="Horizontal" ToolTip="最高级别预警" > |
|||
<Rectangle Width="10" Height="10" Fill="Green" Margin="5,0,5,0"/> |
|||
<TextBlock Text="预警" Foreground="Green"/> |
|||
</StackPanel> |
|||
</ListBoxItem> |
|||
<ListBoxItem > |
|||
<StackPanel Orientation="Horizontal" ToolTip="中等级别告警" > |
|||
<Rectangle Width="10" Height="10" Fill="Yellow" Margin="0,0,5,0"/> |
|||
<TextBlock Text="告警" Foreground="Yellow"/> |
|||
</StackPanel> |
|||
</ListBoxItem> |
|||
<ListBoxItem > |
|||
<StackPanel Orientation="Horizontal" ToolTip="最高级别报警" > |
|||
<Rectangle Width="10" Height="10" Fill="Red" Margin="0,0,5,0"/> |
|||
<TextBlock Text="报警" Foreground="Red"/> |
|||
</StackPanel> |
|||
</ListBoxItem> |
|||
</ListBox> |
|||
|
|||
<ListBox Margin="5,0,5,0" |
|||
Style="{StaticResource MaterialDesignToolToggleListBox}" |
|||
SelectedIndex="{Binding DrawType}" |
|||
Padding="0,0,0,0" SelectionChanged="ShareButtons_SelectionChanged" |
|||
Name="barShareButtons"> |
|||
|
|||
<ListBoxItem Padding="8,0,8,0" ToolTip="线段"> |
|||
<Line Width="20" Height="1" Stroke="White" X1="0" X2="20" Y1="0" Y2="0" StrokeThickness="1"/> |
|||
</ListBoxItem> |
|||
|
|||
<ListBoxItem Padding="8,0,10,0" ToolTip="多边形"> |
|||
<Polygon Points="0,12 8,0 13,0 22,12 20,15 15,20" StrokeThickness="2" Stroke="White"/> |
|||
</ListBoxItem> |
|||
<ListBoxItem Padding="8,0,10,0" ToolTip="矩形"> |
|||
<Rectangle Width="25" Height="18" Stroke="White" StrokeThickness="2" Fill="Transparent"/> |
|||
</ListBoxItem> |
|||
|
|||
<ListBoxItem Padding="8,0,0,0" ToolTip="圆形" Visibility="Hidden"> |
|||
<Ellipse Width="2" Height="2" Stroke="White" StrokeThickness="2" Fill="Transparent"/> |
|||
</ListBoxItem> |
|||
|
|||
<ListBoxItem Padding="8,0,10,0" ToolTip="选取"> |
|||
<Image Source="/PlayerDraw/选取.png" Width="28"></Image> |
|||
</ListBoxItem> |
|||
|
|||
</ListBox> |
|||
<StackPanel Orientation="Horizontal" Margin="15,0,10,0" > |
|||
|
|||
<Button Name="btnDelete" ToolTip="删除" Style="{DynamicResource TopButtonStyle}" Margin="0,0,10,0" Click="btnDelete_Click" > |
|||
<WrapPanel> |
|||
<Image Stretch="Uniform" Source="/PlayerDraw/删除 关闭 叉.png" /> |
|||
</WrapPanel> |
|||
</Button> |
|||
|
|||
<Button Name="btnSave" ToolTip="保存" Style="{DynamicResource TopButtonStyle}" Margin="10,0,10,0" Click="btnSave_Click" > |
|||
<WrapPanel> |
|||
<Image Source="/PlayerDraw/保存.png" /> |
|||
</WrapPanel> |
|||
</Button> |
|||
</StackPanel> |
|||
|
|||
</DockPanel> |
|||
<DockPanel DockPanel.Dock="Top" Height="18"> |
|||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> |
|||
<Button Name="btnMin" Style="{DynamicResource TopRightButtonStyle}" Margin="0,0,10,0" Click="btnMin_Click"> |
|||
<WrapPanel> |
|||
<Image Source="/min1.png" /> |
|||
</WrapPanel> |
|||
</Button> |
|||
|
|||
<!--<Button Name="btnMax" Style="{DynamicResource TopRightButtonStyle}" Margin="0,0,10,0" Click="btnMax_Click"> |
|||
<WrapPanel> |
|||
<Image Source="/max2.png" Width="10" /> |
|||
</WrapPanel> |
|||
</Button>--> |
|||
|
|||
<Button Name="btnClose" Style="{DynamicResource TopRightButtonStyle}" Margin="0,0,10,0" Click="btnClose_Click"> |
|||
<WrapPanel> |
|||
<Image Source="/close.png" /> |
|||
</WrapPanel> |
|||
</Button> |
|||
</StackPanel> |
|||
</DockPanel> |
|||
|
|||
|
|||
</DockPanel> |
|||
<StackPanel x:Name="planMain" HorizontalAlignment="Stretch" Grid.Row="1" VerticalAlignment="Stretch" ></StackPanel> |
|||
|
|||
<Grid x:Name="contenter" Grid.Row="1"> |
|||
<!--写字板--> |
|||
<InkCanvas x:Name="writeBorad" Background="Transparent" PreviewMouseDown="writeBorad_PreviewMouseDown"> |
|||
<!--<InkCanvas.ContextMenu> |
|||
<ContextMenu Opened="MenuOpened"> |
|||
<MenuItem x:Name="copy" Header="删除" Click="Execute" > |
|||
<MenuItem.Icon> |
|||
<Image Stretch="Uniform" Source="/PlayerDraw/close.png" Width="20" Height="20"/> |
|||
</MenuItem.Icon> |
|||
</MenuItem> |
|||
|
|||
|
|||
</ContextMenu> |
|||
</InkCanvas.ContextMenu>--> |
|||
</InkCanvas> |
|||
</Grid> |
|||
|
|||
|
|||
</Grid> |
|||
</Window> |
@ -0,0 +1,402 @@ |
|||
using EC.Entity.Video; |
|||
using EC.Entity.Warning; |
|||
using ECMonitor.Code; |
|||
using ECMonitor.Code.DB; |
|||
using ECMonitor.Manager; |
|||
using ECMonitor.PlayerDraw.Code; |
|||
|
|||
using ECMonitor.UC.Videos; |
|||
using Prism.Events; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using System.Windows; |
|||
using System.Windows.Controls; |
|||
using System.Windows.Data; |
|||
using System.Windows.Documents; |
|||
using System.Windows.Ink; |
|||
using System.Windows.Input; |
|||
using System.Windows.Media; |
|||
using System.Windows.Media.Imaging; |
|||
using System.Windows.Shapes; |
|||
using System.Windows.Threading; |
|||
|
|||
namespace ECMonitor.PlayerDraw |
|||
{ |
|||
/// <summary>
|
|||
/// FrmWarningDraw.xaml 的交互逻辑
|
|||
/// </summary>
|
|||
public partial class FrmWarningDraw : Window |
|||
{ |
|||
IEventAggregator _ea; |
|||
IUCPlayer _ucFFmpegPlayer; |
|||
ECDrawing draw; |
|||
private BlackboardData blackboardData; |
|||
VideoPlayManager _videoPlayManager { get; set; } = new VideoPlayManager(); |
|||
|
|||
public FrmWarningDraw(IEventAggregator ea) |
|||
{ |
|||
InitializeComponent(); |
|||
|
|||
_ea = ea; |
|||
|
|||
|
|||
|
|||
|
|||
if (blackboardData == null) |
|||
{ |
|||
blackboardData = new BlackboardData();// BlackboardData.Open();
|
|||
|
|||
} |
|||
this.DataContext = blackboardData; |
|||
|
|||
SetFormSize(); |
|||
contenter.Width = this.Width; |
|||
contenter.Height = this.Height - 40; |
|||
|
|||
|
|||
draw = new ECDrawing(blackboardData, contenter, writeBorad); |
|||
|
|||
writeBorad.PreviewMouseLeftButtonDown += draw.MouseDown; |
|||
contenter.MouseMove += draw.MouseMove; |
|||
contenter.PreviewMouseLeftButtonUp += draw.MouseLeftButtonUp; |
|||
|
|||
_ucFFmpegPlayer = _videoPlayManager.CreateWarnCreateLinePlayer(_ea, contenter.Width, contenter.Height, 0); |
|||
this.planMain.Children.Add(_ucFFmpegPlayer.GetControl()); |
|||
|
|||
|
|||
} |
|||
|
|||
|
|||
#region 系统按钮
|
|||
|
|||
private void btnClose_Click(object sender, RoutedEventArgs e) |
|||
{ |
|||
this.Close(); |
|||
// Exit_Click(sender, e);
|
|||
} |
|||
|
|||
private void SetFormSize() |
|||
{ |
|||
double x1 = SystemParameters.PrimaryScreenWidth;//得到屏幕整体宽度
|
|||
double y1 = SystemParameters.PrimaryScreenHeight;//得到屏幕整体高度
|
|||
double xy = x1 + y1; |
|||
x1 = x1 * 0.9; |
|||
y1 = y1 * 0.9; |
|||
this.Width = x1; |
|||
this.Height = y1; |
|||
} |
|||
|
|||
private void btnMax_Click(object sender, RoutedEventArgs e) |
|||
{ |
|||
if (this.WindowState == WindowState.Maximized) |
|||
{ |
|||
this.WindowState = WindowState.Normal; |
|||
} |
|||
else |
|||
{ |
|||
this.WindowState = WindowState.Maximized; |
|||
} |
|||
} |
|||
|
|||
private void btnMin_Click(object sender, RoutedEventArgs e) |
|||
{ |
|||
this.WindowState = WindowState.Minimized; |
|||
} |
|||
private void DockPanel_MouseMove(object sender, MouseEventArgs e) |
|||
{ |
|||
if (e.LeftButton == MouseButtonState.Pressed) |
|||
{ |
|||
this.DragMove(); |
|||
} |
|||
} |
|||
#endregion 系统按钮
|
|||
|
|||
|
|||
private void Window_Loaded(object sender, RoutedEventArgs e) |
|||
{ |
|||
} |
|||
public void Play(string cameraIp) |
|||
{ |
|||
MonitorCamera camera = CameraManager.GetCamera(cameraIp); |
|||
Play( camera); |
|||
} |
|||
public void Play(MonitorCamera camera ) |
|||
{ |
|||
|
|||
if (camera == null) |
|||
{ |
|||
_ucFFmpegPlayer.ShowMsg("相机不存在IP=" + camera.Ip); |
|||
} |
|||
else |
|||
{ |
|||
_ucFFmpegPlayer.Play(camera); |
|||
double width = this._ucFFmpegPlayer.GetControl().Width; |
|||
double height = this._ucFFmpegPlayer.GetControl().Height; |
|||
draw.LoadDrawShape(camera.Ip, width, height); |
|||
} |
|||
// ShowAndActive();
|
|||
} |
|||
|
|||
|
|||
private void Window_SizeChanged(object sender, SizeChangedEventArgs e) |
|||
{ |
|||
// SizeChange();
|
|||
} |
|||
/// <summary>
|
|||
/// 预警级别
|
|||
/// </summary>
|
|||
private int _levelSelectIndex = 2; |
|||
/// <summary>
|
|||
/// 形状
|
|||
/// </summary>
|
|||
private int _shareSelectIndex = 0; |
|||
private void LevelButtons_SelectionChanged(object sender, RoutedEventArgs e) |
|||
{ |
|||
int levelSelectIndex = this.barLevelButtons.SelectedIndex; |
|||
if (levelSelectIndex == -1) |
|||
{ |
|||
this.barLevelButtons.SelectedIndex = _levelSelectIndex; |
|||
return; |
|||
} |
|||
_levelSelectIndex = levelSelectIndex; |
|||
writeBorad.DefaultDrawingAttributes.Color = BlackboardClass.ChangeColor((ColorEnum)levelSelectIndex); |
|||
//if (levelSelectIndex == -1)
|
|||
//{
|
|||
// this.barLevelButtons.SelectedIndex = _levelSelectIndex;
|
|||
// return;
|
|||
//}
|
|||
//_levelSelectIndex = this.barLevelButtons.SelectedIndex;
|
|||
//if (IsLoaded == false)
|
|||
//{
|
|||
// return;
|
|||
//}
|
|||
//switch (_levelSelectIndex)
|
|||
//{
|
|||
// case 0:
|
|||
// writeBorad.DefaultDrawingAttributes.Color = Colors.Green;
|
|||
// break;
|
|||
// case 1:
|
|||
// writeBorad.DefaultDrawingAttributes.Color = Colors.Yellow;
|
|||
// break;
|
|||
// case 2:
|
|||
// writeBorad.DefaultDrawingAttributes.Color = Colors.Red;
|
|||
// break;
|
|||
//}
|
|||
} |
|||
|
|||
private void MenuOpened(object sender, RoutedEventArgs e) |
|||
{ |
|||
//if (writeBorad.GetSelectedStrokes().Count <= 0)
|
|||
//{
|
|||
// copy.IsEnabled = cut.IsEnabled = false;
|
|||
//}
|
|||
//else
|
|||
// copy.IsEnabled = cut.IsEnabled = true;
|
|||
//if (!writeBorad.CanPaste())
|
|||
// paste.IsEnabled = false;
|
|||
//else
|
|||
// paste.IsEnabled = true;
|
|||
} |
|||
private void ShareButtons_SelectionChanged(object sender, SelectionChangedEventArgs e) |
|||
{ |
|||
|
|||
int shareSelectIndex = this.barShareButtons.SelectedIndex; |
|||
if (shareSelectIndex == -1) |
|||
{ |
|||
this.barShareButtons.SelectedIndex = _shareSelectIndex; |
|||
return; |
|||
} |
|||
_shareSelectIndex = this.barShareButtons.SelectedIndex; |
|||
if (_shareSelectIndex < 4) |
|||
{ |
|||
blackboardData.Draw = true; |
|||
this.writeBorad.EditingMode = InkCanvasEditingMode.None; |
|||
}else |
|||
{ |
|||
this.writeBorad.EditingMode = InkCanvasEditingMode.Select; |
|||
|
|||
blackboardData.Draw = false; |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
} |
|||
private void btnSelect_Click(object sender, RoutedEventArgs e) |
|||
{ |
|||
this.writeBorad.EditingMode = InkCanvasEditingMode.Select; |
|||
|
|||
blackboardData.Draw = false; |
|||
} |
|||
//private void ChangeEditingMode()
|
|||
//{
|
|||
// if (_shareSelectIndex == 5)
|
|||
// {
|
|||
// this.writeBorad.EditingMode = InkCanvasEditingMode.Select;
|
|||
|
|||
// blackboardData.Draw = false;
|
|||
// }
|
|||
// else
|
|||
// {
|
|||
// this.writeBorad.EditingMode = InkCanvasEditingMode.None;
|
|||
// this.contenter.Cursor = Cursors.Pen;
|
|||
// blackboardData.Draw = true;
|
|||
// switch (_shareSelectIndex)
|
|||
// {
|
|||
// case 0:
|
|||
// blackboardData.DrawType = (int)DrawTypes.线段;
|
|||
// break;
|
|||
// case 1:
|
|||
// blackboardData.DrawType = (int)DrawTypes.折线;
|
|||
// break;
|
|||
// case 2:
|
|||
// blackboardData.DrawType = (int)DrawTypes.多边形;
|
|||
// break;
|
|||
// case 3:
|
|||
// blackboardData.DrawType = (int)DrawTypes.矩形;
|
|||
// break;
|
|||
// case 4:
|
|||
// blackboardData.DrawType = (int)DrawTypes.圆;
|
|||
// break;
|
|||
// }
|
|||
|
|||
// }
|
|||
//}
|
|||
#region 画图 事件
|
|||
//private static DependencyProperty IsDrawingProperty = DependencyProperty.Register(
|
|||
// "IsDrawing", typeof(bool), typeof(FrmWarningDraw), new PropertyMetadata(false));
|
|||
|
|||
//private bool IsDrawing
|
|||
//{
|
|||
// get { return (bool)GetValue(IsDrawingProperty); }
|
|||
// set { SetValue(IsDrawingProperty, value); }
|
|||
//}
|
|||
|
|||
|
|||
private void writeBorad_PreviewMouseDown(object sender, MouseButtonEventArgs e) |
|||
{ |
|||
//if (e != null && e.ClickCount == 2)
|
|||
// writeBorad.ContextMenu.IsOpen = true;
|
|||
//else
|
|||
//{
|
|||
// //if (!undoStack.Contains(writeBorad.Strokes))
|
|||
// //{
|
|||
// // undoStack.Push(writeBorad.Strokes.Clone());
|
|||
// // if (undo.Visibility == Visibility.Collapsed)
|
|||
// // undo.Visibility = Visibility.Visible;
|
|||
// //}
|
|||
//}
|
|||
|
|||
|
|||
} |
|||
|
|||
//private void Execute(object sender, RoutedEventArgs e)
|
|||
//{
|
|||
// var menuItem = sender as MenuItem;
|
|||
// switch (menuItem.Header.ToString())
|
|||
// {
|
|||
// case "打开":
|
|||
// // OpenFile();
|
|||
// break;
|
|||
// case "复制":
|
|||
// writeBorad.CopySelection();
|
|||
// break;
|
|||
// case "粘贴":
|
|||
// writeBorad_PreviewMouseDown(null, null);
|
|||
// writeBorad.Paste(Mouse.GetPosition(writeBorad));
|
|||
// break;
|
|||
// case "剪切":
|
|||
// writeBorad.CutSelection();
|
|||
// writeBorad_PreviewMouseDown(sender, null);
|
|||
// break;
|
|||
// case "删除":
|
|||
// writeBorad_PreviewMouseDown(sender, null);
|
|||
// foreach (Stroke item in writeBorad.GetSelectedStrokes())
|
|||
// writeBorad.Strokes.Remove(item);
|
|||
|
|||
// break;
|
|||
|
|||
// }
|
|||
|
|||
//}
|
|||
|
|||
|
|||
private void btnDelete_Click(object sender, RoutedEventArgs e) |
|||
{ |
|||
writeBorad_PreviewMouseDown(sender, e as MouseButtonEventArgs); |
|||
|
|||
//if (choose.IsChecked == false)
|
|||
//{
|
|||
// if (VerifyWindow.ShowDialog("确认清空黑板", "是否清空黑板?", this) == true)
|
|||
// {
|
|||
// writeBorad.Strokes.Clear();
|
|||
// contenter.Children.Clear();
|
|||
// contenter.Children.Add(writeBorad);
|
|||
// contenter.Width = SystemParameters.PrimaryScreenWidth;
|
|||
// contenter.Height = SystemParameters.PrimaryScreenHeight;
|
|||
// IsWrote = false;
|
|||
// }
|
|||
|
|||
//}
|
|||
//else
|
|||
//{
|
|||
foreach (Stroke item in writeBorad.GetSelectedStrokes()) |
|||
writeBorad.Strokes.Remove(item); |
|||
//}
|
|||
|
|||
} |
|||
#endregion
|
|||
|
|||
|
|||
|
|||
private void btnSave_Click(object sender, RoutedEventArgs e) |
|||
{ |
|||
StrokeCollection strokes = writeBorad.Strokes; |
|||
int icount = strokes.Count; |
|||
List<DrawShape> drawShapeModelList = new List<DrawShape>(); |
|||
for (int i= 0; i < icount;i++) |
|||
{ |
|||
|
|||
StrokeEx storke = strokes[i] as StrokeEx; |
|||
var camera = _ucFFmpegPlayer.GetCamera(); |
|||
if (camera == null) { |
|||
MessageManager.ShowMessage("相机不存在"); |
|||
return; |
|||
} |
|||
var ip=camera.Ip; |
|||
drawShapeModelList.Add( CreateDrawShape(ip,storke)); |
|||
|
|||
} |
|||
|
|||
bool save= DBDataHelper.SaveDrawShape(drawShapeModelList); |
|||
if (save) |
|||
{ |
|||
MessageManager.ShowMessage("保存成功"); |
|||
} |
|||
else |
|||
{ |
|||
MessageManager.ShowMessage("保存失败"); |
|||
} |
|||
} |
|||
private DrawShape CreateDrawShape(string ip, StrokeEx storke) |
|||
{ |
|||
DrawShape drawShape = new DrawShape(); |
|||
drawShape.Ip = ip; |
|||
drawShape.DrawType = (int)storke.DrawType; |
|||
drawShape.WarningLevel = (int)storke.WarningLevel; |
|||
double width = _ucFFmpegPlayer.GetControl().Width; |
|||
double height = _ucFFmpegPlayer.GetControl().Height; |
|||
foreach (var point in storke.StylusPoints) |
|||
{ |
|||
DrawPoint DrawPoint = new DrawPoint(point.X/ width, point.Y/ height); |
|||
drawShape.PointList.Add(DrawPoint); |
|||
} |
|||
return drawShape; |
|||
} |
|||
|
|||
|
|||
} |
|||
} |
@ -0,0 +1,12 @@ |
|||
<UserControl x:Class="ECMonitor.PlayerDraw.UC.UCVideoDraw" |
|||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
xmlns:local="clr-namespace:ECMonitor.PlayerDraw.UC" |
|||
mc:Ignorable="d" |
|||
d:DesignHeight="450" d:DesignWidth="800"> |
|||
<Grid> |
|||
|
|||
</Grid> |
|||
</UserControl> |
@ -0,0 +1,28 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using System.Windows; |
|||
using System.Windows.Controls; |
|||
using System.Windows.Data; |
|||
using System.Windows.Documents; |
|||
using System.Windows.Input; |
|||
using System.Windows.Media; |
|||
using System.Windows.Media.Imaging; |
|||
using System.Windows.Navigation; |
|||
using System.Windows.Shapes; |
|||
|
|||
namespace ECMonitor.PlayerDraw.UC |
|||
{ |
|||
/// <summary>
|
|||
/// UCVideoDraw.xaml 的交互逻辑
|
|||
/// </summary>
|
|||
public partial class UCVideoDraw : UserControl |
|||
{ |
|||
public UCVideoDraw() |
|||
{ |
|||
InitializeComponent(); |
|||
} |
|||
} |
|||
} |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 561 B |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue