Синхронизация кнопки ленты с панелью задач в нескольких окнах VSTO - PullRequest
0 голосов
/ 19 мая 2018

Я разрабатываю надстройку Word, в которой есть кнопка переключения для отображения и скрытия панели задач и обычная кнопка для изменения метки на панели задач.

Работает нормально, когда я открываю один экземпляр документавовремя.Если я открываю несколько документов, кнопка переключения работает нормально: то есть, когда я нажимаю на нее, она отображает / скрывает панель задач.Но когда я нажимаю на обычную кнопку, она меняет метку в другом окне документа.

This is my ribbon

Код класса надстройки:

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)

Создание и управление настраиваемыми областями задач для нескольких документов в надстройке Word VSTO

но я не смог решить проблему.

1 Ответ

0 голосов
/ 28 мая 2018

Полагаю, вы пытаетесь изменить метку, используя следующую ссылку на объект:

 public UserControl1 objsidepane;

Если это так, вам нужно обновлять ссылку каждый раз при изменении активного документа:

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