【问题标题】:Synchronising Ribbon button with the taskpane in multiple windows VSTO在多个窗口 VSTO 中将功能区按钮与任务窗格同步
【发布时间】:2018-05-29 00:16:20
【问题描述】:

我正在开发一个 Word 插件,它有一个用于显示和隐藏任务窗格的切换按钮和一个用于更改任务窗格中标签的普通按钮。

当我一次打开一个文档实例时它工作正常。如果我打开多个文档,则切换按钮工作正常:即,当我单击它时,它将显示/隐藏任务窗格。但是当我点击普通按钮时,它会改变另一个文档窗口中的标签。

插件类代码:

public partial class ThisAddIn
{
public UserControl1 objsidepane;
public Microsoft.Office.Tools.CustomTaskPane myCustomtask;

private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        AddCalendarTaskPane(this.Application.ActiveDocument);     
        Word.ApplicationEvents2_Event wdEvents2 = (Word.ApplicationEvents2_Event)this.Application;
        wdEvents2.NewDocument += new Word.ApplicationEvents2_NewDocumentEventHandler(Application_NewDocument);
        this.Application.DocumentChange += new Word.ApplicationEvents4_DocumentChangeEventHandler(Application_DocumentChange);
        this.Application.DocumentOpen += new Word.ApplicationEvents4_DocumentOpenEventHandler(Application_DocumentOpen);
    }

private void Application_DocumentOpen(Word.Document Doc)
    {
        AddTaskPane(Doc);
    }

private void Application_DocumentChange()
    {
    this.myCustomtask = GetTaskPaneForWindow(this.Application.ActiveDocument, this.Application.ActiveWindow);
    }

private Microsoft.Office.Tools.CustomTaskPane GetTaskPaneForWindow(Word.Document doc, Word.Window wn)
    {
        foreach (Microsoft.Office.Tools.CustomTaskPane CTP in Globals.ThisAddIn.CustomTaskPanes)
        {
            if (object.ReferenceEquals(CTP.Window, Globals.ThisAddIn.Application.ActiveWindow) && CTP.Title == "sidepane")
            {

                return CTP;
            }
        }
    }
public void AddTaskPane(Word.Document doc)
    {
        objsidepane = new UserControl1();
        myCustomtask = this.CustomTaskPanes.Add(objsidepane, "sidepane",this.Application.ActiveDocument.ActiveWindow);
        myCustomtask.VisibleChanged += new EventHandler(Usercontrol_VisibleChanged);
        myCustomtask.Width = 350;
    }
private void Application_NewDocument(Word.Document Doc)
    {

        AddTaskPane(Doc);
    }
private void Usercontrol_VisibleChanged(object sender, EventArgs e)
    {
        Globals.Ribbons.Ribbon1.toggleButton1.Checked = myCustomtask.Visible;
    }

public Microsoft.Office.Tools.CustomTaskPane TaskPane
    {
        get
        {
            foreach (Microsoft.Office.Tools.CustomTaskPane CTP in Globals.ThisAddIn.CustomTaskPanes)
            {
                if (object.ReferenceEquals(CTP.Window, Globals.ThisAddIn.Application.ActiveWindow) && CTP.Title == "sidepane")
                {

                    return CTP;
                }
            }
            return null;
        }
    }

Ribbon.cs

public partial class Ribbon1
{
private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
{

}

private void toggleButton1_Click(object sender, RibbonControlEventArgs e)
{
    Globals.ThisAddIn.TaskPane.Visible = ((RibbonToggleButton)sender).Checked;
}

private void button1_Click(object sender, RibbonControlEventArgs e)
{
    render();
}
}

我浏览了这些链接:https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/bb264456(v=office.12)

Creating and managing custom task panes for multiple documents in a VSTO Word addin

但我无法解决问题。

【问题讨论】:

  • 你试过什么?您的代码中的 button1_Click 方法是空的,除了对 render() 的调用,您没有显示代码。

标签: c# vsto word-addins word-automation


【解决方案1】:

我猜你尝试使用以下对象引用来修改标签:

 public UserControl1 objsidepane;

如果是这样,您需要在每次更改活动文档时更新引用:

private void Application_DocumentChange()
{
      this.myCustomtask = GetTaskPaneForWindow(this.Application.ActiveDocument, this.Application.ActiveWindow);
      this.objsidepane = (UserControl1)this.myCustomtask.Control;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    相关资源
    最近更新 更多