/// <summary> /// 动态产生通知窗口 /// </summary> /// <param name="module">模块名称</param> /// <param name="function">窗口名称</param> /// <param name="parameter">参数</param> /// <returns></returns> private FrmNoticeBase CreateNotice(string module, string function, string parameter) { FrmNoticeBase newform = null; try { Assembly theDll = Assembly.Load(module); LogHelper.Info(this, "开始创建通知窗口" + module + "." + function); newform = theDll.CreateInstance(module + "." + function) as FrmNoticeBase; if (newform == null) { string error = "调用运行库不成功!\r\n无法创建" + module + "模块的" + function + "通知窗体!"; LogHelper.Error(this, error); } else { LogHelper.Info(this, "通知窗体" + module + "." + function + "|" + parameter + "创建完成"); newform.Init(parameter); LogHelper.Info(this, "通知窗体" + module + "." + function + "|" + parameter + "初始化完成"); } } catch (Exception ex) { string msg = "调用模块:" + module + "\r\n对象:" + function + "\r\n参数:" + parameter ?? string.Empty + "\r\n错误消息:" + ex.Message + "\r\n异常跟踪:" + ex.StackTrace; if (ex.InnerException != null) { msg += "\r\n异常消息:" + ex.InnerException.Message + "\r\n异常错误:" + ex.InnerException.StackTrace; } LogHelper.Error(this, msg); } return(newform); }
/// <summary> /// 信息回调函数,实现接收信息后的相关处理。 /// </summary> /// <param name="infoBody">信息内容</param> private void CallbackInfo(string infoCode, string infoBody) { switch (infoCode) { case LocalInfoHelper.OpenForm: // 打开窗口 DataFunction df = infoBody.DeserializeObject <DataFunction>(); Execute(df); break; case LocalInfoHelper.AddNotice: // 增加通知窗口 if (!this.dictNotice.ContainsKey(infoBody)) { int idx = infoBody.IndexOf(";"); string module = infoBody.Substring(0, idx); int idx1 = infoBody.IndexOf(";", idx + 1); string form = infoBody.Substring(idx + 1, idx1 - idx - 1); string parameter = infoBody.Substring(idx1 + 1); // 产生通知窗口 FrmNoticeBase frmAddNotice = this.CreateNotice(module, form, parameter); this.dictNotice.Add(infoBody, frmAddNotice); // 产生通知栏 this.CreateNoticeIco(frmAddNotice); } break; case LocalInfoHelper.DelNotice: // 撤销通知窗口 if (this.dictNotice.ContainsKey(infoBody)) { FrmNoticeBase frmDelNotice = this.dictNotice[infoBody]; frmDelNotice.Stop(); BarButtonItem bbi = (BarButtonItem)frmDelNotice.Tag; if (bbi != null) { this.ribbon.Items.Remove((BarButtonItem)frmDelNotice.Tag); // 已验证:this.ribbonStatusBar.ItemLinks下也同时移除 bbi = null; } frmDelNotice = null; this.dictNotice.Remove(infoBody); } break; } }
/// <summary> /// 产生状态栏的通知项 /// </summary> /// <param name="frm">通知窗口</param> private void CreateNoticeIco(FrmNoticeBase frm) { BarButtonItem bbi = new BarButtonItem(); // TODO: bbi.Alignment = DevExpress.XtraBars.BarItemLinkAlignment.Right; bbi.Caption = frm.NoticeCount.ToString(); bbi.Glyph = frm.IcoImage; bbi.Hint = frm.IcoHint; bbi.Id = this.ribbon.Items.Count; bbi.ItemAppearance.Normal.Font = new Font("Tahoma", 12F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(0))); bbi.ItemAppearance.Normal.ForeColor = frm.IcoColor; bbi.ItemAppearance.Normal.Options.UseFont = true; bbi.ItemAppearance.Normal.Options.UseForeColor = true; bbi.Name = "barItemNotice" + bbi.Id.ToString(); bbi.Visibility = DevExpress.XtraBars.BarItemVisibility.Always; this.ribbon.Items.Add(bbi); this.ribbonStatusBar.ItemLinks.Add(bbi); frm.Tag = bbi; bbi.Tag = frm; // 通知数量改变时调整图标数量 frm.OnNoticeCountChanged += (Sender, e) => { bbi.Caption = frm.NoticeCount.ToString(); // 有通知时自动打开的通知窗口处理 if (frm.AutoOpen && !frm.Visible) { frm.ShowDialog(); } }; // 通知图标双击时弹出窗口 bbi.ItemDoubleClick += (sender, e) => { FrmNoticeBase frm_notice = (FrmNoticeBase)e.Item.Tag; frm_notice.ShowDialog(); }; }