CustomTaskPanes и вызов NewMailMessage из-за пределов Outlook - PullRequest
0 голосов
/ 27 февраля 2011

У меня есть кнопка ленты, которая появляется на tabNewMailMessage в форме составления электронной почты Outlook, эта кнопка переключает видимость CustomTaskPane, прикрепленного к стороне формы.

В обычной практике все работает отлично. Но когда форма «Написать письмо» вызывается с помощью «Присоединить к электронной почте» или «Сохранить и отправить» из других приложений, таких как MS Word или Adobe Reader, кнопка появляется, но больше ничего не делает.

Я узнал из MSDN, что событие NewInspector, по-видимому, не запускается в случае внешнего вызова.

Я не смог найти обходных путей для этого случая, кто-нибудь здесь знает? (

РЕДАКТИРОВАТЬ: Кроме того, у меня есть класс Global (не скрытый класс GlobalS, который создает Visual Studio), который содержит некоторые переменные, которые я использую во всей программе. Аддин не будет загружать ничего, что содержится там вообще. Трудно сказать, что на самом деле загружается, если у кого-то есть дополнительная информация, пожалуйста, верните!

РЕДАКТИРОВАТЬ Снова: протестировано помещение строки в ThisAddIn и печать ее через блок сообщений в toggleButton, не работало. Если кто-то смущен, кнопка ленты не будет загружаться, если событие click невозможно выполнить, поэтому создается впечатление, что вызываемые извне формы Compose пропускают весь код в ThisAddIn и любой класс, который не является самой лентой.

Мне действительно нужна помощь, чтобы понять это! (

РЕДАКТИРОВАТЬ Еще раз: вот что я уже собрал, события запуска ThisAddIn не будут запускаться, никакие свойства во внешних классах не могут быть прочитаны, но внешние методы, такие как ThisAddIn.SayHelloWorld (), работают.

РЕДАКТИРОВАТЬ снова! :

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

        //MessageBox.Show(,"TEST");
        try
        {               
            inspectors = Globals.ThisAddIn.Application.Inspectors;
            inspectors.NewInspector += new InspectorsEvents_NewInspectorEventHandler(Inspectors_NewInspector);

            foreach (Inspector insp in inspectors)
            {
                //insp.
                Inspectors_NewInspector(insp);
            }
        }
        catch (System.Exception ex)
        {
            List<string> lalala = new List<string>();
            lalala.Add(ex.GetType().ToString());
            lalala.Add(ex.Message);
            lalala.Add(ex.StackTrace);
            File.WriteAllLines(@"C:\outdebug",lalala.ToArray());
        }
    }

Опять! :

void Inspectors_NewInspector(Inspector Inspect)
    {
        try
        {
            if (Inspect.CurrentItem is MailItem)
            {
                Global.mail = Inspect.CurrentItem;
                Global.inspectorWrappersValue.Add(Inspect, new InspectorWrapper(Inspect, Global.mail));
                //inspectorw
            }
        }
        catch (System.Exception ex)
        {
            List<string> lalala = new List<string>();
            lalala.Add(ex.GetType().ToString());
            lalala.Add(ex.Message);
            lalala.Add(ex.StackTrace);
            lalala.Add(Global.SiteConnectionManager.ToString());
            File.WriteAllText(@"C:\Users\cat\Desktop\outdebug.txt", string.Join("\n", lalala), Encoding.UTF8);
        }
    }

1 Ответ

1 голос
/ 28 февраля 2011

Рекомендуется использовать обработчики try / catch для всего вашего кода в ThisAddIn.Startup, поскольку Outlook агрессивно относится к использованию всех исключений, поэтому, если возникнет проблема, вы никогда об этом не узнаете.

Тем не менее, я думаю, что действительно вызывает у вас проблему - это проблема Outlook, обсуждаемая в http://social.msdn.microsoft.com/Forums/en/vsto/thread/60c75274-e15a-4696-afa6-79de8fbd707d.. Решение состоит в том, чтобы создать таймер и проверить, существуют ли инспекторы при его запуске.То, что я имею ниже, должно очень помочь, но это не полное решение, потому что оно не обрабатывает случай, когда NewInspector срабатывает, а таймер также указывает инспектора.Поэтому вам нужно будет добавить логику, чтобы убедиться, что вы не добавили 2 панели задач для инспектора.

public partial class ThisAddIn
{
    private DispatchTimer _newInspectorStartupTimer;

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        try
        {
            // check for existing explorers and inspectors and
            // set up event handlers for new ones

            // here is how you set up the inspector event handler:
            ThisAddIn.Application.Inspectors.NewInspector += new Microsoft.Office.Interop.Outlook.InspectorsEvents_NewInspectorEventHandler(Inspectors_NewInspector);

            // create a timer.  When the timer fires, check if any
            // Inspector windows currently exist, and add task panes
            // for them if needed.
            _newInspectorStartupTimer = new DispatcherTimer();
            _newInspectorStartupTimer.Interval = TimeSpan.FromSeconds(2.0);
            _newInspectorStartupTimer.Tick += new EventHandler(NewInspectorStartupTimer_Tick);
            _newInspectorStartupTimer.Start();
        }
        catch (System.Exception ex)
        {
            // log the exception type, message, and stack trace here
        }
    }

    private void NewInspectorStartupTimer_Tick(object sender, EventArgs e)
    {
        int inspectorCount = _inspectors.Count;
        if (inspectorCount > 0)
        {
            for (int i = 1; i <= _inspectors.Count; ++i)
            {
                Inspector inspector = _inspectors[i];
                Inspectors_NewInspector(inspector);
            }
        }
    }

    // Inspectors_NewInspector also has a try/catch.  Note that
    // Inspectors_NewInspector will be called multiple times
    // for each inspector, due to the timer.
    private void Inspectors_NewInspector(Inspector inspector)
    {
        try
        {
            // you need to check whether you have already created a
            // task pane for this inspector.  If not, create your
            // task pane here.
        }
        catch (System.Exception ex)
        {
            // log the exception type, message, and stack trace here
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...