From 9d1660270272180cd71147d6ddd53d1382643d2e Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 02 十一月 2026 18:00:14 +0800
Subject: [PATCH] merge: 并入远程 Initial commit 作为历史根节点

---
 WPFProject/Controls/MainTabControl.xaml.cs |  233 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 233 insertions(+), 0 deletions(-)

diff --git a/WPFProject/Controls/MainTabControl.xaml.cs b/WPFProject/Controls/MainTabControl.xaml.cs
new file mode 100644
index 0000000..6b3fba5
--- /dev/null
+++ b/WPFProject/Controls/MainTabControl.xaml.cs
@@ -0,0 +1,233 @@
+锘縰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 System.Windows.Data;
+
+namespace WPFProject.Controls
+{
+    public class TabChangedEventArg
+    {
+        public IPlugin oldValue { get; set; }
+        public IPlugin newValue { get; set; }
+    }
+
+    /// <summary>
+    /// MainTabControl.xaml 鐨勪氦浜掗�昏緫
+    /// </summary>
+    public partial class MainTabControl : UserControl, INotifyPropertyChanged
+    {
+        #region ...
+        public virtual event PropertyChangedEventHandler PropertyChanged;
+
+        protected virtual void RaisePropertyChanged(string name)
+        {
+
+            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
+        }
+
+        protected void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
+        {
+            old = @new;
+            if (propertyName != null)
+            {
+                RaisePropertyChanged(propertyName);
+            }
+        }
+        #endregion
+
+        private WinFormHolder winFormHolder;
+        public MainTabControl()
+        {
+            MenuItems = new ObservableCollection<PluginInfo>(PluginLoader.GetLoader().Menus);
+            SubMenuItems = MenuItems[0].Children;
+            this.DataContext = this;
+            winFormHolder = new WinFormHolder();
+            InitializeComponent();
+        }
+
+        // Tab鍒囨崲浜嬩欢
+        public event EventHandler<TabChangedEventArg> TabChanged;
+
+        private ObservableCollection<PluginInfo> _MenuItems;
+
+        public ObservableCollection<PluginInfo> MenuItems
+        {
+            get { return _MenuItems; }
+            set
+            {
+                RaiseAndSetIfChanged(ref _MenuItems, value);
+                RaisePropertyChanged("MenuItemsCount");
+            }
+        }
+
+        public int MenuItemsCount
+        {
+            get => MenuItems == null ? 0 : MenuItems.Count;
+        }
+
+        private PluginInfo _SelectedMenu;
+
+        public PluginInfo SelectedMenu
+        {
+            get { return _SelectedMenu; }
+            set
+            {
+                RaiseAndSetIfChanged(ref _SelectedMenu, value);
+            }
+        }
+
+        private Dictionary<PluginInfo, PluginInfo> selectedCache = new Dictionary<PluginInfo, PluginInfo>();
+
+        private ObservableCollection<PluginInfo> _SubMenuItems;
+
+        public ObservableCollection<PluginInfo> SubMenuItems
+        {
+            get { return _SubMenuItems; }
+            set
+            {
+                RaiseAndSetIfChanged(ref _SubMenuItems, value);
+                RaisePropertyChanged("SubMenuItemsCount");
+            }
+        }
+
+        public int SubMenuItemsCount
+        {
+            get => MenuItems == null ? 0 : MenuItems.Count;
+        }
+
+        private PluginInfo _SelectedSubMenu;
+
+        public PluginInfo SelectedSubMenu
+        {
+            get { return _SelectedSubMenu; }
+            set => RaiseAndSetIfChanged(ref _SelectedSubMenu, value);
+        }
+
+        private Visibility _MenuVisibility = Visibility.Collapsed;
+        public Visibility MenuVisibility
+        {
+            get => _MenuVisibility;
+            set { RaiseAndSetIfChanged(ref _MenuVisibility, value); }
+        }
+
+        public void ChangeItemVisibility(bool visiable)
+        {
+            MenuVisibility = visiable ? Visibility.Visible : Visibility.Collapsed;
+        }
+
+        private void Menu_SelectionChanged(object sender, SelectionChangedEventArgs e)
+        {
+            if (e.AddedItems?.Count > 0)
+            {
+                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 SubMenu_SelectionChanged(object sender, SelectionChangedEventArgs e)
+        {
+            if (e.AddedItems?.Count > 0)
+            {
+                var data = (PluginInfo)e.AddedItems[0];
+                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();
+                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