using CommunityToolkit.Mvvm.Input; using FLY.OBJComponents.IService; using FLY.Thick.Base.Common; using FLY.Thick.Base.IService; using FObjBase.Reflect; using MultiLayout; using MultiLayout.UiModule; using System; using System.ComponentModel; using System.Globalization; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Threading; using Unity; namespace FLY.Thick.Base.UI.UiModule { /// /// DynAreaIO.xaml 的交互逻辑 /// public partial class DynAreaIO : UserControl { DynAreaErrorVm2 errorVm; DynAreaIOVm ioVm; IUnityContainer container; public DynAreaIO() { InitializeComponent(); } [InjectionMethod] public void Init( IUnityContainer container, IWarningSystem2Service warningSystem) { this.container = container; ioVm = container.Resolve(); errorVm = new DynAreaErrorVm2(); var serverName = (string)Application.Current.FindResource("str.DynArea.TGauge"); //TODO, 只能翻译 FLY.Base.Common.ERRNOs 定义的。 就算是它的子类,也需要提前调用 子类静态构造函数 errorVm.Init(container, warningSystem, serverName, ERRNOs.GetDescription); this.DataContext = ioVm; grid_error.DataContext = errorVm; } } public class DynAreaIOVm : INotifyPropertyChanged { #region 延时推送 MARKNO const int MARKNO_UPDATEERROR = 1; #endregion public event PropertyChangedEventHandler PropertyChanged; public UInt16 IStatus { get; set; } = 0xffff; public UInt16 OStatus { get; set; } = 0x00ff; public bool IsIOShowNo { get; set; } = false; public int Hrs { get; set; } = 3; /// /// 是永久使用 /// public bool IsForever { get; set; } = false; public RelayCommand OpenIoTipCmd { get; private set; } public RelayCommand OpenAccessCmd { get; private set; } DynArea dynArea; IUnityContainer container; public DynAreaIOVm() { OpenIoTipCmd = new RelayCommand(OpenIoTip); OpenAccessCmd = new RelayCommand(OpenAccess); } [InjectionMethod] public void Init( IUnityContainer container, ITDGageService gageService) { this.dynArea = gageService.DynArea; this.container = container; Misc.BindingOperations.SetBinding(this.dynArea, nameof(this.dynArea.IStatus), this, nameof(IStatus)); Misc.BindingOperations.SetBinding(this.dynArea, nameof(this.dynArea.OStatus), this, nameof(OStatus)); Misc.BindingOperations.SetBinding(this.dynArea, nameof(this.dynArea.IsIOShowNo), this, nameof(IsIOShowNo)); Misc.BindingOperations.SetBinding(this.dynArea, nameof(this.dynArea.Hrs), this, nameof(Hrs)); UpdateIsForever(); this.dynArea.PropertyChanged += (s, e) => { if (e.PropertyName == nameof(this.dynArea.Hrs)) { UpdateIsForever(); } }; } void UpdateIsForever() { if (dynArea.Hrs > 50000) IsForever = true; else IsForever = false; } private void OpenAccess() { WdFlyADAccess w = new WdFlyADAccess(); var flyAdService = container.Resolve(); w.Init(flyAdService); w.Owner = App.Current.MainWindow; w.ShowDialog(); } private void OpenIoTip() { var w = new WdIOTip(); container.BuildUp(w); w.Owner = App.Current.MainWindow; w.ShowDialog(); } } public class DynAreaIOVmUt : DynAreaIOVm { public DynAreaIOVmUt() { IStatus = 0xff7f; OStatus = 0x0005; Hrs = 2000; IsForever = false; } } public class DynAreaErrorVm2 : INotifyPropertyChanged { /// /// 有异常 /// public bool IsError { get; set; } /// /// 异常消息 /// public string ErrMsg { get; set; } public RelayCommand OpenWarningCmd { get; } public event PropertyChangedEventHandler PropertyChanged; IWarningSystem2Service warningSystem; IUnityContainer container; /// /// 服务名称,用于显示 XXX服务器连接断开 /// string serverName; DispatcherTimer timer_error; private int reason_list_index = -1; bool isTGauge; ToDescriptionHandler toDescription; public DynAreaErrorVm2() { OpenWarningCmd = new RelayCommand(OpenWarning); } public void Init( IUnityContainer container, IWarningSystem2Service warningSystem, string serverName, ToDescriptionHandler toDescription) { this.container = container; this.warningSystem = warningSystem; this.serverName = serverName; this.toDescription = toDescription; //报警原因轮流显示 timer_error = new DispatcherTimer(); timer_error.Interval = TimeSpan.FromSeconds(3); timer_error.Tick += (s, e) => { reason_list_index--; if (reason_list_index < 0) if (warningSystem.ReasonList != null && warningSystem.ReasonList.Count() > 0) reason_list_index = warningSystem.ReasonList.Count(); else reason_list_index = -1; UpdateError(); }; warningSystem.PropertyChanged += WarningSystem_PropertyChanged; UpdateError(); } private void WarningSystem_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(Reflect_SeviceClient.IsConnected)) { UpdateError(); } else if (e.PropertyName == nameof(warningSystem.ReasonList)) { if (warningSystem.ReasonList != null && warningSystem.ReasonList.Count() > 0) reason_list_index = warningSystem.ReasonList.Count() - 1; else reason_list_index = -1; UpdateError(); } } void UpdateError() { if (this.warningSystem is FObjBase.FObjServiceClient) { var client = this.warningSystem as FObjBase.FObjServiceClient; string state_msg = (string)Application.Current.TryFindResource("str.DynArea.ServerDC"); if (!client.IsConnected) { ErrMsg = $"{serverName}{state_msg}"; IsError = true; reason_list_index = -1; timer_error.Stop(); return; } } if (warningSystem.ReasonList != null && warningSystem.ReasonList.Count() > 0) { if (reason_list_index >= warningSystem.ReasonList.Count()) reason_list_index = warningSystem.ReasonList.Count() - 1; else if (reason_list_index < 0) reason_list_index = 0; //通过资源翻译报警信息 if (toDescription != null) { ErrMsg = toDescription(warningSystem.ReasonList[reason_list_index].ErrCode); } else { ErrMsg = warningSystem.ReasonList[reason_list_index].Description; } IsError = true; timer_error.Start(); } else { IsError = false; ErrMsg = ""; reason_list_index = -1; timer_error.Stop(); } } private void OpenWarning() { if (!WdPassword.Authorize("Warning")) return; if (isTGauge) { //测厚仪的 var p = new PgErrorTable(); p.Init(container, warningSystem, toDescription); FlyLayoutManager.NavigationService.Navigate(p); } else { var p = new PgErrorTable2(); p.Init(container, warningSystem, toDescription); FlyLayoutManager.NavigationService.Navigate(p); } } } public class UiModule2_DynAreaIO : IUiModule2 { public string Title => "测厚.IO状态(报警)"; public ComponentType Type => ComponentType.DynArea; public bool IsUnique => true; public FrameworkElement GetComponent(int id, IUnityContainer container) { DynAreaIO graph = container.Resolve(); return graph; } public FrameworkElement GetThumbnail() { return new System.Windows.Controls.Grid(); } public void MatchParam(int[] IDs) { } } public class IONumberConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { bool isIOShowNo = true; int idx = 0; if (value is bool) { isIOShowNo = (bool)value; } if (!(parameter is string)) { return null; } if (!int.TryParse((string)parameter, out idx)) { return null; } if (isIOShowNo) { return (idx + 1).ToString(); } else { return (idx).ToString(); } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } }