Поделиться через


Пошаговое руководство. Обновление элементов управления на ленте во время выполнения

Обновлен: Ноябрь 2007

Применимость

Сведения в данном разделе относятся только к указанным проектам Visual Studio Tools for Office и версиям приложений Microsoft Office.

Тип проекта

  • Проекты уровня документа

  • Проекты уровня приложения

Версия Microsoft Office

  • Excel 2007

  • Word 2007

  • Outlook 2007

  • PowerPoint 2007

Дополнительные сведения см. в разделе Доступность функций по типам приложений и проектов.

В этом пошаговом руководстве показано, как использовать объектную модель ленты для обновления элементов управления на ленте после загрузки ленты в приложение Office.

Данный пример извлекает данные из примера базы данных AdventureWorks, чтобы заполнить поле со списком и меню в Microsoft Office Outlook.

В этом пошаговом руководстве представлены следующие задачи:

  • Создание нового проекта надстройки для Outlook.

  • Разработка пользовательской группы ленты.

  • Добавление пользовательской группы к встроенной вкладке.

  • Обновление элементов управления на ленте во время выполнения.

Bb608628.alert_note(ru-ru,VS.90).gifПримечание.

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

Обязательные компоненты

Для выполнения инструкций данного пошагового руководства необходимы следующие компоненты:

  • Visual Studio Tools for Office (необязательный компонент Visual Studio 2008 Professional и Visual Studio Team System).

  • Microsoft Office Outlook 2007.

  • Доступ к примеру базы данных AdventureWorks для SQL Server Express. Дополнительные сведения об установке базы данных AdventureWorks см. в разделе Пошаговое руководство. Установка базы данных AdventureWorks.

Visual Studio Tools for Office устанавливается по умолчанию с перечисленными версиями Visual Studio. Чтобы проверить, установлен ли данный пакет инструментов, см. раздел Установка средств Visual Studio для Office.

Создание нового проекта надстройки для Outlook.

Во-первых, создайте проект надстройки для Outlook.

Создание нового проекта надстройки для Outlook.

  1. В Visual Studio, создайте проект надстройки Outlook 2007 с именем MyOutlookAddIn.

  2. В диалоговом окне Новый проект выберите команду Создать каталог для решения.

  3. Сохраните проект в каталог проекта по умолчанию.

    Дополнительные сведения см. в разделе Практическое руководство. Создание проектов Visual Studio Tools for Office.

Создание пользовательской группы ленты.

Лента не появляется в главной области интерфейса Outlook. Для этого примера лента появится, когда пользователь создаст новое почтовое сообщение. Чтобы создать пользовательскую группу для ленты, сначала добавьте элемент ленты в проект, и затем разработайте группу в конструкторе ленты. Эта пользовательская группа поможет сформировать последующие сообщения электронной почты путем извлечения имен и запроса историй из базы данных.

Создание пользовательской группы

  1. В меню Проект выберите команду Добавить новый элемент.

  2. В диалоговом окне Добавление нового элемента выберите элемент Лента (визуальный конструктор).

  3. Измените имя новой ленты на CustomerRibbon и нажмите кнопку Добавить.

    В конструкторе лент откроется файл CustomerRibbon.cs или CustomerRibbon.vb, также отобразится вкладка по умолчанию и группа.

  4. Щелкните конструктор ленты, чтобы выбрать ее.

  5. В меню Вид выберите пункт Окно свойств.

  6. В окне Свойства рядом со свойством RibbonType щелкните стрелку выпадающего меню и выберите Microsoft.Outlook.Mail.Compose.

    Это делает возможным появление ленты во время составления пользователем нового почтового сообщения Outlook.

  7. В конструкторе лент щелкните ленту Group1, чтобы выбрать ее.

  8. В окне Свойства задайте для свойства Label значение Покупки заказчика.

  9. Из вкладки Элементы управления ленты Office в панели элементов, перетащите ComboBox в группу Покупки заказчиков.

  10. Щелкните поле ComboBox1, чтобы выбрать его.

  11. В окне Свойства задайте для свойства Label значение Заказчики.

  12. Из вкладки Элементы управления ленты Office в панели элементов, перетащите Меню в группу Покупки заказчиков.

  13. В окне Свойства задайте для свойства Label значение Закупленный товар.

  14. Для Динамический установите значение true.

    Это дает возможность добавлять и удалять элементы управления в меню во время выполнения после загрузки ленты в приложение Office.

