using MeterVision.Config; using MeterVision.db; using MeterVision.Dlg; using MeterVision.FreeAi; using MeterVision.Patch; using MeterVision.Single; using MeterVision.Stand; using MeterVision.Station; using MeterVision.Upgrade; using MeterVision.Util; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; using System.Runtime.InteropServices; 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; namespace MeterVision { /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { //全局硬件码 public static string MachineCode; //绑定ConfigItem的属性就可以完成绑定操作 //public event PropertyChangedEventHandler PropertyChanged; //protected void OnPropertyChanged(string propertyName) //{ // PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); //} //private ConfigItem _configItem; //public ConfigItem mConfigItem //{ // get => _configItem; // set // { // _configItem = value; // //确保通知属性更改 // //OnPropertyChanged(nameof(mConfigItem)); // } //} [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr AddDllDirectory(string NewDirectory); [DllImport("kernel32.dll")] static extern bool SetDefaultDllDirectories(uint DirectoryFlags); const uint LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x00001000; //-------------------------------------------- private SolidColorBrush SelectedForeground; public CfginiItem CurConfigItem { get; set; } //字典用于缓存已加载的页面 private Dictionary pageCache = new Dictionary(); //第几个实例 public int InstanceIndex { get; set; } public MainWindow() { InitializeComponent(); SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS); //AddDllDirectory(AppDomain.CurrentDomain.BaseDirectory + "dlls"); AddDllDirectory(AppDomain.CurrentDomain.BaseDirectory); this.Title = $"{this.Title} V{UpgradeHelper.GetCurrentVersion()}"; SelectedForeground = Brushes.DarkGreen; //new SolidColorBrush((Color)ColorConverter.ConvertFromString("#2196F3")); ResetButtonForegrounds(); CurConfigItem = CfginiItem.GetConfigItem(); //ConfigItem.GetConfigItem(); this.DataContext = this; this.Loaded += MainWindow_Loaded; UpdateDatabase(); } //更新数据库(因为有添加的字段) private void UpdateDatabase() { DBPatch.UpdateTPatchDetailSchema(); DBSingle.UpdateTSingleDetailSchema(); } private void MainWindow_Loaded(object sender, RoutedEventArgs e) { if(LicenseMana.mLicenseModel != null) { if (LicenseMana.mLicenseModel.IsPermanent) { this.Title = $"{this.Title} (永久注册)"; } else { this.Title = $"{this.Title} (L)"; } } else { this.Title = $"{this.Title} (未注册)"; } //控制lblInstanceIndex背景色的颜色 int colorIndex = InstanceIndex % 3; if(colorIndex == 1) { lblInstanceIndex.Background = Brushes.Red; } else if (colorIndex == 2) { lblInstanceIndex.Background = Brushes.Green; } else { lblInstanceIndex.Background = Brushes.Blue; } lblInstanceIndex.Content = $"第{InstanceIndex}个"; } private void BtnConfig_Click(object sender, RoutedEventArgs e) { EditConfigDlg dialog = new EditConfigDlg() { Owner = this, WindowStartupLocation = WindowStartupLocation.CenterOwner }; if(dialog.ShowDialog() == true) { } //ResetButtonForegrounds(); //txtConfig.Foreground = Brushes.DarkGreen; //string key = "ConfigPage"; //// 检查字典中是否已有该页面 //if (pageCache.ContainsKey(key)) //{ // ContentArea.Content = pageCache[key]; // 如果存在,直接显示该页面 //} //else //{ // var page = new UCConfig(); //UCSingleGrid(); // 新建页面 // //pageCache[key] = page; // 缓存页面 // ContentArea.Content = page; // 显示新页面 //} } private void BtnSetStation_Click(object sender, RoutedEventArgs e) { ResetButtonForegrounds(); txtSetStation.Foreground = Brushes.DarkGreen; string key = "SetStation"; // 检查字典中是否已有该页面 if (pageCache.ContainsKey(key)) { ContentArea.Content = pageCache[key]; // 如果存在,直接显示该页面 } else { var page = new UCStationMain(); // 新建页面 //pageCache[key] = page; // 缓存页面 ContentArea.Content = page; // 显示新页面 } } //单张图片的处理 private void BtnSingleImage_Click(object sender, RoutedEventArgs e) { ResetButtonForegrounds(); // 将被点击的按钮前景色设置为DarkGreen txtSingleImage.Foreground = SelectedForeground; //"#2196F3" //Brushes.DarkGreen; string key = "SingleImagePage"; // 检查字典中是否已有该页面 if (pageCache.ContainsKey(key)) { ContentArea.Content = pageCache[key]; // 如果存在,直接显示该页面 } else { var page = new UCSingleMain(); //UCSingleGrid(); // 新建页面 pageCache[key] = page; // 缓存页面 ContentArea.Content = page; // 显示新页面 } } private void BtnStandImport_Click(object sender,RoutedEventArgs e) { ResetButtonForegrounds(); // 将被点击的按钮前景色设置为DarkGreen txtStandImport.Foreground = Brushes.DarkGreen; string key = "StandImportPage"; // 检查字典中是否已有该页面 if (pageCache.ContainsKey(key)) { ContentArea.Content = pageCache[key]; // 如果存在,直接显示该页面 } else { var page = new UCStandMain(); // 新建页面 pageCache[key] = page; // 缓存页面 ContentArea.Content = page; // 显示新页面 } } //批量图片的处理 private void BtnPatchImage_Click(object sender, RoutedEventArgs e) { ResetButtonForegrounds(); // 将被点击的按钮前景色设置为DarkGreen txtPatchImage.Foreground = Brushes.DarkGreen; string key = "PatchImagePage"; // 检查字典中是否已有该页面 if (pageCache.ContainsKey(key)) { ContentArea.Content = pageCache[key]; // 如果存在,直接显示该页面 } else { var page = new UCPatchMain(); pageCache[key] = page; // 缓存页面 ContentArea.Content = page; // 显示新页面 } } private void BtnPatchCompare_Click(object sender, RoutedEventArgs e) { ResetButtonForegrounds(); // 将被点击的按钮前景色设置为DarkGreen txtCompareImage.Foreground = Brushes.DarkGreen; string key = "CompareImagePage"; // 检查字典中是否已有该页面 if (pageCache.ContainsKey(key)) { ContentArea.Content = pageCache[key]; // 如果存在,直接显示该页面 } else { var page = new UCCompMain(); pageCache[key] = page; // 缓存页面 ContentArea.Content = page; // 显示新页面 } } private void ResetButtonForegrounds() { //txtConfig.Foreground = Brushes.Black; txtSingleImage.Foreground = Brushes.Black; txtStandImport.Foreground = Brushes.Black; txtPatchImage.Foreground = Brushes.Black; txtCompareImage.Foreground = Brushes.Black; txtSetStation.Foreground = Brushes.Black; } private void BtnAbout_Click(object sender, RoutedEventArgs e) { AboutWindow aboutWindow = new AboutWindow() { Owner = Application.Current.MainWindow }; aboutWindow.ShowDialog(); // 显示为模态窗口 } private void BtnCheckUpgrade_Click(object sender, RoutedEventArgs e) { WaitWindow waitWindow = null; try { string titleInfo = "正在检查升级信息,请稍后..."; waitWindow = new WaitWindow(titleInfo) { Owner = Application.Current.MainWindow, WindowStartupLocation = WindowStartupLocation.CenterOwner }; waitWindow.Show(); UpgradeModel upgradeModel = UpgradeHelper.ReadUpdateTxt(); //waitWindow.Close(); //获取当前的版本与versionCode比较 string currentVersion = UpgradeHelper.GetCurrentVersion(); // 获取服务器返回的 versionCode(假设是字符串 "1.0.0.6") string serverVersionCode = upgradeModel.VersionCode; if (UpgradeHelper.IsNewVersionAvailable(currentVersion, serverVersionCode)) { //MessageBox.Show($"发现新版本({serverVersionCode})。请升级应用。", "升级提示", // MessageBoxButton.OK, MessageBoxImage.Information); WndUpdateAsk updateAsk = new WndUpdateAsk(upgradeModel) { Owner = Application.Current.MainWindow, WindowStartupLocation = WindowStartupLocation.CenterOwner }; updateAsk.ShowDialog(); } else { MessageBox.Show("当前已经是最新版本。", "无升级", MessageBoxButton.OK, MessageBoxImage.Information); } } catch(Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButton.OK, MessageBoxImage.Error); } if(waitWindow != null) { waitWindow.Close(); } } //注册 private void BtnReg_Click(object sender, RoutedEventArgs e) { RegisterDlg registerDlg = new RegisterDlg { Owner = this, WindowStartupLocation = WindowStartupLocation.CenterOwner }; if (registerDlg.ShowDialog() == true) { } } private void Overlay_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // 如果覆盖层可见且用户点击了它,则隐藏覆盖层并关闭对话框 //if (this.overlay.Visibility == Visibility.Visible) //{ // this.overlay.Visibility = Visibility.Collapsed; // // 尝试关闭与覆盖层关联的对话框 // foreach (Window window in Application.Current.Windows) // { // if (window != this && window.IsActive) // { // window.Close(); // break; // } // } //} } private void Window_PreviewMouseDown(object sender, MouseButtonEventArgs e) { // 查找所有打开的窗口 foreach (Window child in Application.Current.Windows) { // 检查是否是你想要的窗口 if (child is imgWindow || child is EditStandValueDlg || child is LogViewerWindow) { child.Close(); } } } private void Window_PreviewKeyDown(object sender, KeyEventArgs e) { // 当按下 Esc 键时关闭对话框 if (e.Key == Key.Escape) { foreach (Window child in Application.Current.Windows) { // 检查是否是你想要的窗口 if (child is imgWindow || child is EditStandValueDlg || child is LogViewerWindow) { child.Close(); } } } } public object GetActivityUC() { return ContentArea.Content; } private async void BtnFreeSpace_Click(object sender, RoutedEventArgs e) { string titleInfo = "正在释放数据库空间占用,请稍候..."; WaitWindow waitWindow = new WaitWindow(titleInfo) { Owner = Application.Current.MainWindow, WindowStartupLocation = WindowStartupLocation.CenterOwner }; waitWindow.Show(); //DBStand.FreeDatabase(); try { await Task.Run(() => { DBStand.FreeDatabase(); }); } catch (Exception ex) { MessageBox.Show(Application.Current.MainWindow, $"失败:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } finally { //关闭等待窗口 waitWindow.Close(); } MessageBox.Show(this, "已释放", "提示",MessageBoxButton.OK, MessageBoxImage.Information); } private void ChkRealSendAILog_Checked(object sender, RoutedEventArgs e) { FaRun.SendAiLogEnable = true; } private void ChkRealSendAILog_Unchecked(object sender, RoutedEventArgs e) { FaRun.SendAiLogEnable = false; } private void ChkRealRecordAILog_Checked(object sender, RoutedEventArgs e) { FaRun.RecordRealLogEnable = true; } private void ChkRealRecordAILog_Unchecked(object sender, RoutedEventArgs e) { FaRun.RecordRealLogEnable = false; } private void BtnViewRealLog_Click(object sender, RoutedEventArgs e) { ViewRealLogDlg dialog = new ViewRealLogDlg() { Owner = this, WindowStartupLocation = WindowStartupLocation.CenterOwner }; dialog.ShowDialog(); } //临时修改Json文件 private void BtnUpdateJson_Click(object sender, RoutedEventArgs e) { string standJsonFile = @"D:\RT102_AI\mv2_json\goog_20250408120027.json"; string updateJsonFile = @"D:\RT102_AI\mv2_json\all_20250401142632.json"; string standJson = File.ReadAllText(standJsonFile); string updateJson = File.ReadAllText(updateJsonFile); List standList = JsonConvert.DeserializeObject>(standJson) ?? new List(); List updateList = JsonConvert.DeserializeObject>(updateJson) ?? new List(); foreach(TStandDetail stand in standList) { foreach(TStandDetail update in updateList) { if (stand.SrcImage.Equals(update.SrcImage)) { update.StandValue = stand.StandValue; update.ENumCount = stand.ENumCount; update.ELastUnit = stand.ELastUnit; update.MeterType = stand.MeterType; update.BrightVal = stand.BrightVal; update.FlowRate = stand.FlowRate; update.DialRegion = stand.DialRegion; update.NumCount = stand.NumCount; update.IndCount = stand.IndCount; update.FeatureRegion = stand.FeatureRegion; update.LastUnit = stand.LastUnit; update.LastValue = stand.LastValue; update.LastTime = stand.LastTime; break; } } } string fileName = @"D:\RT102_AI\mv2_json\all_20250401142632_update.json"; string json = JsonConvert.SerializeObject(updateList, Formatting.Indented); // 格式化 JSON File.WriteAllText(fileName, json); MessageBox.Show("修改完成"); } //---------------------------------------------------------- } }