Outlook VSTO — вызов TypeText при выборе создает эту команду. Исключение

Вызов TypeText на Selection выдает "Эта команда недоступна". исключение

введите здесь описание изображения

Ниже мой код

public void AddFilePaths(List<string> urls)
{
    if (urls.Count > 0)
    {
        MailItem mi = null;
        bool newMailItem = false;

        mi = MyAddIn.Application.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
        mi.Body = "New email body"; 
        newMailItem = true;

        mi.Display();
        inspector = MyAddIn.Application.ActiveInspector();

        if (mi != null)
        {
            foreach (var url in urls)
            {
                AddPathToActiveInspector(urls);
            }
        }
    }
}

public void AddLinkToCurrentInspector(string url)
{
    var inspector = MyAddIn.Application.ActiveInspector();
    var currMessage = inspector.CurrentItem;
    Microsoft.Office.Interop.Word.Document word = currMessage.GetInspector.WordEditor; 
    dynamic wordapp = word.Application;
    const string text = "\n"; // thisfor some reason will not add new line
    Microsoft.Office.Interop.Word.Selection sel = word.Windows[1].Selection;
    sel.TypeText(text); // this often errors
    string address = url;
    string subAddress = "";
    string screenTip = "";
    string textToDisplay = url; 
    wordapp.ActiveDocument.Hyperlinks.Add(sel.Range, ref address, ref subAddress, ref screenTip, ref textToDisplay);
    if (word.ProtectionType != Microsoft.Office.Interop.Word.WdProtectionType.wdNoProtection) word.Unprotect(); 
    sel.TypeText(" "); 
}

person pixel    schedule 16.08.2016    source источник


Ответы (2)


Вам не нужно вызывать TypeText - просто установите свойство Text:

Application.ActiveInspector.WordEditor.Application.Selection.Text = "test"
person Dmitry Streblechenko    schedule 16.08.2016
comment
К сожалению, это не имеет значения. Спасибо Дмитрий - person pixel; 17.08.2016
comment
Вы вызываете это у инспектора в режиме редактирования? Или это инспектор только для чтения? - person Dmitry Streblechenko; 17.08.2016
comment
Я обновил свой пост, чтобы включить код. Спасибо Дмитрий - person pixel; 17.08.2016
comment
Почему вы используете MailItem.GetInspector, если у вас уже есть объект Inspector? Также не используйте Window.Selection — используйте Application.Selection. - person Dmitry Streblechenko; 17.08.2016
comment
Если вы посмотрите на скриншот, который я разместил, я использовал Application.Selection (см. Выше на скриншоте wordapp.Selection). То же самое для MailItem.GetInspector. Если вы посмотрите на скриншот, то увидите, что я использовал существующий объект Inspector из ActiveInspector. Итак, я не уверен, что вы имеете в виду, но это на самом деле было источником всех проблем. Код, который я обновил, действительно работает. Большое спасибо Дмитрию. Кстати, как сделать так, чтобы инспектор всегда был в режиме редактирования? Очень признателен - person pixel; 17.08.2016
comment
Смотрит строку word = currMessage.GetInspector.WordEditor. Вы используете GetInspector. Нет необходимости — вы можете использовать значение из MyAddIn.Application.ActiveInspector. - person Dmitry Streblechenko; 17.08.2016
comment
Я знаю, но это тот код, который действительно работает, Дмитрий :). Если вы посмотрите на скриншот, который я опубликовал изначально, вы увидите, что я использовал MyAddIn.Application.ActiveInspector, и это вызывало у меня кучу проблем. В режиме отладки, особенно там, где я увидел бы его сбой в строке, которая вызывает Selection.TypeText(text) (или Selection.Text = text, или Selection.InsertAfter(text)). - person pixel; 17.08.2016

Основываясь на ответе на этот вопрос, я также решил эту проблему. Ниже приведен код, который работает лучше, чем код выше, и более прост в использовании. Большое спасибо @joeshwa:

    public void AddLinkToCurrentInspector(string url)
    {
        object link = url;
        object result = "url";
        object missing = Type.Missing;

        var inspector = MyAddIn.Application.ActiveInspector();
        MailItem currMessage = inspector.CurrentItem;
        Microsoft.Office.Interop.Word.Document doc = currMessage.GetInspector.WordEditor;
        Microsoft.Office.Interop.Word.Selection sel = doc.Windows[1].Selection;
        doc.Hyperlinks.Add(sel.Range, ref result, ref missing, ref missing, ref link, ref missing);
        sel.EndKey(Microsoft.Office.Interop.Word.WdUnits.wdLine);
        sel.InsertAfter("\n");
        sel.MoveDown(Microsoft.Office.Interop.Word.WdUnits.wdLine);
    }
person pixel    schedule 18.08.2016