using HMI.Base; using HMI.Core.Api; using Panuon.WPF.UI; 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 { /// /// MainTabControl.xaml 的交互逻辑 /// 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(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(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); } } private ObservableCollection _MenuItems; public ObservableCollection 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 selectedCache = new Dictionary(); private ObservableCollection _SubMenuItems; public ObservableCollection 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 last = page.Child; PluginPackage.Get(last)?.DeActive(); 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; } PluginPackage.Get(content)?.Active(); } } private void UserControl_Loaded(object sender, RoutedEventArgs e) { var ss = ((WindowX)Window.GetWindow(this)); 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; } } }