using System; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; 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; using System.Windows.Threading; using FLY.IBC.Client; using FLY.IBC.UI.Client; using FLY.OBJComponents.Client; using FLY.OBJComponents.Common; namespace FLY.IBC.UI.Client.UIModule { /// <summary> /// Page_DynArea.xaml 的交互逻辑 /// </summary> public partial class Page_DynArea : Page { #region 延时推送 MARKNO const int MARKNO_UPDATEERROR = 1; #endregion IBCSystemClient iBCSystemClient; BufferWindow<FlyData_WarningHistory> mWindow; DispatcherTimer timer_error; DynAreaViewModelParams props = new DynAreaViewModelParams(); SetPLCUpdatePlan setPlan; public Page_DynArea() { InitializeComponent(); } public void Init(int id) { iBCSystemClient = TDGage.Current.mIBCSystemService; //创建窗口观察 报警原因列表 mWindow = TDGage.Current.mWarningReasonWindow; //报警原因轮流显示 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; grid_ibc.DataContext = iBCSystemClient.Item; grid_error.DataContext = props; //注册属性更新计划 setPlan = new FLY.OBJComponents.Client.SetPLCUpdatePlan( iBCSystemClient.PLCos, iBCSystemClient.Item, new string[] { "FilmWidth", "IsInletAirOn", "InletAirFreq", "IsOutletAirOn", "OutletAirFreq" }); iBCSystemClient.PropertyChanged += (s, e) => { if (e.PropertyName == "IsConnected") { updateError(); } }; updateError(); } 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 (!iBCSystemClient.IsConnected) { props.Error = "IBC服务器连接断开"; props.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; props.Error = mWindow.Record[reason_list_index].Description; props.IsError = true; timer_error.Start(); } else { props.IsError = false; props.Error = ""; reason_list_index = -1; timer_error.Stop(); } } private int reason_list_index = -1; private void Button_Click(object sender, RoutedEventArgs e) { //if (props.IsError) { NavigationService ns = Application.Current.Properties["NavigationService"] as NavigationService; if (ns != null) { Page_ErrorTable p = new Page_ErrorTable(); ns.Navigate(p); } } } } public class DynAreaViewModelParams : INotifyPropertyChanged { /// <summary> /// 有异常 /// </summary> public bool IsError { get; set; } /// <summary> /// 异常消息 /// </summary> public string Error { get; set; } public event PropertyChangedEventHandler PropertyChanged; } public class UIModule_DynArea : FLY.UI.Module.IUIModule { /// <summary> /// 控件标题 /// 它的值取决于culture /// </summary> public string Title { get { return "IBC状态"; } } /// <summary> /// 控件 /// 创建时,需要给它唯一ID,让加载自己的数据 /// </summary> /// <param name="id"></param> /// <returns></returns> public FrameworkElement GetComponent(int id) { Page_DynArea graph = new Page_DynArea(); 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) { } } }