From b544d5cccd76735e034c8055918a50927b437474 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期二, 10 十一月 2026 08:29:04 +0800
Subject: [PATCH] fix: 维护模式重复进入失败与按钮灰死 + Broker 并发验证用例

---
 WPFProject/Controls/MainTabControl.xaml.cs |  139 ++++++++++++++++++++++++++++++++++++----------
 1 files changed, 108 insertions(+), 31 deletions(-)

diff --git a/WPFProject/Controls/MainTabControl.xaml.cs b/WPFProject/Controls/MainTabControl.xaml.cs
index 37e847e..6b3fba5 100644
--- a/WPFProject/Controls/MainTabControl.xaml.cs
+++ b/WPFProject/Controls/MainTabControl.xaml.cs
@@ -1,14 +1,23 @@
-锘縰sing System.Collections.ObjectModel;
+锘縰sing HMI.Base;
+using HMI.Core.Api;
+using Panuon.WPF.UI;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
 using System.ComponentModel;
 using System.Runtime.CompilerServices;
 using System.Windows;
 using System.Windows.Controls;
-using HMI.Base;
-using HMI.Core.Api;
-using WPFProject.UI;
+using System.Windows.Data;
 
 namespace WPFProject.Controls
 {
+    public class TabChangedEventArg
+    {
+        public IPlugin oldValue { get; set; }
+        public IPlugin newValue { get; set; }
+    }
+
     /// <summary>
     /// MainTabControl.xaml 鐨勪氦浜掗�昏緫
     /// </summary>
@@ -33,31 +42,18 @@
         }
         #endregion
 
+        private WinFormHolder winFormHolder;
         public MainTabControl()
         {
-            IPlugin plugin = new WorkControl();
-            MenuItems = new ObservableCollection<PluginInfo>( PluginLoader.GetLoader().Menus);
+            MenuItems = new ObservableCollection<PluginInfo>(PluginLoader.GetLoader().Menus);
             SubMenuItems = MenuItems[0].Children;
             this.DataContext = this;
+            winFormHolder = new WinFormHolder();
             InitializeComponent();
         }
 
         // Tab鍒囨崲浜嬩欢
-        public static readonly RoutedEvent OnTabChangeEvent =
-             EventManager.RegisterRoutedEvent("OnTabChange", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MenuTabControl));
-
-        public event RoutedEventHandler OnTabChange
-        {
-            add
-            {
-                AddHandler(OnTabChangeEvent, value);
-            }
-
-            remove
-            {
-                RemoveHandler(OnTabChangeEvent, value);
-            }
-        }
+        public event EventHandler<TabChangedEventArg> TabChanged;
 
         private ObservableCollection<PluginInfo> _MenuItems;
 
@@ -87,6 +83,7 @@
             }
         }
 
+        private Dictionary<PluginInfo, PluginInfo> selectedCache = new Dictionary<PluginInfo, PluginInfo>();
 
         private ObservableCollection<PluginInfo> _SubMenuItems;
 
@@ -131,26 +128,106 @@
             {
                 var data = (PluginInfo)e.AddedItems[0];
                 SubMenuItems = data?.Children;
+                if (selectedCache.ContainsKey(data))
+                {
+                    SelectedSubMenu = selectedCache[data];
+                }
+                else if (SubMenuItems.Count > 0)
+                {
+                    SelectedSubMenu = SubMenuItems[0];
+                }
             }
         }
-
-        private void SwithMenu(PluginInfo menu)
-        {
-
-        }
-
 
         private void SubMenu_SelectionChanged(object sender, SelectionChangedEventArgs e)
         {
             if (e.AddedItems?.Count > 0)
             {
                 var data = (PluginInfo)e.AddedItems[0];
-                var content = (UIElement)data.Content;
-                var last = (IPlugin)page.Child;
+                if (SelectedMenu != null)
+                {
+                    selectedCache[SelectedMenu] = data;
+                }
+
+                var content = data.Content;
+                var newPlugin = PluginPackage.Get(content);
+                var last = PluginPackage.Get(page.Child);
+
+                if (last != null && !last.CanDeActive())
+                {
+                    SelectedSubMenu = (PluginInfo)e.RemovedItems[0];
+                    return;
+                }
+
+                if (newPlugin != null && !newPlugin.CanActive())
+                {
+                    if (e.RemovedItems.Count > 0)
+                    {
+                        SelectedSubMenu = (PluginInfo)e.RemovedItems[0];
+                    }
+                    return;
+                }
+
                 last?.DeActive();
-                page.Child = content;
-                ((IPlugin)content)?.Active();
+                newPlugin?.Active();
+                if (data.Type == "WinForm")
+                {
+                    if (content is System.Windows.Forms.Form form)
+                    {
+                        winFormHolder.Content = form;
+                    }
+                    else
+                    {
+                        winFormHolder.Content = content;
+                    }
+                    page.Child = winFormHolder;
+                }
+                else
+                {
+                    page.Child = (UIElement)content;
+                }
+                TabChanged?.Invoke(this, new TabChangedEventArg { oldValue = last, newValue = newPlugin });
             }
         }
+
+        private void UserControl_Loaded(object sender, RoutedEventArgs e)
+        {
+            var ss = ((WindowX)Window.GetWindow(this));
+            /// binding WinformHost 閬僵
+            //Binding binding = new Binding("IsMaskVisible")
+            //{
+            //    Source = ((WindowX)Window.GetWindow(this)),
+            //    Mode = BindingMode.TwoWay,
+            //    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
+            //};
+            //winFormHolder.SetBinding(WinFormHolder.MaskVisiableProperty, binding);
+            if (MenuItems != null && MenuItems.Count > 0)
+            {
+                SelectedMenu = MenuItems[0];
+            }
+            Loaded -= UserControl_Loaded;
+        }
+
+        private string alarmInfo;
+        public string AlarmInfo
+        {
+            get => alarmInfo;
+            set
+            {
+                RaiseAndSetIfChanged(ref alarmInfo, value);
+            }
+        }
+
+        private void Button_Click_1(object sender, RoutedEventArgs e)
+        {
+            alarmBorder.Visibility = Visibility.Collapsed;
+            AlarmInfo = string.Empty;
+        }
+
+        public void ShowAlarm(string message)
+        {
+            AlarmInfo = message;
+            alarmBorder.Visibility = Visibility.Visible;
+        }
     }
 }

--
Gitblit v1.9.1