我建议您先尝试一个非常非常简单的自定义任务窗格,看看是否可行。我把我能想到的最简单的例子放在一起,基本上是一个文本框,将一个值推入其中,并在按下按钮时返回到功能区。
如果您要尝试此操作,那么我会将其作为新的解决方案。使用“设计器模式”功能区创建一个新的 VSTO 项目。在其下方添加一个切换按钮和一个普通按钮。然后复制这段代码:
ThisAddIn.cs
using System;
using Office = Microsoft.Office.Core;
namespace ExcelAddIn1
{
public partial class ThisAddIn
{
private Microsoft.Office.Tools.CustomTaskPane pane;
private CellTaskPane ctrl = new CellTaskPane();
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
pane = CustomTaskPanes.Add(ctrl, "Custom Sheet");
pane.DockPosition = Office.MsoCTPDockPosition.msoCTPDockPositionRight;
pane.DockPositionRestrict = Office.MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoChange;
pane.Visible = true;
pane.VisibleChanged += new EventHandler(taskPaneValue_VisibleChanged);
ctrl.SetName("test");
}
private void taskPaneValue_VisibleChanged(object sender, System.EventArgs e)
{
Globals.Ribbons.Ribbon1.toggleButton1.Checked = pane.Visible;
}
public Microsoft.Office.Tools.CustomTaskPane TaskPane
{
get
{
return pane;
}
}
public CellTaskPane MyContainer
{
get
{
return ctrl;
}
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
#region VSTO generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
}
}
添加一个名为 CellTaskPane.cs 的新类:
using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
namespace ExcelAddIn1
{
public class CellTaskPane : System.Windows.Forms.UserControl
{
public System.Windows.Forms.TextBox test;
public CellTaskPane()
{
InitializeComponent();
}
public void InitializeComponent()
{
test = new System.Windows.Forms.TextBox();
test.Location = new System.Drawing.Point(120, 8);
test.Size = new System.Drawing.Size(232, 20);
test.TabIndex = 0;
Controls.AddRange(new System.Windows.Forms.Control[] { test });
Size = new System.Drawing.Size(375, 150);
}
public void SetName(string text)
{
test.Text = text;
}
public string GetName()
{
return test.Text;
}
}
}
将以下代码添加到 Ribbon1.cs:
using System;
using Microsoft.Office.Tools.Ribbon;
namespace ExcelAddIn1
{
public partial class Ribbon1
{
private void toggleButton1_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.TaskPane.Visible = ((RibbonToggleButton)sender).Checked;
}
private void button1_Click(object sender, RibbonControlEventArgs e)
{
button1.Label = Globals.ThisAddIn.MyContainer.GetName();
}
}
}
显然,您需要进行一些调整才能使其正常工作,我尝试为新项目和按钮采用默认名称。
当你运行它时,你应该得到一个自定义任务窗格。当您切换到“TabAddIn”并单击切换按钮时,它应该显示/隐藏任务窗格。当您单击普通按钮时,应将任务窗格中唯一字段的内容复制为按钮名称。我将其默认为“测试”,因此即使任务窗格不可见,您也可以查看它是否在内存中?
我对此进行了测试,它似乎工作正常。基本上,这只是 MSDN 上示例的修改版本。如果你愿意,你可以自己做这个吗?如果没有其他问题,这将使您能够查看您正在处理的更复杂的功能区中是否有任何导致问题的东西......或者这是否是您同事机器的基本问题。