2016-11-25 6 views
1

Я разработал одну надстройку надстройки, которая должна быть включена или выключена.Каков наилучший способ хранения некоторых данных в VSTO addin?

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

ThisAddIn.cs

public static bool isAddInOn = false; 

RibbonButton.cs

private void btnRibbon_Click(object sender, RibbonControlEventArgs e) 
    { 
     if (ThisAddIn.isAddInOn) 
     { 

      ThisAddIn.isAddInOn = false; 
      btnRibbon.Label = "Disabled"; 

     } 
     else 
     { 

      ThisAddIn.isAddInOn = true; 
      btnRibbon.Label = "Enabled"; 


     } 
    } 

Она работает. Но статическая переменная снова сбрасывается, когда я закрываю внешний вид и снова открываю его. Это означает, что когда я открываю Outlook по умолчанию, моя надстройка находится в отключенном состоянии.

Я просто хочу сохранить это значение в каком-то месте. поэтому я могу проверить это значение, когда Outlook снова откроется.

Сценарий:

1) открытые перспективы

2) Включить надстройки, нажав на его логотип (то есть в ленте)

3) Теперь закройте мировоззрении

4) Когда я снова открою внешний вид, он должен быть включен

так как я могу это достичь?

ответ

0

Настройки может быть сохранен как скрытый (связанный) элемент в папке, такой как папка «Входящие» или «Календарь». Например, Outlook сохраняет список категорий как скрытый элемент в папке «Календарь». Идентификаторы сообщений POP3 хранятся в скрытом элементе в папке «Входящие».Преимуществом скрытых элементов является возможность роуминга. Пользователь почтового ящика Exchange может видеть данные с любого компьютера.

Вы можете увидеть скрытые элементы в OutlookSpy - нажмите кнопку IMAPIFolder, перейдите на вкладку «Связанное содержимое».

Программно, к таким элементам можно получить доступ с помощью MAPIFolder.GetStorage в объектной модели Outlook.

2

Для достижения этого результата вы можете использовать несколько методов. Конечно, ваши настройки должны быть сериализованы для некоторых хранилищ/десериализованных при запуске надстройки.

Одним из возможных решений может быть использование реестра для этого (в данном случае, вероятно, HKCU (текущий пользователь, то это будет частным для каждого пользователя, используя свою надстройку) и не специального разрешения не требуется.

для хранения переменной:

public void StoreInRegistry(string keyName, string value) 
    { 
     RegistryKey rootKey = Registry.CurrentUser; 
     string registryPath = @"Software\YourCompanyName\YourAddInName"; 
     using (RegistryKey rk = rootKey.CreateSubKey(registryPath)) 
     { 
      rk.SetValue(keyName, value, RegistryValueKind.String); 
     } 
    } 

для чтения переменной:

public string ReadFromRegistry(string keyName, string defaultValue) 
    { 
     RegistryKey rootKey = Registry.CurrentUser; 
     string registryPath = @"Software\YourCompanyName\YourAddInName"; 
     using (RegistryKey rk = rootKey.OpenSubKey(registryPath, false)) 
     { 
      if (rk == null) 
      { 
       return defaultValue; 
      } 

      var res = rk.GetValue(keyName, defaultValue); 
      if (res == null) 
      { 
       return defaultValue; 
      } 

      return res.ToString(); 
     } 
    } 

Такой хранить/извлекаться переменная должна быть использована во время надстройки при инициализации, чтобы установить у наши свойства. Так модификация может выглядеть следующим образом:

ThisAddin.cs

public static bool isAddInOn = ReadFromRegistry("MySetting1", "0") == "1"; 

RibbonButton.cs

private void btnRibbon_Click(object sender, RibbonControlEventArgs e) 
{ 
    if (ThisAddIn.isAddInOn) 
    { 

     ThisAddIn.isAddInOn = false; 
     btnRibbon.Label = "Disabled"; 

    } 
    else 
    { 

     ThisAddIn.isAddInOn = true; 
     btnRibbon.Label = "Enabled"; 


    } 
    StoreInRegistry("MySetting1", ThisAddIn.isAddInOn ? "1" : "0"); 
} 

Другие варианты могут сериализации файла - некоторый класс с настройками сериализовать для т.е. изолированное хранилище , база данных (локальная или центральная) и т. д.

+0

спасибо за предложение. но что, если у пользователя нет прав администратора? все еще можно было бы изменить в реестре? –

+1

Пользователь всегда имеет права доступа к ключам в HKCU (в отличие от HKLM), если только права на определенную клавишу не были явно сброшены –