Пример реализации командного расширения Windows-клиента

В проекте создаётся расширения Windows-клиента, которое добавляет на ленту инструментов новую команду, организующую перевод курсора на личную папку текущего сотрудника. Личная папка должна быть задана в Справочнике сотрудников.

Для реализации расширения Windows-клиента требуется:
  1. Создать проект (Microsoft Visual Studio) типа "Class Library".

  2. Создайте элемент управления "User Control" (Windows Forms).

  3. Измените базовый класс элемента управления с UserControl на NavExtension.

  4. Переопределить необходимые методы и свойства базового класса (см. пример).

  5. Создать библиотеку карточек (доступна в архиве проекта), включив в неё карточку, использующую созданный компонент.

  6. Зарегистрировать реализованный компонент в GAC (предпочтительно) на всех клиентских машинах.

  7. Зарегистрировать с использованием программы CardManager, входящей в Resource Kit, созданную библиотеку карточек на сервере Docsvision.

using DocsVision.Platform.Extensibility;
using DocsVision.Platform.ObjectManager;
using DocsVision.Platform.ObjectManager.Metadata;
using DocsVision.Platform.ObjectManager.SearchModel;
using DocsVision.Platform.WinForms;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace DocsVision.Test.NavPluging
{
 [ComVisible(true)]
 [Guid("6A0676EE-1DAF-4A59-B5EB-E0B5B4C175E1")]
 [ClassInterface(ClassInterfaceType.None)]
 public partial class Plugin : NavExtension
 {
  public Plugin() { }

  protected override NavExtensionTypes SupportedTypes (1)
  {
   get
   {
    return NavExtensionTypes.Command;
   }
  }

  protected override string GetExtensionName(NavExtensionTypes extensionType) (2)
  {
   return "Быстрый выбор";
  }

  protected override IEnumerable<NavCommand> CreateCommands() (3)
  {
   NavCommand myCommand = new NavCommand();
   myCommand.CommandType = NavCommandTypes.ToolBar; <.> // В данном случае -- команда размещается на ленте инструментов
   myCommand.Name = "Выбрать папку";
   myCommand.Description = "Команда выбирает заданную папку";
   myCommand.Location = new NavCommandLocation()
   {
    RibbonTabLocations = new RibbonTabLocation[] (4)
    {
     new RibbonTabLocation
     {
      Tab = "Доп. команды",
      Groups = new string[] { "Группы" }
     }
    }
   };
   return new List<NavCommand> { myCommand };
  }

  protected override NavCommandStatus QueryCommandStatus(NavCommand command, NavCommandContext context) (5)
  {
   return NavCommandStatus.Enabled | NavCommandStatus.Supported; (6)
  }

  protected override void InvokeCommand(NavCommand command, NavCommandContext context) (7)
  {
   string accountName = base.Session.Properties["AccountName"].Value.ToString();

   Guid Employees = new Guid("DBC8AE9D-C1D2-4D5E-978B-339D22B32482"); (8)

   SectionQuery sectionQuery = base.Session.CreateSectionQuery();
   sectionQuery.ConditionGroup.Conditions.AddNew("AccountName", FieldType.String, ConditionOperation.Equals, accountName); (9)

   CardData staffData = base.Session.CardManager.GetDictionaryData(RefStaff, false);
   RowDataCollection users = staffData.Sections[Employees].FindRows(sectionQuery.GetXml());

   if (users.Count > 0)
   {

    Guid? personalFolderID = users[0].GetGuid("PersonalFolder"); (10)
    if (personalFolderID.HasValue)
    {

     CardFrame.CardHost.ActivateFolder(personalFolderID.Value, true); (11)
    }
   }
  }
 }
}
1 Тип расширения.
2 Название расширения.
3 Инициализация списка команд.
4 Создание вкладки на панели инструментов, для помещения в ней новой команды.
5 Проверка команды на доступность.
6 Команда всегда доступна.
7 Непосредственное исполнение команды расширения.
8 Идентификаторы Справочника сотрудников и секции Сотрудники Guid RefStaff = new Guid("6710B92A-E148-4363-8A6F-1AA0EB18936C").
9 Поиск в секции Сотрудники сотрудника с учетной записью accountName (учетная запись текущего сотрудника).
10 Получение личной папки.
11 Установка курсора на папку.

В реализуемых методах, проверка параметра command не выполняется, однако в реальных проектах это может понадобиться.

Готовая сборка должна иметь строгое имя, см. Создание и использование сборок со строгими именами.

Полностью проект, содержащий командное расширение и библиотеку карточек, доступен по ссылке.