using MultiLayout.UiModule;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Navigation;
using Unity;
namespace MultiLayout
{
public class FlyLayoutManager : INotifyPropertyChanged
{
public static NavigationService NavigationService
{
get {
return Application.Current.Properties["NavigationService"] as NavigationService;
}
set {
Application.Current.Properties["NavigationService"] = value;
}
}
NLog.ILogger logger = NLog.LogManager.GetCurrentClassLogger();
///
/// 本地模块
///
public List UIModules = new List();
public IUnityContainer uiContainer;
public IUnityContainer container;
LoadingProgress lp;
public FlyLayout layout;
public List serviceNames;
List onInits;
public event PropertyChangedEventHandler PropertyChanged;
///
/// 当前被选中的设备
///
public GageTabItem Selected { get; set; }
///
/// 设备标签可见
///
public bool IsGageTagVisible { get; set; } = true;
public bool IsInOption { get; set; }
public string GageTag
{
get {
if (Selected != null)
return Selected.Title;
else
return null;
}
}
///
///
///
public FlyLayoutManager()
{
}
///
///
///
///
///
///
public void Init(
FlyLayout layout,
IUnityContainer container,
LoadingProgress lp
)
{
//从根容器获取 UiModule 容器
this.container = container;
this.layout = layout;
this.uiContainer = container.Resolve("uiModule.ui");
this.lp = lp;
serviceNames = (from r in this.container.Registrations
where r.RegisteredType == typeof(IUnityContainer)
&& !string.IsNullOrEmpty(r.Name)
&& Regex.IsMatch(r.Name, @"\w+\.service")
select r.Name).ToList();
//找到所有的onInit
onInits = new List();
onInits.AddRange(container.ResolveAll());
//找到所有的服务中的onInit
foreach (var serviceName in serviceNames)
{
var serviceContainer = container.Resolve(serviceName);
var serviceOnInits = serviceContainer.ResolveAll();
foreach (var onInit in serviceOnInits)
{
if (!onInits.Contains(onInit))
{
onInits.Add(onInit);
}
}
}
onInits.Sort((o1, o2) =>
{
return o1.Level.CompareTo(o2.Level);
});
}
///
/// 加载模块
///
public async Task LoadModule()
{
//加载全部 ui module
UIModules.AddRange(uiContainer.ResolveAll());
await Task.Delay(10);
lp.Progress += 10;
//加载尺寸,位置
int SH = (int)SystemParameters.WorkArea.Height;
int SW = (int)SystemParameters.WorkArea.Width;
int x = layout.Rect.X;
if ((x < 0) || (x >= SW))
x = 0;
int y = layout.Rect.Y;
if ((y < 0) || (y >= SH))
y = 0;
int w = layout.Rect.Width;
if ((w < 100) || (w > SW))
w = SW;
int h = layout.Rect.Height;
if ((h < 100)|| (h > SH))
h = SH;
Application.Current.MainWindow.Left = x;
Application.Current.MainWindow.Top = y;
Application.Current.MainWindow.Width = w;
Application.Current.MainWindow.Height = h;
Application.Current.MainWindow.WindowState = layout.WindowState;
UserControl userControl;
if (layout.GageTabItems == null || layout.GageTabItems.Count()==0)
{
//一个设备也没有,返回单设备界面!!!
UcSingleGage ucSingleGage = new UcSingleGage();
ucSingleGage.Init(this);
userControl = ucSingleGage;
}
else if (layout.GageTabItems.Count() == 1)
{
//只有一个设备,返回单设备界面!!!
userControl = await LoadModule_single();
}
else
{
userControl = await LoadModule_multi();
}
Page pg = new Page();
pg.Content = userControl;
return pg;
}
async Task LoadModule_single()
{
var gageTabItem = layout.GageTabItems.First();
//获取容器
IUnityContainer container = null;
try
{
container = this.container.Resolve(gageTabItem.ServiceContainerName);
}
catch (Exception e)
{
//失败了,那就不显示!!!!
logger.Error(e, $"创建失败 gageTabItem({gageTabItem.Title})");
//给它总容器
container = this.container;
}
//把不支持的模块删除
gageTabItem.Components.RemoveAll(c => !UIModules.Any(uiModule => c.Module == uiModule.GetType().FullName));
//把布局内不存在于 Components 的删除
gageTabItem.MenuItems.RemoveAll(id => !gageTabItem.Components.Any(c => c.ID == id));
gageTabItem.DynAreaItems.RemoveAll(id => !gageTabItem.Components.Any(c => c.ID == id));
foreach (var tabitem in gageTabItem.Items)
tabitem.Graphs.RemoveAll(gc => !gageTabItem.Components.Any(c => c.ID == gc.ID));
await Task.Delay(10);
lp.Progress += 10;
//创建页面
UcSingleGage ucMainGage = new UcSingleGage();
ucMainGage.Init(this);
gageTabItem.TabControl = ucMainGage.tabControl_graph;
//初始化每个区
InitializeComponent_graph(gageTabItem, ucMainGage.tabControl_graph);
await Task.Delay(10);
lp.Progress += 10;
InitializeComponent_dynarea(gageTabItem, ucMainGage.stackpanel_dynarea);
await Task.Delay(10);
lp.Progress += 10;
InitializeComponent_menu(gageTabItem, ucMainGage.stackpanel_menu);
await Task.Delay(10);
lp.Progress += 10;
return ucMainGage;
}
async Task LoadModule_multi()
{
ucMultiGage = new UcMultiGage();
ucMultiGage.Init(this);
//注册导航器
NavigationService = ucMultiGage.NavigationService;
NavigationService.LoadCompleted += NavigationService_LoadCompleted;
var tabControl_gage = ucMultiGage.TabControl;
tabControl_gage.Items.Clear();
foreach (var gageTabItem in layout.GageTabItems)
{
//获取容器
IUnityContainer container = null;
try
{
container = this.container.Resolve(gageTabItem.ServiceContainerName);
}
catch (Exception e)
{
//失败了,使用总容器替换,不画了
logger.Error(e, $"创建失败 gageTabItem({gageTabItem.Title})");
continue;
}
//把不支持的模块删除
gageTabItem.Components.RemoveAll(c => !UIModules.Any(uiModule => c.Module == uiModule.GetType().FullName));
//把布局内不存在于 Components 的删除
gageTabItem.MenuItems.RemoveAll(id => !gageTabItem.Components.Any(c => c.ID == id));
gageTabItem.DynAreaItems.RemoveAll(id => !gageTabItem.Components.Any(c => c.ID == id));
foreach (var tabitem in gageTabItem.Items)
tabitem.Graphs.RemoveAll(gc => !gageTabItem.Components.Any(c => c.ID == gc.ID));
await Task.Delay(10);
lp.Progress += 10;
//创建页面
TabItem tabItem = new TabItem();
tabItem.Header = gageTabItem.Title;
UcSingleGage ucMainGage = new UcSingleGage();
ucMainGage.Init(this);
tabItem.Content = ucMainGage;
gageTabItem.TabControl = ucMainGage.tabControl_graph;
//初始化每个区
InitializeComponent_graph(gageTabItem, ucMainGage.tabControl_graph);
await Task.Delay(10);
lp.Progress += 10;
InitializeComponent_dynarea(gageTabItem, ucMainGage.stackpanel_dynarea);
await Task.Delay(10);
lp.Progress += 10;
InitializeComponent_menu(gageTabItem, ucMainGage.stackpanel_menu);
await Task.Delay(10);
lp.Progress += 10;
tabControl_gage.Items.Add(tabItem);
}
TabControl_gage_SelectionChanged(tabControl_gage, null);
tabControl_gage.SelectionChanged += TabControl_gage_SelectionChanged;
return ucMultiGage;
}
public async Task OnPreInit()
{
//运行全部onInit
foreach (var onInit in onInits)
{
if (onInit.Level <= 0 )
{
onInit.OnInit();
lp.Progress += 1;
await Task.Delay(2);
}
}
}
public async Task OnInit()
{
//运行全部onInit
foreach (var onInit in onInits)
{
if (onInit.Level > 0)
{
onInit.OnInit();
lp.Progress += 1;
await Task.Delay(2);
}
}
}
UcMultiGage ucMultiGage;
private void NavigationService_LoadCompleted(object sender, NavigationEventArgs e)
{
if (ucMultiGage.InMainPage)
{
IsGageTagVisible = false;
}
else if (IsInOption)
{
IsGageTagVisible = false;
}
else
{
IsGageTagVisible = true;
}
}
private void TabControl_gage_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var tabControl_gage = sender as TabControl;
if (tabControl_gage.SelectedIndex >= 0)
{
if(tabControl_gage.SelectedIndex>=0 && tabControl_gage.SelectedIndex< layout.GageTabItems.Count())
Selected = layout.GageTabItems[tabControl_gage.SelectedIndex];
}
}
void InitializeComponent_graph(GageTabItem gageTabItem, TabControl tabControl)
{
tabControl.Items.Clear();
foreach (GraphTabItem item in gageTabItem.Items)
{
//grid
Grid grid = new Grid();
for (int i = 0; i < item.ColumnCount; i++)
{
ColumnDefinition cd = new ColumnDefinition();
if (item.ColumnDefinitions.Count() > i)
{
if (item.ColumnDefinitions[i])
cd.Width = GridLength.Auto;
}
grid.ColumnDefinitions.Add(cd);
}
for (int i = 0; i < item.RowCount; i++)
{
RowDefinition rd = new RowDefinition();
if (item.RowDefinitions.Count() > i)
{
if (item.RowDefinitions[i])
rd.Height = GridLength.Auto;
}
grid.RowDefinitions.Add(rd);
}
//graph
foreach (GraphComponent gp in item.Graphs)
{
var flyComponent = gageTabItem.Components.Find(c => c.ID == gp.ID);
var uiModule = GetUIModule(flyComponent.Module);
try
{
var container = this.container.Resolve(flyComponent.ServiceContainerName);
Frame frame = new Frame();
frame.SetValue(Frame.MarginProperty, new Thickness(2));
frame.Content = uiModule.GetComponent(gp.ID, container);
frame.DataContext = gp;
frame.SetValue(Grid.ColumnProperty,gp.Rect.X);
frame.SetValue(Grid.RowProperty, gp.Rect.Y);
frame.SetValue(Grid.ColumnSpanProperty, gp.Rect.Width);
frame.SetValue(Grid.RowSpanProperty, gp.Rect.Height);
grid.Children.Add(frame);
}
catch(Exception e)
{
//失败了,那就不显示!!!!
logger.Error(e, $"创建失败 uiModule({flyComponent.Module})");
}
}
TabItem tabitem = new TabItem()
{
Header = item.Header
};
tabitem.Content = grid;
tabControl.Items.Add(tabitem);
}
}
void InitializeComponent_dynarea(GageTabItem gageTabItem, StackPanel stackpanel)
{
stackpanel.Children.Clear();
foreach (var id in gageTabItem.DynAreaItems)
{
var flyComponent = gageTabItem.Components.Find(c => c.ID == id);
var uiModule = GetUIModule(flyComponent.Module);
try
{
var container = this.container.Resolve(flyComponent.ServiceContainerName);
Frame frame = new Frame();
frame.Content = uiModule.GetComponent(id, container);
stackpanel.Children.Add(frame);
}
catch (Exception e)
{
//失败了,那就不显示!!!!
logger.Error(e, $"创建失败 uiModule({flyComponent.Module})");
}
}
}
void InitializeComponent_menu(GageTabItem gageTabItem, StackPanel stackpanel)
{
stackpanel.Children.Clear();
foreach (var id in gageTabItem.MenuItems)
{
var flyComponent = gageTabItem.Components.Find(c => c.ID == id);
var uiModule = GetUIModule(flyComponent.Module);
try
{
var container = this.container.Resolve(flyComponent.ServiceContainerName);
Frame frame = new Frame();
frame.Content = uiModule.GetComponent(id, container);
stackpanel.Children.Add(frame);
}
catch (Exception e)
{
//失败了,那就不显示!!!!
logger.Error(e, $"创建失败 uiModule({flyComponent.Module})");
}
}
}
IUiModule2 GetUIModule(string moduleName)
{
return UIModules.Find(_uiModule => _uiModule.GetType().FullName == moduleName);
}
///
/// 通知全部模块,告诉它们现在正在使用的控件,保存多余的参数就删除。
///
public void MatchParam()
{
var components = new List();
foreach (var gageTabItem in layout.GageTabItems)
{
if(gageTabItem.Components!=null)
components.AddRange(gageTabItem.Components);
}
Dictionary> modules = new Dictionary>();
foreach (var c in components)
{
if (modules.ContainsKey(c.Module))
modules[c.Module].Add(c.ID);
else
modules.Add(c.Module, new List(new int[] { c.ID }));
}
foreach (var m in modules)
{
var uiModule = GetUIModule(m.Key);
if(uiModule!=null)//不应该有null,之前都删除了
{
uiModule.MatchParam(m.Value.ToArray());
}
}
}
}
}