Добавление пользовательской группы к встроенной вкладке.

Встроенная вкладка — это вкладка, которая уже имеется на ленте инспектора Outlook. В этой процедуре к встроенной вкладке добавляется пользовательская группа, после чего задается позиция этой пользовательской группы во вкладке.

Добавление пользовательской группы к встроенной вкладке.

  1. Нажмите вкладку TabAddins (Built-In), чтобы выбрать ее.

  2. В окне Свойства раскройте свойство ControlId и задайте для свойства OfficeId значение TabNewMailMessage.

    Это добавит группу Покупки заказчика к вкладке Сообщения ленты, которая появляется в новых почтовых сообщениях.

  3. Щелкните группу Покупки заказчика, чтобы выбрать ее.

  4. В окне Свойства разверните свойство Позиция, щелкните стрелку выпадающего меню и выберите свойство Тип позиции, затем щелкните BeforeOfficeId.

  5. Установите свойству OfficeId значение GroupClipBoard.

    Это размещает группу Покупки заказчика перед группой Буфер обмена вкладки Сообщения.

Обновление элементов управления в пользовательской группе во время выполнения

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

  • Добавление имен клиентов в поле со списком Заказчики.

  • Добавление элементов управления меню и флажками в меню Закупленные товары, которое представляет заказы и проданные товары.

  • Заполнение полей Microsoft.Office.Interop.Outlook.MailItem.To, Microsoft.Office.Interop.Outlook.MailItem.Subject и Microsoft.Office.Interop.Outlook.MailItem.Body новых почтовых сообщений данными из поля со списком Заказчики и меню Закупленные товары.

