You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1001 lines
42 KiB
1001 lines
42 KiB
using IOTContainer.Common;
|
|
using IOTContainer.Communication;
|
|
using IOTContainer.Model;
|
|
using IOTContainer.ViewModel;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading;
|
|
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.Animation;
|
|
using System.Windows.Media.Imaging;
|
|
using System.Windows.Shapes;
|
|
using System.Windows.Threading;
|
|
|
|
namespace IOTContainer.View
|
|
{
|
|
/// <summary>
|
|
/// ScreenWindowNew.xaml 的交互逻辑
|
|
/// </summary>
|
|
public partial class ScreenWindowNew : Window
|
|
{
|
|
string outLinePath;
|
|
ProgControl progControl = new ProgControl();
|
|
List<StopPlay> Stops = new List<StopPlay>();
|
|
StopPlay IsStop = new StopPlay();
|
|
IntPtr hWaitTimer = IntPtr.Zero;
|
|
int isShowCountDown = 0;
|
|
private DateTime? curLoadDate;
|
|
DispatcherTimer LoadScreenTimer = new DispatcherTimer();
|
|
List<CancellationTokenSource> sourceList = new List<CancellationTokenSource>();
|
|
[DllImport("kernel32.dll")]
|
|
static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref long ft, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr pArgToCompletionRoutine, bool fResume);
|
|
private Random _random;
|
|
private DoubleAnimation _rectXAnima;
|
|
private DoubleAnimation _rectYAnima;
|
|
public ScreenWindowNew(int type = 1)
|
|
{
|
|
isShowCountDown = type;
|
|
ComParameters.Parameters.EdgeWindow?.StopTimer();
|
|
InitializeComponent();
|
|
_rectXAnima = new DoubleAnimation();
|
|
_rectYAnima = new DoubleAnimation();
|
|
this.Top = 0;
|
|
this.Left = 0;
|
|
//设置窗口大小
|
|
this.WindowState = WindowState.Maximized;
|
|
ComParameters.Parameters.ScreenWindowNew = this;
|
|
#region 查询是否为同屏设备
|
|
if (ComParameters.Parameters.devType == "信发")
|
|
{
|
|
TimeJobs.Jobs.QuerySyncMachine();
|
|
}
|
|
#endregion
|
|
#region 屏保组件
|
|
try
|
|
{
|
|
if (!string.IsNullOrEmpty(ComParameters.Parameters.screenSaver) && File.Exists(ComParameters.Parameters.screenSaver))
|
|
{
|
|
var bitmap = new BitmapImage();
|
|
using (var stream = new MemoryStream(File.ReadAllBytes(ComParameters.Parameters.screenSaver)))
|
|
{
|
|
bitmap.BeginInit();
|
|
bitmap.CacheOption = BitmapCacheOption.OnLoad;
|
|
bitmap.StreamSource = stream;
|
|
bitmap.EndInit();
|
|
bitmap.Freeze();
|
|
ImageBrush _imageBrush = new ImageBrush(bitmap);
|
|
waiting.Background = _imageBrush;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
string strImages = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ScreenSaver", "bg.png");
|
|
if (File.Exists(strImages) == true)
|
|
{
|
|
var bitmap = new BitmapImage();
|
|
using (var stream = new MemoryStream(File.ReadAllBytes(strImages)))
|
|
{
|
|
bitmap.BeginInit();
|
|
bitmap.CacheOption = BitmapCacheOption.OnLoad;
|
|
bitmap.StreamSource = stream;
|
|
bitmap.EndInit();
|
|
bitmap.Freeze();
|
|
ImageBrush _imageBrush = new ImageBrush(bitmap);
|
|
waiting.Background = _imageBrush;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("屏保组件异常:"+ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
#endregion
|
|
}
|
|
private void Window_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
outLinePath = AppDomain.CurrentDomain.BaseDirectory ;
|
|
//string ScreenType = ComParameters.Parameters.resolution;
|
|
//string ScreenWH = ScreenType.Substring(0, ScreenType.Length - 2);
|
|
//string[] WH = ScreenWH.Split('*');
|
|
//this.Width = int.Parse(WH[0]);
|
|
//this.Height = int.Parse(WH[1]);
|
|
this.Width = SystemParameters.PrimaryScreenWidth;
|
|
this.Height = SystemParameters.PrimaryScreenHeight;
|
|
|
|
//自适应Touch
|
|
if (ComParameters.Parameters.devType == "导视")
|
|
{
|
|
if((this.Width == 3840 && this.Height == 2160) || (this.Width == 2160 && this.Height == 3840))
|
|
{
|
|
TouchLottie.Width = 600;
|
|
TouchLottie.Height = 600;
|
|
TouchImage.Width = 600;
|
|
TouchImage.Height = 600;
|
|
}
|
|
else if((this.Width == 2560 && this.Height == 1440) || (this.Width == 1440 && this.Height == 2560))
|
|
{
|
|
TouchLottie.Width = 450;
|
|
TouchLottie.Height = 450;
|
|
TouchImage.Width = 450;
|
|
TouchImage.Height = 450;
|
|
|
|
}
|
|
}
|
|
//隐藏光标
|
|
WinApi.ShowCursor(0);
|
|
if (isShowCountDown == 1)
|
|
{
|
|
LoadPics();
|
|
}
|
|
else
|
|
{
|
|
timeGrid.Visibility = Visibility.Hidden;
|
|
gridMain.Visibility = Visibility.Visible;
|
|
LoadData();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("Window_Loaded:" + ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
|
|
}
|
|
private void LoadPics()
|
|
{
|
|
try
|
|
{
|
|
Storyboard _storyboard = new Storyboard();
|
|
for (int i = 0; i < 220; i++)
|
|
{
|
|
|
|
ObjectAnimationUsingKeyFrames oauf = new ObjectAnimationUsingKeyFrames();
|
|
//ObjectAnimationUsingKeyFrames 可以对指定 Duration 内的一组 KeyFrames 中的 Object 属性值进行动画处理
|
|
BitmapImage bitmap = new BitmapImage();
|
|
bitmap.BeginInit();
|
|
string name = i.ToString().PadLeft(5, '0');
|
|
bitmap.UriSource = new Uri("pack://application:,,,/IOTContainer;component/image/CountDowmImage/倒计时透明度_" + name + ".png");
|
|
bitmap.CacheOption = BitmapCacheOption.Default;
|
|
bitmap.EndInit();
|
|
bitmap.Freeze();
|
|
|
|
ImageBrush imgBrush = new ImageBrush(bitmap);
|
|
//读取图片文件
|
|
DiscreteObjectKeyFrame dokf = new DiscreteObjectKeyFrame();
|
|
//DiscreteObjectKeyFrame 通过使用离散内插,可以在前一个关键帧的 Object 值及其自己的 Value 之间进行动画处理。
|
|
dokf.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(i * 30));
|
|
//KeyTime 获取或设置应到达关键帧的目标 Value 的时间
|
|
//这里每隔40毫秒设置一张图片,也就是每秒1000/40=25帧
|
|
dokf.Value = imgBrush;
|
|
imgBrush.Freeze();
|
|
oauf.KeyFrames.Add(dokf);
|
|
Storyboard.SetTargetProperty(oauf, new PropertyPath("(Rectangle.Fill)"));
|
|
//把动画应用到窗体的Rectangle中
|
|
Storyboard.SetTarget(oauf, RectDisImage);
|
|
//RectDis是Rectangle的名称
|
|
_storyboard.Children.Add(oauf);
|
|
oauf.Freeze();
|
|
//把ObjectAnimationUsingKeyFrames动画添加到Storyboard中
|
|
}
|
|
_storyboard.Completed += new EventHandler(time_Completed);
|
|
//_storyboard.RepeatBehavior = RepeatBehavior.Forever;
|
|
_storyboard.Begin();
|
|
_storyboard.Freeze();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("LoadPics:" + ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
}
|
|
private void time_Completed(object sender, EventArgs e)
|
|
{
|
|
timeGrid.Visibility = Visibility.Hidden;
|
|
gridMain.Visibility = Visibility.Visible;
|
|
LoadData();
|
|
}
|
|
private void LoadData()
|
|
{
|
|
try
|
|
{
|
|
WebSocketCom.removeDelegate();
|
|
WebSocketCom.playIndexEvent += new WebSocketCom.playIndexDelegate(playIndex_ReceiveEvent);
|
|
SystemManage.removeDelegate();
|
|
SystemManage.TouchMeEvent += new SystemManage.TouchMeDelegate(TouchMe_ReceiveEvent);
|
|
HttpComm.Http.removeDelegate();
|
|
HttpComm.Http.ScreenConfigReceiveEvent += new HttpComm.ScreenConfigDelegate(ScreenConfig_ReceiveEvent);
|
|
LoadScreenTimer.Tick += new EventHandler(LoadScreen);
|
|
LoadScreenTimer.Interval = TimeSpan.FromSeconds(30);
|
|
if (ComParameters.Parameters.devType == "导视" && !string.IsNullOrEmpty(ComParameters.Parameters.labelType) && 0 < Convert.ToInt32(ComParameters.Parameters.labelType) && Convert.ToInt32(ComParameters.Parameters.labelType) <= 10 && ComParameters.Parameters.devAttr == "触摸")
|
|
{
|
|
RectBtn.Visibility = Visibility.Visible;
|
|
//悬浮图标
|
|
_random = new Random();
|
|
//加载悬浮按钮
|
|
//LoadRectBtn();
|
|
LoadLottieRectBtn(true);
|
|
//设置按钮位置和动画
|
|
SetRectBtn();
|
|
}else if(ComParameters.Parameters.devType == "导视" && !string.IsNullOrEmpty(ComParameters.Parameters.labelType) && Convert.ToInt32(ComParameters.Parameters.labelType) >= 10 && ComParameters.Parameters.devAttr == "触摸" && File.Exists(ComParameters.Parameters.screenSaverTouch))
|
|
{
|
|
string fileExtension = System.IO.Path.GetExtension(ComParameters.Parameters.screenSaverTouch);
|
|
//悬浮图标
|
|
_random = new Random();
|
|
//设置按钮位置和动画
|
|
SetRectBtn();
|
|
if (fileExtension.ToLower() == ".json")
|
|
{
|
|
TouchLottie.Visibility = Visibility.Visible;
|
|
TouchImage.Visibility = Visibility.Hidden;
|
|
LoadLottieRectBtn(false);
|
|
}
|
|
else
|
|
{
|
|
TouchLottie.Visibility = Visibility.Hidden;
|
|
TouchImage.Visibility = Visibility.Visible;
|
|
TouchImage.Source = new BitmapImage(new Uri(ComParameters.Parameters.screenSaverTouch));
|
|
TouchImage.Source.Freeze();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
RectBtn.Visibility = Visibility.Hidden;
|
|
}
|
|
StartPlay();
|
|
HttpComm.Http.DownResource();
|
|
LoadScreenTimer.Start();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("Window_Loaded:" + ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
}
|
|
private void LoadScreen(object sender, EventArgs e)
|
|
{
|
|
if (curLoadDate.HasValue && curLoadDate.Value.Date != DateTime.Now.Date)
|
|
{
|
|
foreach (var item in sourceList)
|
|
{
|
|
if (!item.Token.IsCancellationRequested)
|
|
{
|
|
item.Cancel();
|
|
}
|
|
}
|
|
curLoadDate = DateTime.Now;
|
|
sourceList.Clear();
|
|
HttpComm.Http.DownResource();
|
|
GetUControl();
|
|
|
|
}
|
|
}
|
|
private void playIndex_ReceiveEvent()
|
|
{
|
|
List<ScheduleModel> progList = result.Where(i => Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + i.endTime) > DateTime.Now).OrderBy(i => i.beginTime).ToList();
|
|
PlayScheduler(progList[0]);
|
|
}
|
|
|
|
private void TouchMe_ReceiveEvent()
|
|
{
|
|
Dispatcher.Invoke((Action)(() =>
|
|
{
|
|
RectBtn.Visibility = ComParameters.Parameters.devAttr == "触摸" && ComParameters.Parameters.devType == "导视" ? System.Windows.Visibility.Visible : System.Windows.Visibility.Hidden;
|
|
}));
|
|
|
|
}
|
|
private void ScreenConfig_ReceiveEvent()
|
|
{
|
|
try
|
|
{
|
|
|
|
foreach (var item in sourceList)
|
|
{
|
|
if (!item.Token.IsCancellationRequested)
|
|
{
|
|
item.Cancel();
|
|
item.Dispose();
|
|
}
|
|
}
|
|
sourceList.Clear();
|
|
GetUControl();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.MyLog.WriteLogFile("ScreenConfig_ReceiveEvent:" + ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
|
|
}
|
|
private void StartPlay()
|
|
{
|
|
curLoadDate = DateTime.Now;
|
|
GetUControl();
|
|
}
|
|
List<ScheduleModel> result;
|
|
private void GetUControl()
|
|
{
|
|
try
|
|
{
|
|
result = HttpComm.Http.GetResource();
|
|
if(result == null || result.Count == 0)
|
|
{
|
|
//如果没有节目,则继续展示导视
|
|
try
|
|
{
|
|
if(ComParameters.Parameters.devType == "导视")
|
|
{
|
|
Dispatcher.Invoke((Action)(() =>
|
|
{
|
|
this.Hide();
|
|
Thread.Sleep(300);
|
|
this.Close();
|
|
}));
|
|
}
|
|
else
|
|
{
|
|
Dispatcher.Invoke((Action)(() =>
|
|
{
|
|
progControl.Dispose();
|
|
mainp.Visibility = Visibility.Hidden;
|
|
waiting.Visibility = Visibility.Visible;
|
|
}));
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.MyLog.WriteLogFile("GetUControl:" + ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
Dispatcher.Invoke(new Action(() =>
|
|
{
|
|
mainp.Visibility = Visibility.Visible;
|
|
waiting.Visibility = Visibility.Hidden;
|
|
}));
|
|
}
|
|
if (hWaitTimer != IntPtr.Zero)
|
|
{
|
|
WinApi.CloseHandle(hWaitTimer);
|
|
hWaitTimer = IntPtr.Zero;
|
|
}
|
|
LoadScheduler(result);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("GetUControl:" + ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
|
|
}
|
|
private bool LoadScheduler(List<ScheduleModel> progList)
|
|
{
|
|
|
|
bool isScheduler = false;
|
|
if (hWaitTimer != IntPtr.Zero)
|
|
{
|
|
WinApi.CloseHandle(hWaitTimer);
|
|
hWaitTimer = IntPtr.Zero;
|
|
}
|
|
try
|
|
{
|
|
progList = progList.Where(i => Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + i.endTime) > DateTime.Now).OrderBy(i => i.beginTime).ToList();
|
|
if (progList != null && progList.Count > 0)
|
|
{
|
|
if (Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + progList[0].beginTime) <= DateTime.Now.AddSeconds(+1))
|
|
{
|
|
PlayScheduler(progList[0]);
|
|
Action action = new Action(() =>
|
|
{
|
|
var curDate = DateTime.Now;
|
|
var stopTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + progList[0].endTime);
|
|
UsDelay((stopTime.Ticks - curDate.Ticks));
|
|
if (hWaitTimer != IntPtr.Zero)
|
|
{
|
|
WinApi.CloseHandle(hWaitTimer);
|
|
hWaitTimer = IntPtr.Zero;
|
|
}
|
|
LoadScheduler(progList);
|
|
});
|
|
action.BeginInvoke(null, null);
|
|
}
|
|
else
|
|
{
|
|
|
|
Action action = new Action(() =>
|
|
{
|
|
var curDate = DateTime.Now;
|
|
var stopTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + progList[0].beginTime);
|
|
UsDelay((stopTime.Ticks - curDate.Ticks));
|
|
if (hWaitTimer != IntPtr.Zero)
|
|
{
|
|
WinApi.CloseHandle(hWaitTimer);
|
|
hWaitTimer = IntPtr.Zero;
|
|
}
|
|
PlayScheduler(progList[0]);
|
|
Action action1 = new Action(() =>
|
|
{
|
|
curDate = DateTime.Now;
|
|
stopTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + progList[0].endTime);
|
|
if (hWaitTimer != IntPtr.Zero)
|
|
{
|
|
WinApi.CloseHandle(hWaitTimer);
|
|
hWaitTimer = IntPtr.Zero;
|
|
}
|
|
curDate = DateTime.Now;
|
|
UsDelay((stopTime.Ticks - curDate.Ticks));
|
|
|
|
LoadScheduler(progList);
|
|
});
|
|
action1.BeginInvoke(null, null);
|
|
});
|
|
action.BeginInvoke(null, null);
|
|
switch (ComParameters.Parameters.devType)
|
|
{
|
|
case "导视":
|
|
this.Dispatcher.Invoke((Action)(() =>
|
|
{
|
|
this.Hide();
|
|
Thread.Sleep(300);
|
|
this.Close();
|
|
}));
|
|
break;
|
|
case "信发":
|
|
this.Dispatcher.Invoke(new Action(() =>
|
|
{
|
|
progControl.Dispose();
|
|
mainp.Visibility = Visibility.Hidden;
|
|
waiting.Visibility = Visibility.Visible;
|
|
}));
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
switch (ComParameters.Parameters.devType)
|
|
{
|
|
case "导视":
|
|
this.Dispatcher.Invoke((Action)(() =>
|
|
{
|
|
this.Hide();
|
|
Thread.Sleep(300);
|
|
this.Close();
|
|
}));
|
|
break;
|
|
case "信发":
|
|
this.Dispatcher.Invoke(new Action(() =>
|
|
{
|
|
progControl.Dispose();
|
|
mainp.Visibility = Visibility.Hidden;
|
|
waiting.Visibility = Visibility.Visible;
|
|
}));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("LoadScheduler:" + ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
return isScheduler;
|
|
}
|
|
private async void PlayScheduler(ScheduleModel scheduler)
|
|
{
|
|
try
|
|
{
|
|
|
|
if (scheduler != null && scheduler.programs != null && scheduler.programs.Count > 0)
|
|
{
|
|
this.Dispatcher.Invoke(new Action(() =>
|
|
{
|
|
mainp.Visibility = Visibility.Visible;
|
|
waiting.Visibility = Visibility.Hidden;
|
|
|
|
}));
|
|
var playIndex = 0;
|
|
CancellationTokenSource source1 = new CancellationTokenSource();
|
|
sourceList.Add(source1);
|
|
StopPlay IsStop = new StopPlay();
|
|
foreach (var item in Stops)
|
|
{
|
|
item.IsStart = false;
|
|
}
|
|
Stops.Clear();
|
|
Stops.Add(IsStop);
|
|
//续播功能
|
|
|
|
if (scheduler.programs.Count > 1)
|
|
{
|
|
if (ComParameters.Parameters.RecordProgramIndex.HasValue)
|
|
{
|
|
playIndex = ComParameters.Parameters.RecordProgramIndex.Value;
|
|
ComParameters.Parameters.CurrentMaterialIndex = ComParameters.Parameters.RecordMaterialIndex.Value;
|
|
}
|
|
|
|
}
|
|
while (IsStop.IsStart)
|
|
{
|
|
if (source1.Token.IsCancellationRequested)
|
|
{
|
|
//isStop = true;
|
|
// 释放资源操作等等...
|
|
break;
|
|
}
|
|
//同屏设备
|
|
if (ComParameters.Parameters.IsSync)
|
|
{
|
|
if (ComParameters.Parameters.IsMainMachine)//主设备
|
|
{
|
|
Action ac = new Action(() =>
|
|
{
|
|
WebSocketCom.Socket.ProgrammePlay(playIndex);
|
|
});
|
|
ac.BeginInvoke(null, null);
|
|
|
|
}
|
|
else
|
|
{
|
|
if (ComParameters.Parameters.ProgramIndex.HasValue)
|
|
{
|
|
playIndex = ComParameters.Parameters.ProgramIndex.Value;
|
|
}
|
|
}
|
|
}
|
|
ComParameters.Parameters.CurrentProgramIndex = playIndex;
|
|
var item = scheduler.programs[playIndex];
|
|
this.Dispatcher.Invoke(new Action(() =>
|
|
{
|
|
progControl.Dispose();
|
|
progControl.LoadProg(this.Width, this.Height, item.backgroundMaterial, item.backgroundColor, item.components);
|
|
mainp.Content = progControl;
|
|
playIndex++;
|
|
if (playIndex >= scheduler.programs.Count)
|
|
{
|
|
playIndex = 0;
|
|
|
|
}
|
|
}));
|
|
//播放日志上传
|
|
Action ac1 = new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
HttpComm.Http.UploadPlayDetail(item.code, item.duration);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.MyLog.WriteLogFile("播放日志上传:" + ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
});
|
|
ac1.BeginInvoke(null, null);
|
|
TimeSpan.TryParse(item.duration, out TimeSpan timeSpan);
|
|
try
|
|
{
|
|
if (source1.Token.IsCancellationRequested)
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
try
|
|
{
|
|
//Log.MyLog.WriteLogFile(Convert.ToInt32(timeSpan.TotalMilliseconds).ToString(), "UploadPlayDetail");
|
|
if (scheduler.programs.Count == 1)
|
|
{
|
|
await Task.Delay(Convert.ToInt32(28800000), source1.Token);
|
|
}
|
|
else
|
|
{
|
|
await Task.Delay(Convert.ToInt32(timeSpan.TotalMilliseconds), source1.Token);
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
|
|
break;
|
|
}
|
|
}
|
|
if (scheduler.programs.Count > 1)
|
|
{
|
|
ComParameters.Parameters.CurrentMaterialIndex = null;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.MyLog.WriteLogFile("PlayScheduler:" + ex.ToString(), "ScreenWindowNew");
|
|
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (ComParameters.Parameters.devType)
|
|
{
|
|
case "导视":
|
|
this.Dispatcher.Invoke((Action)(() =>
|
|
{
|
|
this.Hide();
|
|
Thread.Sleep(300);
|
|
this.Close();
|
|
}));
|
|
break;
|
|
case "信发":
|
|
this.Dispatcher.Invoke(new Action(() =>
|
|
{
|
|
mainp.Visibility = Visibility.Hidden;
|
|
waiting.Visibility = Visibility.Visible;
|
|
}));
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.MyLog.WriteLogFile("PlayScheduler:" + ex.ToString(), "ScreenWindowNew");
|
|
|
|
}
|
|
|
|
}
|
|
public void UsDelay(long us)
|
|
{
|
|
try
|
|
{
|
|
long duetime = -1 * us;
|
|
|
|
if (hWaitTimer != IntPtr.Zero)
|
|
{
|
|
WinApi.CloseHandle(hWaitTimer);
|
|
hWaitTimer = IntPtr.Zero;
|
|
}
|
|
if (hWaitTimer == IntPtr.Zero)
|
|
{
|
|
hWaitTimer = WinApi.CreateWaitableTimer(IntPtr.Zero, true, IntPtr.Zero);
|
|
bool flag = SetWaitableTimer(hWaitTimer, ref duetime, 0, IntPtr.Zero, IntPtr.Zero, false);
|
|
UInt32 isFlag = WinApi.WaitForSingleObject(hWaitTimer, Timeout.Infinite);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("UsDelay:" + ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
|
|
}
|
|
private void Window_Closed(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
progControl.Dispose();
|
|
//ComParameters.Parameters.EdgeWindow?.StartNewTimer();
|
|
switch (ComParameters.Parameters.devType)
|
|
{
|
|
case "导视":
|
|
{
|
|
ComParameters.Parameters.EdgeWindow.LeaveScreenSave();
|
|
break;
|
|
}
|
|
case "信发":
|
|
{
|
|
|
|
break;
|
|
}
|
|
}
|
|
ComParameters.Parameters.IsPlay = false;
|
|
ComParameters.Parameters.ScreenWindowNew = null;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("Window_Closed:" + ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
|
|
}
|
|
|
|
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
//记录屏保播放位置
|
|
if (ComParameters.Parameters.CurrentMaterialIndex.HasValue)
|
|
{
|
|
ComParameters.Parameters.RecordMaterialIndex = ComParameters.Parameters.CurrentMaterialIndex.Value;
|
|
}
|
|
if (ComParameters.Parameters.CurrentProgramIndex.HasValue)
|
|
{
|
|
ComParameters.Parameters.RecordProgramIndex = ComParameters.Parameters.CurrentProgramIndex.Value;
|
|
}
|
|
switch (ComParameters.Parameters.devType)
|
|
{
|
|
case "导视":
|
|
{
|
|
//导视点击数据上报
|
|
Action ac = new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
HttpComm.Http.UploadClickData();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("导视点击数据上报:" + ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
});
|
|
ac.BeginInvoke(null, null);
|
|
this.Dispatcher.Invoke((Action)(() =>
|
|
{
|
|
this.Hide();
|
|
TouchLottie?.Dispose();
|
|
Thread.Sleep(300);
|
|
this.Close();
|
|
}));
|
|
break;
|
|
}
|
|
case "信发":
|
|
{
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.MyLog.WriteLogFile("ScreenWindowNew关闭失败:" + ex.Message);
|
|
}
|
|
}
|
|
#region 悬浮按钮
|
|
public void LoadLottieRectBtn(bool lottieTouch)
|
|
{
|
|
try
|
|
{
|
|
string lottiePath = lottieTouch ? System.IO.Path.Combine(outLinePath, "touch_Lottie", "touch0" + ComParameters.Parameters.labelType + ".json") : ComParameters.Parameters.screenSaverTouch;
|
|
//string lottiePath = System.IO.Path.Combine(outLinePath, "touch_Lottie", "touch0" + ComParameters.Parameters.labelType + ".json");
|
|
if (File.Exists(lottiePath))
|
|
TouchLottie.FileName = lottiePath;
|
|
TouchLottie.UseHardwareAcceleration(true);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("悬浮按钮加载失败:" + ex.Message);
|
|
}
|
|
|
|
}
|
|
/// <summary>
|
|
/// 加载帧动画
|
|
/// </summary>
|
|
public void LoadRectBtn()
|
|
{
|
|
try
|
|
{
|
|
Storyboard _storyboard = new Storyboard();
|
|
int count = 99;
|
|
if (Convert.ToInt32(ComParameters.Parameters.labelType) == 3 || Convert.ToInt32(ComParameters.Parameters.labelType) == 4)
|
|
{
|
|
count = 68;
|
|
}
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
ObjectAnimationUsingKeyFrames oauf = new ObjectAnimationUsingKeyFrames();
|
|
//ObjectAnimationUsingKeyFrames 可以对指定 Duration 内的一组 KeyFrames 中的 Object 属性值进行动画处理
|
|
BitmapImage bitmap = new BitmapImage();
|
|
bitmap.BeginInit();
|
|
string name = i.ToString().PadLeft(5, '0');
|
|
bitmap.UriSource = new Uri("pack://application:,,,/IOTContainer;component/touch/touch" + ComParameters.Parameters.labelType + "/touch_" + name + ".png");
|
|
|
|
bitmap.CacheOption = BitmapCacheOption.Default;
|
|
bitmap.EndInit();
|
|
bitmap.Freeze();
|
|
ImageBrush imgBrush = new ImageBrush(bitmap);
|
|
//读取图片文件
|
|
DiscreteObjectKeyFrame dokf = new DiscreteObjectKeyFrame();
|
|
//DiscreteObjectKeyFrame 通过使用离散内插,可以在前一个关键帧的 Object 值及其自己的 Value 之间进行动画处理。
|
|
dokf.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(i * 30));
|
|
//KeyTime 获取或设置应到达关键帧的目标 Value 的时间
|
|
//这里每隔40毫秒设置一张图片,也就是每秒1000/40=25帧
|
|
dokf.Value = imgBrush;
|
|
imgBrush.Freeze();
|
|
oauf.KeyFrames.Add(dokf);
|
|
dokf.Freeze();
|
|
Storyboard.SetTargetProperty(oauf, new PropertyPath("(Rectangle.Fill)"));
|
|
//把动画应用到窗体的Rectangle中
|
|
Storyboard.SetTarget(oauf, RectBtn);
|
|
//RectDis是Rectangle的名称
|
|
_storyboard.Children.Add(oauf);
|
|
oauf.Freeze();
|
|
//把ObjectAnimationUsingKeyFrames动画添加到Storyboard中
|
|
}
|
|
_storyboard.RepeatBehavior = RepeatBehavior.Forever;
|
|
_storyboard.Begin();
|
|
_storyboard.Freeze();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.MyLog.WriteLogFile("悬浮按钮加载失败:" + ex.Message);
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 根据配置设置悬浮图标的位置
|
|
/// </summary>
|
|
private void SetRectBtn()
|
|
{
|
|
try
|
|
{
|
|
switch (ComParameters.Parameters.labelEffect)
|
|
{
|
|
case "0"://固定位置
|
|
{
|
|
switch (ComParameters.Parameters.labelLocation)
|
|
{
|
|
case "0"://右下角显示
|
|
{
|
|
Canvas.SetRight(RectBtn, 0);
|
|
Canvas.SetBottom(RectBtn, 0);
|
|
break;
|
|
}
|
|
case "1"://居中
|
|
{
|
|
Canvas.SetLeft(RectBtn, (this.Width - RectBtn.Width) / 2);
|
|
Canvas.SetTop(RectBtn, (this.Height - RectBtn.Height) / 2);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case "1"://自由移动
|
|
{
|
|
RectBtnMove();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.MyLog.WriteLogFile("设置悬浮图标的位置出错:" + ex.Message);
|
|
}
|
|
}
|
|
private void RectBtnMove_Completed(object sender, EventArgs e)
|
|
{
|
|
RectBtnMove();
|
|
}
|
|
/// <summary>
|
|
/// 设置悬浮图标的动画
|
|
/// </summary>
|
|
private void RectBtnMove()
|
|
{
|
|
Storyboard story = new Storyboard();
|
|
try
|
|
{
|
|
switch (ComParameters.Parameters.labelLocation)
|
|
{
|
|
case "2"://左右移动
|
|
{
|
|
Canvas.SetLeft(RectBtn, 0);
|
|
Canvas.SetBottom(RectBtn, 0);
|
|
_rectXAnima.From = Canvas.GetLeft(RectBtn);
|
|
_rectXAnima.To = this.Width - RectBtn.Width;
|
|
_rectXAnima.Duration = new Duration(TimeSpan.FromSeconds((this.Width - RectBtn.Width - Canvas.GetLeft(RectBtn)) / ComParameters.Parameters.rectBtnSpeed));
|
|
_rectXAnima.AutoReverse = true;
|
|
_rectXAnima.RepeatBehavior = RepeatBehavior.Forever;
|
|
Storyboard.SetTarget(_rectXAnima, RectBtn);
|
|
Storyboard.SetTargetProperty(_rectXAnima, new PropertyPath(Canvas.LeftProperty));
|
|
story.Children.Add(_rectXAnima);
|
|
break;
|
|
}
|
|
case "3"://随机移动
|
|
{
|
|
Canvas.SetLeft(RectBtn, 0);
|
|
Canvas.SetTop(RectBtn, 0);
|
|
//随机位置
|
|
var endX = _random.Next(0, Convert.ToInt32(this.Width - RectBtn.Width));
|
|
var endY = _random.Next(0, Convert.ToInt32(this.Height - RectBtn.Height));
|
|
//计算两点间的距离并计算所耗时间
|
|
var x = Math.Abs(Canvas.GetLeft(RectBtn) - endX);
|
|
var y = Math.Abs(Canvas.GetTop(RectBtn) - endY);
|
|
var z = Math.Sqrt(x * x + y * y);
|
|
var time = z / ComParameters.Parameters.rectBtnSpeed;
|
|
//X轴方向移动
|
|
_rectXAnima.From = Canvas.GetLeft(RectBtn);
|
|
_rectXAnima.To = endX;
|
|
_rectXAnima.Duration = new Duration(TimeSpan.FromSeconds(time));
|
|
Storyboard.SetTarget(_rectXAnima, RectBtn);
|
|
Storyboard.SetTargetProperty(_rectXAnima, new PropertyPath(Canvas.LeftProperty));
|
|
story.Children.Add(_rectXAnima);
|
|
|
|
//Y轴方向移动
|
|
_rectYAnima.From = Canvas.GetTop(RectBtn);
|
|
_rectYAnima.To = endY;
|
|
_rectYAnima.Duration = new Duration(TimeSpan.FromSeconds(time));
|
|
Storyboard.SetTarget(_rectYAnima, RectBtn);
|
|
Storyboard.SetTargetProperty(_rectYAnima, new PropertyPath(Canvas.TopProperty));
|
|
story.Children.Add(_rectYAnima);
|
|
story.Completed += RectBtnMove_Completed;
|
|
|
|
break;
|
|
}
|
|
}
|
|
story.Begin();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.MyLog.WriteLogFile("设置悬浮图标的动画出错:" + ex.Message);
|
|
}
|
|
|
|
}
|
|
#endregion
|
|
|
|
private void Window_TouchDown(object sender, TouchEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
switch (ComParameters.Parameters.devType)
|
|
{
|
|
case "导视":
|
|
{
|
|
//导视点击数据上报
|
|
Action ac = new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
HttpComm.Http.UploadClickData();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("导视点击数据上报:" + ex.ToString(), "ScreenWindowNew");
|
|
}
|
|
|
|
});
|
|
ac.BeginInvoke(null, null);
|
|
this.Dispatcher.Invoke((Action)(() =>
|
|
{
|
|
this.Hide();
|
|
Thread.Sleep(300);
|
|
this.Close();
|
|
}));
|
|
break;
|
|
}
|
|
case "信发":
|
|
{
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.MyLog.WriteLogFile("ScreenWindowNew关闭失败:" + ex.Message);
|
|
}
|
|
}
|
|
}
|
|
public class StopPlay
|
|
{
|
|
public bool IsStart = true;
|
|
public StopPlay()
|
|
{
|
|
IsStart = true;
|
|
}
|
|
}
|
|
}
|
|
|