/// <summary> /// 创建消息参数 /// </summary> /// <param name="exportViewkey"></param> /// <param name="parameter">传递的参数</param> public static UcViewBase CreateView(string exportViewkey, object parameter) { UcViewBase targetView = null; if (!string.IsNullOrEmpty(exportViewkey)) { targetView = IocManagerSingle.Instance.GetViewPart(exportViewkey); if (targetView != null) { //传递参数 if (targetView.DataSource != null && !targetView.DataSource.IsLoaded) { try { targetView.DataSource?.LoadViewModel(parameter); //加载ViewContainer targetView.DataSource?.SetViewContainer(targetView); } catch (Exception ex) { LoggerManagerSingle.Instance.Error(ex, string.Format("加载模块Key【{0}】失败", exportViewkey)); } } } else { LoggerManagerSingle.Instance.Error(string.Format("导入模块Key【{0}】失败", exportViewkey)); } } return(targetView); }
/// <summary> /// 创建消息参数 /// </summary> /// <param name="exportViewkey"></param> /// <param name="parameter">传递的参数</param> private void CreateParameter(string exportViewkey, object parameter = null) { if (!string.IsNullOrEmpty(exportViewkey)) { var view = IocManagerSingle.Instance.GetViewPart(exportViewkey); if (view != null) { //传递参数 if (!view.DataSource.IsLoaded) { try { view.DataSource.LoadViewModel(parameter); } catch (Exception ex) { LoggerManagerSingle.Instance.Error(ex, string.Format("加载模块Key【{0}】失败", exportViewkey)); return; } } this.ViewModelID = view.DataSource.ViewModelID; //加载ViewContainer view.DataSource.SetViewContainer(view); this.View = view; base.MsgToken = exportViewkey; } else { LoggerManagerSingle.Instance.Error(string.Format("导入模块Key【{0}】失败", exportViewkey)); } } }
/// <summary> /// 添加视图缓存 /// </summary> /// <param name="token">标识</param> /// <param name="view">视图</param> public void AddViewCache(TToken token, UcViewBase view) { if (!_curCacheItems.ContainsKey(token)) { _curCacheItems.Add(token, new NavigationViewElement(view)); } }
//主界面导航回调 private void MainNavigationCallback(NormalNavigationArgs args) { /* * TODO * 由于设备主页是整个程序共享的 * 所以在跳转的时候,需要先判断缓存中是否有对应Token的缓存界面 * 没有则创建新的设备主页 * */ UcViewBase targetView = null; if (args.IsBackArgs) { //返回前一个界面 targetView = args.Parameter as UcViewBase; } else { /* * TODO * 由于设备是多路提取,所以设备主页以及附属内容需要缓存 * 当案例编辑界面展开,此时的所有导航都需要折叠案例编辑界面 * */ if (EditCaseNavigationHelper.CurEditViewOpenStatus) { //折叠案例编辑界面 EditCaseNavigationHelper.SetEditCaseViewStatus(false, false); } if (args.MsgToken == ExportKeys.DeviceMainView) { var devTmp = args.Parameter as DeviceExtractionAdorner; if (devTmp != null && devTmp.Device != null) { PreCacheToken delToken = new PreCacheToken(devTmp.Device.ID, ExportKeys.DeviceMainView); if (!SystemContext.Instance.CurCacheViews.TryGetFirstView(delToken, out targetView)) { targetView = NavigationViewCreater.CreateView(args.MsgToken, args.Parameter); SystemContext.Instance.CurCacheViews.AddViewCache(delToken, targetView); } } } else { //记录打开案例编辑界面之前的页面,方便返回使用 EditCaseNavigationHelper.RecordBeforeViewOnisExpanded(MainView); targetView = NavigationViewCreater.CreateView(args.MsgToken, args.Parameter); } } MainView = targetView; }
//打开非模式对话框 private void OpenNewWindowCallback(NormalNavigationArgs args) { /* * TODO * * 由于可以同时提取多个手机,所以设备主页会多次打开【通过设备ID区分界面】 * 设备主页同时会在新窗口中显示【默认在主界面导航】 * 此处需要从缓存中查找和创建 * 由于主进程Shell未引用ViewModel模块,所以此处只能折中使用object[]传值【主要需要Device.ID来区分界面,object[0]为Device.ID】 * */ UcViewBase targetView = null; if (args.MsgToken == ExportKeys.DeviceMainView) { var devTmp = args.Parameter as object[]; if (devTmp != null && devTmp.Length == 2) { PreCacheToken delToken = new PreCacheToken(devTmp[0].ToString(), ExportKeys.DeviceMainView); if (!SystemContext.Instance.CurCacheViews.TryGetFirstView(delToken, out targetView)) { targetView = NavigationViewCreater.CreateView(args.MsgToken, devTmp[1]); SystemContext.Instance.CurCacheViews.AddViewCache(delToken, targetView); } targetView.Title = devTmp[0].ToString(); //此处暂用Tag存储Device.ID targetView.Tag = devTmp[1]; } } else { targetView = NavigationViewCreater.CreateView(args.MsgToken, args.Parameter); } if (targetView != null) { var newWindow = WindowHelper.Instance.CreateShellWindow(targetView, args.ShowInTaskBar, Application.Current.MainWindow); if (args.MsgToken == ExportKeys.DeviceMainView) { //此处暂用Tag存储Device.ID newWindow.Tag = targetView.Tag; newWindow.IsBackWindow = true; newWindow.Width = 1500; newWindow.Height = 1000; newWindow.SizeToContent = SizeToContent.Manual; } newWindow.Closed += NewWindow_Closed; newWindow.Show(); } }
/// <summary> /// 尝试获取指定的视图 /// </summary> /// <param name="token">标识</param> /// <param name="cacheView">缓存的视图</param> /// <returns></returns> public bool TryGetFirstView(TToken token, out UcViewBase cacheView) { bool hasView = false; if (_curCacheItems.ContainsKey(token)) { hasView = true; cacheView = _curCacheItems[token].View; } else { cacheView = null; } return(hasView); }
/// <summary> /// 创建新窗口 /// </summary> /// <param name="view">显示内容</param> /// <returns></returns> private Shell CreateNewWindow(UcViewBase view, Window owner = null) { Shell newWindow = new Shell(); if (view != null) { newWindow.WindowState = view.IsMaxView ? WindowState.Maximized : WindowState.Normal; //newWindow.SizeToContent = view.IsMaxView ? SizeToContent.WidthAndHeight: SizeToContent.Manual; newWindow.Title = view.Title ?? ""; newWindow.Content = view; newWindow.Owner = owner; newWindow.AllowsTransparency = true; newWindow.WindowStyle = WindowStyle.None; newWindow.ResizeMode = ResizeMode.NoResize; newWindow.ShowInTaskbar = false; newWindow.Closed += newWindow_Closed; } return(newWindow); }
/// <summary> /// 创建消息参数 /// </summary> /// <param name="args">导航消息</param> /// <param name="targetView">导航的目标View</param> public static bool CreateNavigationView(NavigationArgs args, out UcViewBase targetView) { targetView = null; if (args != null && !string.IsNullOrEmpty(args.MsgToken)) { //当前项目未添加必要引用,所以此处暂用try catch targetView = IocManagerSingle.Instance.GetViewPart(args.MsgToken); try { //传递参数 if (!targetView.DataSource.IsLoaded) { targetView.DataSource.LoadViewModel(args.InitParameter); } } catch (Exception ex) { LoggerManagerSingle.Instance.Error(ex, string.Format("加载模块Key【{0}】失败", args.MsgToken)); return(false); } } return(true); }
/// <summary> /// 创建窗体 /// </summary> /// <param name="view">显示内容</param> /// <param name="owner">父窗体</param> /// <returns></returns> public Shell CreateShellWindow(UcViewBase view, bool showInTaskBar, Window owner = null) { Shell newWindow = null; if (view != null) { newWindow = new Shell(); newWindow.WindowState = view.IsMaxView ? WindowState.Maximized : WindowState.Normal; Binding s = new Binding("Title") { Source = view }; newWindow.SetBinding(Window.TitleProperty, s); newWindow.ShowMaxsize = newWindow.ShowMinsize = view.NeedMaxsizeAndMinsize; if (view.Height > 0 && view.Width > 0) { //TODO //此处由于阴影问题,所以需要给实际展示内容增加80像素 newWindow.Width = view.Width + 40 * 2; newWindow.Height = view.Height + 40 * 2; } else { newWindow.SizeToContent = SizeToContent.WidthAndHeight; } newWindow.Content = view; //排除未显示的窗体 if (owner != null && owner.Visibility != Visibility.Collapsed) { newWindow.Owner = owner; } newWindow.ShowInTaskbar = showInTaskBar; this.AddWindow(newWindow); } return(newWindow); }
/// <summary> /// 创建导航消息,但并不用导航事件发送 /// </summary> /// <param name="exportKey"></param> /// <param name="parameters"></param> /// <returns></returns> private NormalNavigationArgs CreateNavigationArgs(string exportKey, object parameters, bool showInTaskBar, out UcViewBase targetView) { if (string.IsNullOrWhiteSpace(exportKey)) { throw new NullReferenceException(string.Format("导航目标窗体Key【{0}】为空", exportKey)); } NormalNavigationArgs result = NormalNavigationArgs.CreateWindowNavigationArgs(exportKey, parameters, showInTaskBar); targetView = NavigationViewCreater.CreateView(result.MsgToken, result.Parameter); return(result); }
internal NavigationViewElement(UcViewBase view) { View = view; }