Обновление элементов управления в пользовательской группе с помощью объектной модели ленты

  1. В меню Проект выберите Добавить ссылку.

  2. В диалоговом окне Добавление ссылки щелкните вкладку .NET, выберите сборку System.Data.Linq, а затем нажмите кнопку ОК.

    Эта сборка содержит классы для использования запросов, интегрированных в язык (LINQ — Language-Integrated Queries). LINQ будут использоваться для заполнения элементов управления в пользовательской группе данными из базы данных AdventureWorks. Дополнительные сведения о LINQ см. в разделе LINQ.

  3. В Обозревателе решений, щелкните CustomerRibbon.cs или CustomerRibbon.vb, чтобы выбрать его.

  4. В меню Вид выберите пункт Код.

    В редакторе кода открывается файл кода ленты.

  5. Добавьте следующие инструкции в начало файла кода ленты. Эти инструкции обеспечивают легкий доступ к пространствам имен LINQ и к пространству имен основной сборки взаимодействия (PIA) Outlook.

    Imports Microsoft.Office.Tools.Ribbon
    Imports System.Data.Linq
    Imports System.Linq
    Imports System.Data.Linq.Mapping
    Imports System.Linq.Expressions
    Imports Outlook = Microsoft.Office.Interop.Outlook
    
    using System.Data.Linq;
    using System.Linq;
    using System.Data.Linq.Mapping;
    using System.Linq.Expressions;
    using Outlook = Microsoft.Office.Interop.Outlook;
    using System.IO;
    
  6. Добавьте следующие классы в файл кода ленты. Эти классы будут использоваться для хранения информации из таблиц базы данных AdventureWorks "Customer", "Contact", "Sales Order Header", "Sales Order Detail" и "Product".

    ' Customer Table.
    <Table(Name:="Sales.Customer")> _
    Public Class Customer
        <Column(IsPrimaryKey:=True)> _
            Public CustomerID As Integer
    End Class
    
    ' Contact Table.
    <Table(Name:="Person.Contact")> _
    Public Class Contact
        <Column(IsPrimaryKey:=True)> _
           Public ContactID As Integer
        <Column()> _
        Public LastName As String
    
    End Class
    ' Sales Order Header Table.
    <Table(Name:="Sales.SalesOrderHeader")> _
    Public Class SalesOrderHeader
        <Column(IsPrimaryKey:=True)> _
           Public SalesOrderID As Integer
        <Column()> _
       Public SalesOrderNumber As String
        <Column()> _
        Public CustomerID As Integer
    End Class
    
    ' Sales Order Detail Table.
    <Table(Name:="Sales.SalesOrderDetail")> _
    Public Class SalesOrderDetail
        <Column(IsPrimaryKey:=True)> _
           Public SalesOrderDetailID As Integer
        <Column()> _
       Public SalesOrderID As Integer
        <Column()> _
        Public ProductID As Integer
    End Class
    
    ' Product Table.
    <Table(Name:="Production.Product")> _
    Public Class Product
        <Column(IsPrimaryKey:=True)> _
           Public ProductID As Integer
        <Column()> _
        Public Name As String
    End Class
    ' Data Context Class.
    Partial Public Class AdventureWorks
        Inherits DataContext
        Public Customer As Table(Of Customer)
        Public Contact As Table(Of Contact)
        Public SalesOrderHeader As Table(Of SalesOrderHeader)
        Public SalesOrderDetail As Table(Of SalesOrderDetail)
        Public Product As Table(Of Product)
        Public Sub New(ByVal connection As String)
            MyBase.New(connection)
        End Sub
    End Class
    
    // Customer Table.
    [Table(Name = "Sales.Customer")]
    public class Customer
    {
        [Column(IsPrimaryKey = true)]
        public int CustomerID;
    }
    
    // Contact Table.
    [Table(Name = "Person.Contact")]
    public class Contact
    {
        [Column(IsPrimaryKey = true)]
        public int ContactID;
        [Column]
        public string LastName;
    
    }
    // Sales Order Header Table.
    [Table(Name = "Sales.SalesOrderHeader")]
    public class SalesOrderHeader
    {
        [Column(IsPrimaryKey = true)]
        public int SalesOrderID;
    
        [Column]
        public string SalesOrderNumber;
    
        [Column]
        public int CustomerID;
    
    }
    // Sales Order Detail Table.
    [Table(Name = "Sales.SalesOrderDetail")]
    public class SalesOrderDetail
    {
        [Column(IsPrimaryKey = true)]
        public int SalesOrderDetailID;
    
        [Column]
        public int SalesOrderID;
    
        [Column]
        public int ProductID;
    
    }
    // Product Table.
    [Table(Name = "Production.Product")]
    public class Product
    {
        [Column(IsPrimaryKey = true)]
        public int ProductID;
    
        [Column]
        public string Name;
    
    }
    // Data Context Table.
    public partial class AdventureWorks : DataContext
    {
        public Table<Customer> Customer;
        public Table<Contact> Contact;
        public Table<SalesOrderHeader> SalesOrderHeader;
        public Table<SalesOrderDetail> SalesOrderDetail;
        public Table<Product> Product;
        public AdventureWorks(string connection) : base(connection) { }
    }
    
  7. Замените метод обработчика событий CustomerRibbon_Load следующим кодом. Этот код использует запрос LINQ, чтобы выполнить следующие задачи:

    • Заполнить поле со списком Заказчики с помощью идентификаторов и имен 20-ти заказчиков в базе данных AdventureWorks.

    • Вызов вспомогательного метода PopulateSalesOrderInfo. Этот метод обновляет меню Закупленные товары номерами заказов, которые относятся к выбранному заказчику.

     Private Sub CustomerRibbon_Load(ByVal sender As System.Object, _
    ByVal e As Microsoft.Office.Tools.Ribbon.RibbonUIEventArgs) _
        Handles MyBase.Load
    
         Dim programFilesDir As String = Environment.GetFolderPath _
         (Environment.SpecialFolder.ProgramFiles)
         Dim db As New AdventureWorks(programFilesDir + _
             "\Microsoft SQL Server\" + "MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf")
    
         Dim customerQuery = From customers In db.Customer.Take(20), contact In db.Contact _
                             Where customers.CustomerID = contact.ContactID _
                 Select CustomerID = customers.CustomerID, LastName = _
                     contact.LastName
    
         ' Execute the query.
         For Each item In customerQuery
             Me.ComboBox1.Items.Add(New RibbonDropDownItem())
             Me.ComboBox1.Items.Last().Label = item.CustomerID.ToString() _
                 + "|" + item.LastName
         Next item
    
         Me.ComboBox1.Text = Me.ComboBox1.Items.First().Label
         PopulateSalesOrderInfo()
     End Sub
    
    
    private void CustomerRibbon_Load(object sender, RibbonUIEventArgs e)
    {
        string programFilesDir = Environment.GetFolderPath
            (Environment.SpecialFolder.ProgramFiles);
        AdventureWorks db = new AdventureWorks
            (programFilesDir + "\\Microsoft SQL Server\\" + 
        "MSSQL.1\\MSSQL\\Data\\AdventureWorks_Data.mdf");
        var customerQuery = from customers in db.Customer.Take(20)
                            join contacts in db.Contact on 
                                customers.CustomerID 
                            equals contacts.ContactID
                            select new { customers.CustomerID, 
                                contacts.LastName };
    
    
        // Execute the query.
        foreach (var item in customerQuery)
        {
            this.comboBox1.Items.Add(new RibbonDropDownItem());
            this.comboBox1.Items.Last().Label = 
                item.CustomerID.ToString() + "|" + item.LastName;
        }
        this.comboBox1.Text = this.comboBox1.Items.First().Label;
        PopulateSalesOrderInfo();
    }
    
  8. Добавьте следующий код в класс CustomerRibbon. Этот код использует запросы LINQ, чтобы выполнить следующие задачи:

    • Добавить в меню Закупленные товары подменю для каждого заказа, относящегося к текущему заказчику.

    • Добавить флажки к каждому подменю для товаров, относящихся к заказу.

    • Добавить обработчики событий к каждому флажку.

     Private Sub PopulateSalesOrderInfo()
    
         Dim tempArray As [String]() = comboBox1.Text.Split(New [Char]() {"|"c})
         Menu1.Items.Clear()
         Dim programFilesDir As String = Environment.GetFolderPath _
             (Environment.SpecialFolder.ProgramFiles)
         Dim db As New AdventureWorks(programFilesDir + _
             "\Microsoft SQL Server\" + "MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf")
    
    
         Dim orderQuery = From orders In db.SalesOrderHeader _
                          Where orders.CustomerID.ToString() = tempArray(0) _
                          Select SalesOrderID = _
                              orders.SalesOrderID, SalesOrderNumber = _
                                  orders.SalesOrderNumber
    
         For Each orderItem In orderQuery
             Dim Menu2 As New RibbonMenu()
             Menu2.Dynamic = True
             Menu1.Items.Add(Menu2)
             CType(Menu1.Items.Last(), RibbonMenu).Label = _
                 orderItem.SalesOrderNumber.ToString()
             CType(Menu1.Items.Last(), RibbonMenu).Tag = _
                 orderItem.SalesOrderID
    
             Dim productQuery = From orderDetail In db.SalesOrderDetail, _
                                    product In db.Product _
                                Where orderDetail.ProductID = _
                                    product.ProductID _
                                And orderDetail.SalesOrderID = _
                                orderItem.SalesOrderID _
             Select productName = product.Name
    
             For Each productItem In productQuery
                 CType(Menu1.Items.Last(), RibbonMenu).Items.Add _
                     (New RibbonCheckBox())
                 CType(CType(Menu1.Items.Last(),  _
    RibbonMenu).Items.Last(), RibbonCheckBox).Label = productItem
                 AddHandler (CType(CType(Menu1.Items.Last(),  _
    RibbonMenu).Items.Last(), RibbonCheckBox).Click), AddressOf CheckBox_Click
    
             Next productItem
         Next orderItem
     End Sub
    
    
    
    
    private void PopulateSalesOrderInfo()
    {
        String[] tempArray = comboBox1.Text.Split(new Char[] { '|' });
        menu1.Items.Clear();
        string programFilesDir = Environment.GetFolderPath
            (Environment.SpecialFolder.ProgramFiles);
        AdventureWorks db = new AdventureWorks
            (programFilesDir + "\\Microsoft SQL Server\\" +
                "MSSQL.1\\MSSQL\\Data\\AdventureWorks_Data.mdf");
    
        var orderQuery = from orders in db.SalesOrderHeader
                         where orders.CustomerID.ToString() == tempArray[0]
                         select new { orders.SalesOrderID, 
                             orders.SalesOrderNumber };
    
        foreach (var orderItem in orderQuery)
        {
            RibbonMenu menu2 = new RibbonMenu();
            menu2.Dynamic = true;
            menu1.Items.Add(menu2);
            ((RibbonMenu)menu1.Items.Last()).Label = 
                orderItem.SalesOrderNumber.ToString();
            ((RibbonMenu)menu1.Items.Last()).Tag = 
                orderItem.SalesOrderID;
    
            var productQuery = from orderDetail in db.SalesOrderDetail
                               join product in db.Product on 
                                   orderDetail.ProductID 
                               equals product.ProductID
                               where orderDetail.SalesOrderID == 
                                   orderItem.SalesOrderID
                               select new { product.Name };
    
            foreach (var productItem in productQuery)
            {
                ((RibbonMenu)menu1.Items.Last()).Items.Add
                    (new RibbonCheckBox());
                ((RibbonCheckBox)((RibbonMenu)menu1.Items.Last()).
                    Items.Last()).Label = productItem.Name;
                ((RibbonCheckBox)((RibbonMenu)menu1.Items.Last()).
                    Items.Last()).Click 
                    += new EventHandler<RibbonControlEventArgs>(checkBox_Click);
            }
    
        }
    }
    
  9. Дважды щелкните файл кода ленты в Обозревателе решений.

    Откроется Конструктор ленты.

  10. В конструкторе лент дважды щелкните поле со списком Заказчики.

    В редакторе кода откроется файл кода ленты, и появится обработчик событий ComboBox1_TextChanged.

  11. Замените обработчик событий ComboBox1_TextChanged следующим кодом. Этот код выполняет следующие задачи:

    • Вызов вспомогательного метода PopulateSalesOrderInfo. Этот метод обновляет меню Закупленные товары заказами, которые относятся к выбранному заказчику.

    • Вызов вспомогательного метода PopulateMailItem. Этот метод заполняет поля новых почтовых сообщений Microsoft.Office.Interop.Outlook.MailItem.To, Microsoft.Office.Interop.Outlook.MailItem.Subject и Microsoft.Office.Interop.Outlook.MailItem.Body.

    Private Sub ComboBox1_TextChanged(ByVal sender As System.Object, _
        ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _
            Handles ComboBox1.TextChanged
        PopulateSalesOrderInfo()
        PopulateMailItem(ComboBox1.Text)
    End Sub
    
    private void comboBox1_TextChanged(object sender, 
        RibbonControlEventArgs e)
    {
        PopulateSalesOrderInfo();
        PopulateMailItem(comboBox1.Text);
    }
    
  12. Добавьте следующий код в класс CustomerRibbon. этом коде выполняется добавление названий выбранных товаров в поле Microsoft.Office.Interop.Outlook.MailItem.Body в новых почтовых сообщениях.

    Private Sub CheckBox_Click(ByVal sender As System.Object, _
        ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs)
        Dim application As Outlook.Application = Globals.ThisAddIn.Application
        Dim inspector As Outlook.Inspector = application.ActiveInspector()
        Dim myMailItem As Outlook.MailItem = CType(inspector.CurrentItem,  _
            Outlook.MailItem)
        Dim myCheckBox As RibbonCheckBox = CType(sender, RibbonCheckBox)
        myMailItem.Subject = "Following up on your order"
        myMailItem.Body = myMailItem.Body + ControlChars.Lf + "* " _
            + myCheckBox.Label
    End Sub
    
    private void checkBox_Click(object sender, RibbonControlEventArgs e)
    {
        Outlook.Application application = Globals.ThisAddIn.Application;
        Outlook.Inspector inspector = application.ActiveInspector();
        Outlook.MailItem myMailItem = (Outlook.MailItem)inspector.CurrentItem;
        RibbonCheckBox myCheckBox = (RibbonCheckBox)sender;
        myMailItem.Subject = "Following up on your order";
        myMailItem.Body = myMailItem.Body + "\n" + "* " + myCheckBox.Label;
    }
    
  13. Добавьте следующий код в класс CustomerRibbon. Этот код выполняет следующие задачи:

    • Заполняет строку новых почтовых сообщений Microsoft.Office.Interop.Outlook.MailItem.To, используя почтовые адреса выбранного пользователя.

    • Добавляет текст в поля новых почтовых сообщений Microsoft.Office.Interop.Outlook.MailItem.Subject и Microsoft.Office.Interop.Outlook.MailItem.Body.

    Private Sub PopulateMailItem(ByVal addressToLine As String)
        Dim application As Outlook.Application = Globals.ThisAddIn.Application
        Dim inspector As Outlook.Inspector = application.ActiveInspector()
        Dim myMailItem As Outlook.MailItem = _
            CType(inspector.CurrentItem, Outlook.MailItem)
    
        myMailItem.To = ""
        Dim tempArray As [String]() = addressToLine.Split(New [Char]() {"|"c})
        myMailItem.To = tempArray(1) + "@example.com"
        myMailItem.Subject = "Following up on your order"
        myMailItem.Body = "Hello " + tempArray(1) + ","
        myMailItem.Body = myMailItem.Body + ControlChars.Lf + _
            "We would like to get your " + _
        "feedback on the following products that you recently ordered: "
    End Sub
    
    private void PopulateMailItem(string addressToLine)
    {
        Outlook.Application application = Globals.ThisAddIn.Application;
        Outlook.Inspector inspector = application.ActiveInspector();
        Outlook.MailItem myMailItem = (Outlook.MailItem)inspector.CurrentItem;
    
        myMailItem.To = "";
        String[] tempArray = addressToLine.Split(new Char[] { '|' });
        myMailItem.To = tempArray[1] + "@example.com";
        myMailItem.Subject = "Following up on your order";
        myMailItem.Body = "Hello " + tempArray[1] + ",";
        myMailItem.Body = myMailItem.Body + "\n" + 
            "We would like to get your " + 
                "feedback on the following products that you recently ordered: ";
    }
    

Тестирование элементов управления в пользовательской группе

При открытии новой формы почты в Outlook, пользовательская группа с именем Покупки заказчиков появляется на вкладке ленты Сообщения.

Чтобы создать следующее сообщение электронной почты заказчику, выберите заказчика, затем выберите товары, приобретенные заказчиком. Элементы управления в группе Покупки заказчиков обновляются во время выполнения данными из базы данных AdventureWorks.

Тестирование элементов управления в пользовательской группе

  1. Нажмите клавишу F5 для запуска проекта.

    Запускается Outlook.

  2. В Outlook в меню Файл переместите указатель мыши на Создать и нажмите Почтовое сообщение.

    Происходят следующие действия:

    • Появляется окно нового инспектора почтовых сообщений.

    • На вкладке ленты Сообщения, группа Покупки Заказчика появляется перед группой Буфер обмена.

    • Поле со списком Заказчики в группе обновляется именами заказчиков в базе данных AdventureWorks.

  3. На вкладке ленты Сообщения, в группе Покупки заказчика, выберите заказчика из поля со списком Заказчики.

    Происходят следующие действия:

    • Меню Закупленные товары обновляется меню, которое представляет каждый заказ для этого заказчика.

    • Каждое меню заказов обновляется флажками, которые представляют продукты, приобретенные заказчиком.

    • Адрес электронной почты выбранного заказчика добавляется в строку почтового сообщения Кому, а тема и основная часть почтового сообщения заполняются текстом.

  4. Щелкните меню Закупки Товаров, перейдите к любому заказу, затем щелкните на продукт из заказа.

    Имя продукта добавляется в основную часть почтового сообщения.

Следующие действия

Дополнительные сведения о настройке пользовательского интерфейса Office см. в следующих разделах:

См. также

Задачи

Практическое руководство. Работа с настройкой ленты

Пошаговое руководство. Создание настраиваемой вкладки с помощью конструктора лент

Практическое руководство. Изменение порядка вкладок на ленте

Практическое руководство. Настройка встроенной вкладки

Практическое руководство. Настройка меню Microsoft Office

Практическое руководство. Экспорт лент из конструктора лент в XML-ленты

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

Основные понятия

Доступ к ленте во время выполнения

Обзор ленты

Конструктор лент

Общие сведения об объектной модели ленты

Настройка ленты для Outlook