2016-11-25 37 views
1

我開發了一個Outlook加載項,必須打開或關閉。在VSTO插件中存儲一些數據的最佳方式是什麼?

這樣做,我已經聲明一個靜態變量,如下圖所示,

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默認情況下,我的加載項處於禁用狀態。

我只是想在某個地方存儲該值。所以我可以在Outlook重新打開時檢查該值。

場景:

1)開放前景

2)使能附加通過點擊它的標識(即在色帶)

3)現在關閉前景

4)當我再次打開Outlook時,它必須啓用

那麼我該如何實現這一目標?

回答

0

設置可以作爲隱藏(關聯)項目存儲在文件夾中,例如收件箱或日曆文件夾。例如,Outlook將類別列表作爲隱藏項目存儲在日曆文件夾中。 POP3郵件ID存儲在收件箱中的隱藏項目中。隱藏項目的優勢在於漫遊功能 - Exchange郵箱用戶可以從任何計算機上查看數據。

您可以在OutlookSpy中看到隱藏項 - 點擊IMAPIFolder按鈕,進入「關聯內容」選項卡。

通過編程方式,可以使用Outlook對象模型中的MAPIFolder.GetStorage來訪問這些項目。

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(); 
     } 
    } 

這種存儲/取回的變量應在使用加載初始化集合Y我們的財產。因此,修改可能看起來像:

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不同) –

相關問題