using System; using System.ComponentModel; using System.Reflection; using System.Windows; using Microsoft.Win32; using Panuon.WPF.UI; using HMI.Core.Annotation; using HMI.Core.Entity; using HMI.Core.Exceptions; using HMI.Core.Util; using HMI.MenuManage.Entity; namespace HMI.MenuManage { /// /// ModalWindow.xaml 的交互逻辑 /// public partial class MenuModal : WindowX { public MenuModal() { InitializeComponent(); } public MenuData Data { get; set; } public SqliteHelper sqliteHelper { get; set; } 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; } SaveOrUpdateData(); } catch (Exception ex) { Panuon.WPF.UI.Toast.Show(this, "Error!", ToastPosition.Top); e.Cancel = true; return; } finally { _isProcessing = false; ButtonHelper.SetIsPending(okButton, false); } } base.OnClosing(e); } private bool ValidateForm() { try { FormValidateException ex = new FormValidateException(); string segment = string.IsNullOrEmpty(Data.Id) ? "" : $" AND id!='{Data.Id}'"; string sql = $"SELECT 1 FROM menu WHERE code='{TbCode.Text}'{segment};"; if (string.IsNullOrEmpty(TbCode.Text)) { ex.Result.Add(new FormGroupValidateResult("请输入菜单编号", FgCode)); } else if (sqliteHelper.HasData(sql)) { ex.Result.Add(new FormGroupValidateResult("菜单编号不能重复", FgCode)); } else { FgCode.ValidateResult = ValidateResult.None; FgCode.Message = null; } if (string.IsNullOrEmpty(TbName.Text)) { ex.Result.Add(new FormGroupValidateResult("请输入菜单名称", FgName)); } else { FgName.ValidateResult = ValidateResult.None; FgName.Message = null; } if(string.IsNullOrEmpty(TbIcon.Text)) { ex.Result.Add(new FormGroupValidateResult("请选择菜单图标", FgIcon)); } else { FgIcon.ValidateResult = ValidateResult.None; FgIcon.Message = null; } if (string.IsNullOrEmpty(TbLevel.Text)) { ex.Result.Add(new FormGroupValidateResult("请选择菜单级别", FgLevel)); } else { FgLevel.ValidateResult = ValidateResult.None; FgLevel.Message = null; } if (TbLevel.Text == "2") { if (string.IsNullOrEmpty(TbType.Text)) { ex.Result.Add(new FormGroupValidateResult("请选择菜单类型", FgType)); } else { FgType.ValidateResult = ValidateResult.None; FgType.Message = null; } if (string.IsNullOrEmpty(TbParentCode.Text)) { ex.Result.Add(new FormGroupValidateResult("请选择上级菜单", FgParentCode)); } else { FgParentCode.ValidateResult = ValidateResult.None; FgParentCode.Message = null; } if (string.IsNullOrEmpty(TbDllPath.Text)) { ex.Result.Add(new FormGroupValidateResult("请选择Dll路径", FgDllPath)); } else { FgDllPath.ValidateResult = ValidateResult.None; FgDllPath.Message = null; } if (string.IsNullOrEmpty(TbClassName.Text)) { ex.Result.Add(new FormGroupValidateResult("请输入类名", FgClassName)); } else { FgClassName.ValidateResult = ValidateResult.None; FgClassName.Message = null; } } else { } if (!ex.Success) { throw ex; } } catch (FormValidateException ex) { foreach (var data in ex.Result) { var fg = (FormGroup)data.Sender; fg.ValidateResult = ValidateResult.Error; fg.Message = data.Message; } return false; } Data.Code = TbCode.Text; Data.Name = TbName.Text; Data.IconPath = TbIcon.Text; Data.Level = TbLevel.Text; Data.Type = TbType.Text; Data.ParentCode = TbParentCode.Text; Data.DllPath = TbDllPath.Text; Data.ClassName = TbClassName.Text; return true; } public bool? Open(MenuData data) { Data = data; TbCode.Text = Data.Code; TbName.Text = Data.Name; TbIcon.Text = Data.IconPath; TbLevel.SelectedValue = Data.Level; TbType.SelectedValue = Data.Type; TbParentCode.Text = Data.ParentCode; TbDllPath.Text = Data.DllPath; TbClassName.Text = Data.ClassName; return this.ShowDialog(); } private void SaveOrUpdateData() { if (string.IsNullOrEmpty(Data.Id)) { InsertMenu(Data); } else { UpdateMenu(Data); } } public void InsertMenu(MenuData data) { string sql = $@"INSERT INTO menu (code,name,iconPath,level,type,parentCode,dllPath,className) VALUES ('{data.Code}','{data.Name}','{data.IconPath}','{data.Level}','{data.Type}','{data.ParentCode}', '{data.DllPath}','{data.ClassName}');"; sqliteHelper.ExecuteSql(sql); } public void UpdateMenu(MenuData data) { string sql = $@"UPDATE menu SET code='{data.Code}',name='{data.Name}', iconPath='{data.IconPath}',level='{data.Level}',type='{data.Type}',parentCode='{data.ParentCode}', dllPath='{data.DllPath}',className='{data.ClassName}' WHERE id='{data.Id}';"; sqliteHelper.ExecuteSql(sql); } private void IconSelect_Click(object sender, RoutedEventArgs e) { string BasePath = PathHelper.IconFolder; OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "(*.*)|*.*"; openFileDialog.InitialDirectory = BasePath; openFileDialog.Title = "选择图片"; openFileDialog.Multiselect = false; if (openFileDialog.ShowDialog() == true) { string FileName = openFileDialog.FileName; if (!FileName.StartsWith(BasePath)) { Panuon.WPF.UI.Toast.Show(this, "请将图标移动至程序Icon目录下!", ToastPosition.Top); } else { TbIcon.Text = FileName.Replace(BasePath, "."); } } } private void DllSelect_Click(object sender, RoutedEventArgs e) { string pluginPath = PathHelper.PluginFolder(); OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "(*.dll)|*.dll"; openFileDialog.InitialDirectory = pluginPath; openFileDialog.Title = "选择文件"; openFileDialog.Multiselect = false; if (openFileDialog.ShowDialog() == true) { string FileName = openFileDialog.FileName; if (!FileName.StartsWith(pluginPath)) { Panuon.WPF.UI.Toast.Show(this, "请将插件移动至程序Plugin目录下!", ToastPosition.Top); } else { TbDllPath.Text = FileName.Replace(pluginPath, "."); try { object[] infos = Assembly.LoadFrom(FileName).GetCustomAttributes(typeof(PluginClassNameAttribute), false); if (infos != null && infos.Length > 0) { PluginClassNameAttribute attr = (PluginClassNameAttribute)infos[0]; TbClassName.Text = attr.ClassName; } } catch (Exception ex) { } } } } } }