using FLY.OBJComponents.Client; using FLY.Thick.Base.Common; using FLY.UI.Module; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; 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; using System.Windows.Threading; using ThickTcpUiInWindow; namespace FLY.Thick.BlowingScan.UI.Client.UIModule { /// <summary> /// DynAreaIO.xaml 的交互逻辑 /// </summary> public partial class DynAreaIO : UserControl { DynAreaIOViewModel viewModel; TDGage gage; public DynAreaIO() { InitializeComponent(); } public void Init(int id) { //获取设备 gage = Application.Current.Properties["ThickGage"] as TDGage; viewModel = new DynAreaIOViewModel(); viewModel.Init(gage.mDynArea, gage.mWarningReasonWindow); this.DataContext = viewModel; } protected virtual void Border_IO_Click(object sender, RoutedEventArgs e) { PgErrorTable p = new PgErrorTable(); p.Init(gage.mWarningService, gage.mWarningReasonWindow, gage.mFlyAdServiceClient, typeof(WdIOTip)); (Application.Current.Properties["NavigationService"] as NavigationService).Navigate(p); } } public class DynAreaIOViewModel : INotifyPropertyChanged { #region 延时推送 MARKNO const int MARKNO_UPDATEERROR = 1; #endregion public event PropertyChangedEventHandler PropertyChanged; public UInt16 IStatus { get; set; } = 0xffff; public UInt16 OStatus { get; set; } = 0x000f; public int Hrs { get; set; } = 3; /// <summary> /// 是永久使用 /// </summary> public bool IsForever { get; set; } = false; public bool IsError { get; set; } /// <summary> /// 异常消息 /// </summary> public string ErrMsg { get; set; } DynArea mDynArea; BufferWindow<OBJComponents.Common.FlyData_WarningHistory> mWindow; DispatcherTimer timer_error; private int reason_list_index = -1; public void Init(DynArea dynArea, OBJComponents.Client.BufferWindow<OBJComponents.Common.FlyData_WarningHistory> mWarningReasonWindow) { //创建窗口观察 报警原因列表 mWindow = mWarningReasonWindow; mDynArea = dynArea; Misc.BindingOperations.SetBinding(mDynArea, "IStatus", this, "IStatus"); Misc.BindingOperations.SetBinding(mDynArea, "OStatus", this, "OStatus"); Misc.BindingOperations.SetBinding(mDynArea, "Hrs", this, "Hrs"); UpdateIsForever(); //报警原因轮流显示 timer_error = new DispatcherTimer(); timer_error.Interval = TimeSpan.FromSeconds(3); timer_error.Tick += (s, e) => { reason_list_index--; if (reason_list_index < 0) reason_list_index = mWindow.Record.Count(); UpdateError(); }; mWindow.Record.CollectionChanged += Record_CollectionChanged; mDynArea.PropertyChanged += (s, e) => { if (e.PropertyName == "ServerIsConnected") { UpdateError(); } else if (e.PropertyName == "Hrs") { UpdateIsForever(); } }; UpdateError(); } void UpdateIsForever() { if (mDynArea.Hrs > 50000) IsForever = true; else IsForever = false; } private void Record_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { FObjBase.PollModule.Current.Poll_JustOnce( new FObjBase.PollModule.PollHandler(delegate () { reason_list_index = mWindow.Record.Count() - 1; UpdateError(); }), this, MARKNO_UPDATEERROR); } void UpdateError() { if (!mDynArea.ServerIsConnected) { ErrMsg = "服务器连接断开"; IsError = true; reason_list_index = -1; timer_error.Stop(); } else if (mWindow.Record.Count > 0) { if (reason_list_index >= mWindow.Record.Count) reason_list_index = mWindow.Record.Count - 1; else if (reason_list_index < 0) reason_list_index = 0; ErrMsg = mWindow.Record[reason_list_index].Description; IsError = true; timer_error.Start(); } else { IsError = false; ErrMsg = ""; reason_list_index = -1; timer_error.Stop(); } } } public class DynAreaIOViewModel_UnitTest : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public UInt16 IStatus { get; set; } = 0xff7f; public UInt16 OStatus { get; set; } = 0x0005; public int Hrs { get; set; } = 2000; /// <summary> /// 是永久使用 /// </summary> public bool IsForever { get; set; } = false; public bool IsError { get; set; } /// <summary> /// 异常消息 /// </summary> public string ErrMsg { get; set; } } public class UIModule_DynAreaIO : IUIModule { /// <summary> /// 控件标题 /// 它的值取决于culture /// </summary> public string Title { get { return Application.Current.FindResource("strDynAreaIO") as string; } } /// <summary> /// 控件 /// 创建时,需要给它唯一ID,让加载自己的数据 /// </summary> /// <param name="id"></param> /// <returns></returns> public FrameworkElement GetComponent(int id) { DynAreaIO graph = new DynAreaIO(); graph.Init(id); return graph; } /// <summary> /// 控件缩略图,用于编辑界面时,大致看看 /// 创建时,需要给它唯一ID,让加载自己的数据 /// </summary> /// <param name="id"></param> /// <returns></returns> public FrameworkElement GetThumbnail(int id) { return new System.Windows.Controls.Grid(); } /// <summary> /// 给出全部控件ID, 控件自行删除没有的参数 /// </summary> /// <param name="IDs"></param> public void MatchParam(int[] IDs) { } } }