Word не вызывает функцию "onLoad" в моей надстройке при двойном щелчке на документе - PullRequest
0 голосов
/ 08 ноября 2019

Я написал AddIn для Word (C #, VSTO). Если я открою файл Word в запущенном Word-экземпляре (Office 2016 Professional Plus), регистрируется событие DocumentOpen. Но если я запускаю Word через Doubleclick для Wordfile, событие будет игнорироваться.

Я пытался поместить код функции Ribbon_Load в функцию ThisAddIn_Startup в классе ThisAddIn.cs. Но поведение остается тем же: событие DocumentOpen не вызывается, когда Word запускается с помощью двойного щелчка по файлу Word.

Вот мой воспроизводимый пример:

Класс LAS-Vorlagen.cs:

using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Interop.Word;

namespace LAS_Word_Vorlagen
{
    [ComVisible(true)]
    public class LAS_Vorlagen : Office.IRibbonExtensibility
    { 
        private Office.IRibbonUI ribbon;

        public LAS_Vorlagen()
        {
        }

        public string GetCustomUI(string ribbonID)
        {
            return GetResourceText("LAS_Word_Vorlagen.LAS-Vorlagen.xml");
        }

        public void Ribbon_Load(Office.IRibbonUI ribbonUI)
        {
            this.ribbon = ribbonUI;
            // Event-Listener registration
           // Globals.ThisAddIn.Application.DocumentOpen += new Word.ApplicationEvents4_DocumentOpenEventHandler(MessageBox_Show_At_Loading_Document);
        }

        public void MessageBox_Show_At_Loading_Document(Document doc)
        {
            MessageBox.Show("DocumentOpen-Event raised!");
        }

        private static string GetResourceText(string resourceName)
        {
            Assembly asm = Assembly.GetExecutingAssembly();
            string[] resourceNames = asm.GetManifestResourceNames();
            for (int i = 0; i < resourceNames.Length; ++i)
            {
                if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
                {
                    using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
                    {
                        if (resourceReader != null)
                        {
                            return resourceReader.ReadToEnd();
                        }
                    }
                }
            }
            return null;
        }
    }
}

Вот класс ThisAddIn.cs:

using Word = Microsoft.Office.Interop.Word;

namespace LAS_Word_Vorlagen
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            // Event-Listener registration
            LAS_Vorlagen test = new LAS_Vorlagen();
            Globals.ThisAddIn.Application.DocumentOpen += new Word.ApplicationEvents4_DocumentOpenEventHandler(test.MessageBox_Show_At_Loading_Document);
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region Von VSTO generierter Code

        /// <summary>
        /// Erforderliche Methode für die Designerunterstützung.
        /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

        #endregion

        protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
        {
            return new LAS_Vorlagen();
        }
    }
}

И, наконец, XML-конфигурация LAS-Vorlagen.xml:

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
  <ribbon>
    <tabs>
      <tab id="TabAddIns_LAS"  label ="LAS-Vorlagen">
      </tab>
    </tabs>
  </ribbon>
</customUI>

1 Ответ

0 голосов
/ 08 ноября 2019

Вам необходимо использовать обратные вызовы на ленте, если вы хотите динамически обновлять пользовательский интерфейс Fluent. Для каждого из обратных вызовов, которые реализует надстройка, ответы кэшируются. Например, если средство записи надстроек реализует процедуру обратного вызова getImage для кнопки, функция вызывается один раз, изображение загружается, а затем, если требуется обновить изображение, вместо вызова процедуры используется кэшированное изображение. ,Этот процесс остается на месте до тех пор, пока надстройка не сообщит, что кэшированные значения являются недопустимыми, с помощью метода Invalidate, после чего снова вызывается процедура обратного вызова и кешируется ответ возврата. Затем надстройка может принудительно обновить пользовательский интерфейс, вызвав метод Refresh.

В этом случае может быть полезен следующий метод:

public void Ribbon_Load(Office.IRibbonUI ribbonUI)
{
            this.ribbon = ribbonUI;  
}

Затем, при необходимости, вы можете вызвать методы, указанные выше, чтобы получить кэшированные значения, обновленные путем вызова лентыобратные вызовы:

this.ribbon.Invalidate()

Подробнее о пользовательском интерфейсе Fluent (пользовательском интерфейсе ленты) в следующих статьях:

FYI По умолчанию, если надстройка VSTO пытается манипулировать пользовательским интерфейсом Microsoft Office (UI) и не работает, сообщение об ошибке не отображается. Однако вы можете настроить приложения Microsoft Office для отображения сообщений об ошибках, связанных с пользовательским интерфейсом. Эти сообщения можно использовать для определения того, почему пользовательская лента не отображается или почему лента появляется, но элементы управления не отображаются.

Отображение ошибок интерфейса пользователя надстройки VSTO

  1. Запустите приложение.
  2. Перейдите на вкладку «Файл».
  3. Нажмите «Параметры».
  4. На панели категорий нажмите «Дополнительно».
  5. В области сведений выберитеПоказать ошибки пользовательского интерфейса надстройки VSTO и нажмите кнопку ОК.

Подробнее об этом см. В статье Как показать ошибки пользовательского интерфейса надстройки .

...