因为集团填报预算的Excel插件使用的是侧边自定义面板,感受这种形式刚好比较适合手头的项目,因此把本身的插件改为侧边面板形式。windows
Excel侧边面板能够直接添加“用户控件(windows窗体)”格式,类为:System.Windows.Forms.UserControl,也能够引入WPF的控件。插件
我建立的窗体名称为:RightPanelcode
默认的侧边面板是绑定工做簿的窗体的,不会自动切换,为了解决这个问题,建立了窗口句柄字典。最终实现效果以下orm
具体代码以下blog
private CustomTaskPane RightPane { get; set; } //侧边面板 /// <summary> /// 侧边面板开关 /// </summary> private void PanelOnOff_Click(object sender, RibbonControlEventArgs e) { ExcelApp = Globals.ThisAddIn.Application; int TempInt = Globals.ThisAddIn.Application.Hwnd; RefreshRightPane(TempInt); //设置面板可见性 RightPane.Visible = PanelOnOff.Checked; } /// <summary> /// 从新绑定右侧面板 /// </summary> /// <param name="HwndInt">当前窗体的句柄</param> private void RefreshRightPane(int HwndInt) { if (HwndPaneDic.ContainsKey(HwndInt)) { RightPane = HwndPaneDic[HwndInt]; } else { //建立控件 UserControl rightPanel = new RightPanel(); //添加控件 RightPane = Globals.ThisAddIn.CustomTaskPanes.Add(rightPanel, "这里写窗体名称"); //设置在右侧显示 RightPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionRight; //禁止用户修改位置 RightPane.DockPositionRestrict = Microsoft.Office.Core.MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoChange; //事件 RightPane.VisibleChanged += new EventHandler(CustomPane_VisibleChanged); //添加到字典 HwndPaneDic.Add(HwndInt, RightPane); } } /// <summary> /// 侧边面板事件,用于保持按钮与面板状态一致 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void CustomPane_VisibleChanged(object sender, System.EventArgs e) { int TempInt = Globals.ThisAddIn.Application.Hwnd; PanelOnOff.Checked = RightPane.Visible; if (!PanelOnOff.Checked) { PanelOnOff.Label = "打开面板"; PanelOnOff.ScreenTip = "点击打开侧边面板"; ExcelApp.WindowActivate -= new Excel.AppEvents_WindowActivateEventHandler(CustomPane_WindowActivate); ExcelApp.WindowDeactivate -= new Excel.AppEvents_WindowDeactivateEventHandler(CustomPane_WindowDeactivate); } else { PanelOnOff.Label = "关闭面板"; PanelOnOff.ScreenTip = "点击关闭侧边面板"; ExcelApp.WindowActivate += new Excel.AppEvents_WindowActivateEventHandler(CustomPane_WindowActivate); ExcelApp.WindowDeactivate += new Excel.AppEvents_WindowDeactivateEventHandler(CustomPane_WindowDeactivate); } } /// <summary> /// 窗体激活事件 /// </summary> /// <param name="WBK"></param> /// <param name="WD"></param> private void CustomPane_WindowActivate(Excel.Workbook WBK,Excel.Window WD) { ExcelApp.WindowActivate -= new Excel.AppEvents_WindowActivateEventHandler(CustomPane_WindowActivate); ExcelApp = Globals.ThisAddIn.Application; string WBKName = WBK.Name; int TempHwnd = WD.Hwnd; RefreshRightPane(TempHwnd); //设置面板可见性 RightPane.Visible = true; } /// <summary> /// 窗体取消激活事件 /// </summary> /// <param name="WBK"></param> /// <param name="WD"></param> private void CustomPane_WindowDeactivate(Excel.Workbook WBK,Excel.Window WD) { int TempHwnd = WD.Hwnd; if (HwndPaneDic.ContainsKey(TempHwnd)) { HwndPaneDic[TempHwnd].Visible = false; ExcelApp.WindowActivate += new Excel.AppEvents_WindowActivateEventHandler(CustomPane_WindowActivate); } } //窗体句柄字典 private Dictionary<int, CustomTaskPane> HwndPaneDic = new Dictionary<int, CustomTaskPane> { };