using HMI.Core.Entity; using HMI.Core.Util; using HMI.UI.DpUtil; using HMI.UI.Util; using Microsoft.Win32; using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.PTG; using Panuon.WPF.UI; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Windows.Controls; namespace HMI.ParameterManage { public class BoolData { public int Index { get; } public bool Value { get; set; } public BoolData(int index) { this.Index = index; } } public class IntData { public int Index { get; } public int Value { get; set; } public IntData(int index) { this.Index = index; } } public class DoubleData { public int Index { get; } public double Value { get; set; } public DoubleData(int index) { this.Index = index; } } public class StringData { public int Index { get; } public string Value { get; set; } = string.Empty; public StringData(int index) { this.Index = index; } } /// /// ModalWindow.xaml 的交互逻辑 /// public partial class SettingModal : WindowX { public SettingModal() { this.DataContext = this; InitializeComponent(); } public ParameterData Data { get; set; } private ObservableCollection Datasource; private bool _isProcessing; protected override void OnClosing(CancelEventArgs e) { //Press Continue Button if (DialogResult == true) { if (_isProcessing) { e.Cancel = true; return; } var okButton = WindowXModalDialog.GetOKButton(this); try { _isProcessing = true; ButtonHelper.SetIsPending(okButton, true); if (!ValidateForm()) { e.Cancel = true; return; } SaveOrUpdateParameter(Data); } catch (Exception ex) { ToastHelper.Error(this, $"Error: {ex.Message}"); e.Cancel = true; return; } finally { _isProcessing = false; ButtonHelper.SetIsPending(okButton, false); } } base.OnClosing(e); } public bool ValidateName(object value, out string err) { err = null; var data = Datasource?.FirstOrDefault(e => e.Name == value.ToString()); if (data != null && data != Data) { err = this.lang("App.MustBeUnique", this.lang("Pm.Parameter.Name")); return false; } return true; } private void SaveOrUpdateParameter(ParameterData data) { } private bool ValidateForm() { bool flag = FormGroupHelper.ValidateForm(formPanel, new Dictionary { { "FgValue",GetTargetValue()} }); if (flag) { Data.Name = TbName.Text; Data.Type = CbType.Text; Data.IsArray = CbIsArray.IsChecked == true; Data.Length = int.Parse(NiLength.Text); Data.Value = GetTargetValue(); Data.Unit = TbUnit.Text; Data.Description = TbDescription.Text; Data.PGroup = TbGroup.Text; Data.Source = TbSource.Text; } return flag; } public bool? Open(ParameterData data, ObservableCollection datasource, List groups,string productName = null) { if (!string.IsNullOrEmpty(productName)) { FgProductName.Visibility = System.Windows.Visibility.Visible; TbProductName.Text = productName; } Datasource = datasource; Data = data; TbGroup.ItemsSource = groups; TbName.Text = Data.Name; CbType.SelectedValue = Data.Type; CbIsArray.IsChecked = Data.IsArray; NiLength.Text = Data.Length.ToString(); UpdateWindow(Data.Type); UpdateForm(Data); TbUnit.Text = Data.Unit; TbDescription.Text = Data.Description; TbGroup.Text = Data.PGroup; TbSource.Text = Data.Source; return this.ShowDialog(); } private string GetTargetValue() { var type = CbType.Text; if (CbIsArray.IsChecked == true) { var arr = (object[])arrayInput.ItemsSource; return string.Join(",", arr.Select(e => e.GetType().GetProperty("Value").GetValue(e).ToString()).ToArray()); } if (type == "Int" || type == "Double") { return NiNumberValue.Text; } else if (type == "Bool") { return CbBoolValue.Text; } else { return TbStringValue.Text; } } private void UpdateForm(ParameterData data) { if (data.IsArray) { string[] arr = data.Value.Split(','); arrayInput.ItemsSource = RefreshArray(arr, Data.Type); } else { if (Data.Type == "Int" || Data.Type == "Int") { NiNumberValue.Text = Data.Value; } else if (Data.Type == "Bool") { CbBoolValue.SelectedValue = Data.Value; } else { TbStringValue.Text = Data.Value; } } } private void UpdateWindow(string type) { if (type == "Int" || type == "Double") { NiNumberValue.Visibility = System.Windows.Visibility.Visible; StringValueGrid.Visibility = System.Windows.Visibility.Collapsed; CbBoolValue.Visibility = System.Windows.Visibility.Collapsed; } else if (type == "Bool") { NiNumberValue.Visibility = System.Windows.Visibility.Collapsed; StringValueGrid.Visibility = System.Windows.Visibility.Collapsed; CbBoolValue.Visibility = System.Windows.Visibility.Visible; } else { NiNumberValue.Visibility = System.Windows.Visibility.Collapsed; StringValueGrid.Visibility = System.Windows.Visibility.Visible; CbBoolValue.Visibility = System.Windows.Visibility.Collapsed; } } private void CbType_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { string val = null; if (e.AddedItems != null && e.AddedItems.Count > 0) { val = ((ComboBoxItem)e.AddedItems[0]).Content.ToString(); } UpdateWindow(val); if (CbIsArray.IsChecked == true) { arrayInput.ItemsSource = RefreshArray(GetLength(), val); } } private void Button_Click(object sender, System.Windows.RoutedEventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == true) { TbStringValue.Text = ofd.FileName; } } private void CbIsArray_Checked(object sender, System.Windows.RoutedEventArgs e) { bool isChecked = ((CheckBox)sender).IsChecked == true; if (isChecked) { FgLength.Visibility = System.Windows.Visibility.Visible; arrayInput.Visibility = System.Windows.Visibility.Visible; arrayInput.ItemsSource = RefreshArray(GetLength(), CbType.Text); } else { FgLength.Visibility = System.Windows.Visibility.Collapsed; arrayInput.Visibility = System.Windows.Visibility.Collapsed; } } private object[] RefreshArray(int length, string type) { var arr = new object[length]; for (int i = 0; i < length; i++) { if (type == "Int") { arr[i] = new IntData(i); } else if (type == "Double") { arr[i] = new DoubleData(i); } else if (type == "Bool") { arr[i] = new BoolData(i); } else { arr[i] = new StringData(i); } } return arr; } private object[] RefreshArray(string[] source, string type) { var arr = new object[source.Length]; type = string.IsNullOrEmpty(type) ? "String" : type; for (int i = 0; i < arr.Length; i++) { if (type == "Int") { arr[i] = new IntData(i) { Value = int.Parse(source[i]) }; } else if (type == "Double") { arr[i] = new DoubleData(i) { Value = double.Parse(source[i]) }; } else if (type == "Bool") { arr[i] = new BoolData(i) { Value = bool.Parse(source[i]) }; } else { arr[i] = new StringData(i) { Value = source[i] }; } } return arr; } private int GetLength() { try { string text = NiLength.Text; if (text.Contains(".")) { text = text.Split('.')[0]; } int length = int.Parse(text); return length > 0 ? length : 1; } catch { return 1; } } private void NiLength_TextChanged(object sender, TextChangedEventArgs e) { if (CbIsArray.IsChecked != true) { return; } arrayInput.ItemsSource = RefreshArray(GetLength(), CbType.Text); } } }