2020-06-16

VSTO侧边面板CustomTaskPanes

由于集团填报预算的Excel插件使用的是侧边自定义面板,感觉这种形式恰好比较适合手头的项目,所以把自己的插件改成侧边面板形式。

Excel侧边面板可以直接添加"用户控件(windows窗体)"格式,类为:System.Windows.Forms.UserControl,也可以引入WPF的控件。

我创建的窗体名称为:RightPanel

默认的侧边面板是绑定工作簿的窗体的,不会自动切换,为了解决这个问题,创建了窗口句柄字典。最终实现效果如下

具体代码如下

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> { };
VSTO侧边面板CustomTaskPanes

No comments:

Post a Comment