Outlook VSTO添加:未应用AutoFormatRule过滤器

时间:2018-01-12 09:48:44

标签: outlook vsto outlook-addin

我正在尝试以编程方式将自动格式规则应用于Outlook 2016。首先我手动创建了一个规则并读取了filter属性,我有这样的过滤器:

  

“(\”urn:schemas:httpmail:read \“= 0 AND \”http://schemas.microsoft.com/mapi/proptag/0x001a001e \“='IPM.Note.MyMessage')”

然后我尝试以编程方式应用它:

Dictionary<string, OlColor> colorizationRules = new Dictionary<string, OlColor>()
        {
            {Resources.MsgClass1, OlColor.olColorRed},
            {Resources.MsgClass2, OlColor.olColorYellow},
            {Resources.MsgClass3, OlColor.olColorGreen}
        };

        Explorer explorer = Application.ActiveExplorer();

        if (explorer != null)
        {
            TableView tableView = explorer.CurrentView as TableView;

            if (tableView != null)
            {
                IEnumerable<AutoFormatRule> rules = tableView.AutoFormatRules.Cast<AutoFormatRule>();

                foreach (KeyValuePair<string, OlColor> coloriztionRule in colorizationRules)
                {                       
                    AutoFormatRule newRule = tableView.AutoFormatRules.Add(coloriztionRule.Key);

                    newRule.Filter = $"(\"urn:schemas:httpmail:read\"=0 AND \"http://schemas.microsoft.com/mapi/proptag/0x001a001e\"='{coloriztionRule.Key}')";
                    newRule.Font.Color = coloriztionRule.Value;
                    newRule.Enabled = true;

                    tableView.AutoFormatRules.Save();
                    tableView.Save();
                    tableView.Apply();
                }
            }
        }

已创建规则,但未应用过滤器值。

其中一个建议是Filter值必须以“@SQL = ....”为前缀。但这不起作用。

然后我找到了这个话题Outlook 2010 AutoFormatRule.Filter property not saving

回复是:

  

我提出了一个重要的电话来回应这个问题。回答是它是Outlook对象模型中的一个已知错误。它不会在Outlook 2010或Outlook 2013中修复,因为风险对于小的更改来说太大了。

建议的解决方法是:

  

Microsoft提供的解决方法是将规则从公用文件夹复制到用户的配置文件。

这是什么意思? 还有其他解决方法可以使规则在c#代码中起作用吗?

2 个答案:

答案 0 :(得分:4)

有一个解决方案,尽管有点混乱。这绝对是一个Outlook错误,它导致以半损坏状态创建以编程方式创建的AutoFormatRules(通过Outlook UI进行查看条件格式设置),该状态不会持续更改视图或重新加载应用程序。您可以通过向Explorer.ViewSwitch事件添加事件处理程序来解决此问题,该事件处理程序每​​次更改视图时都会删除并重新创建AutoFormatRule。这样一来,您的条件格式设置规则就可以正常工作了。

我们已经使用这种技术来实现条件格式设置,该条件格式设置了基于邮件项目上crmLinkState自定义属性的值的条件格式设置规则,从而突出显示了要跟踪到Dynamics CRM的电子邮件。

    public partial class BrethertonsAddIn
    {
        Outlook.Explorer _activeExplorer;

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            _activeExplorer = this.Application.ActiveExplorer();
            _activeExplorer.ViewSwitch += BrethertonsAddIn_ViewSwitch;
            BrethertonsAddIn_ViewSwitch();
        }

        private void BrethertonsAddIn_ViewSwitch()
        {
            Outlook.Explorer olExplorer = Application.ActiveExplorer();
            // Convert the Outlook view into a COM _TableView class which as the AutoFormatRules exposed as properties
            // return if this cast cannot be done
            Outlook._TableView tv = olExplorer.CurrentView as Outlook._TableView;
            if (tv == null) return;
            // Try to find an existing AutoFormatRule for CRM Tracking and delete it
            // Use of the loop is necessary as there is no delete method on the AutoFormatRule object
            // So it's necessary to use the Remove method of a collection object instead
            for (int n = tv.AutoFormatRules.Count; n > 1; n--)
            {
                if (tv.AutoFormatRules[n].Name == "CRM Tracking Pending")
                {
                    tv.AutoFormatRules.Remove(n);
                }
            }
            //Add a new rule and then configure it
            Outlook.AutoFormatRule afr = tv.AutoFormatRules.Add("CRM Tracking Pending");
            afr.Filter = "\"http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/crmLinkState\" = 1";
            afr.Font.Italic = true;
            afr.Font.Bold = true;
            afr.Font.Color = Outlook.OlColor.olColorGreen;
            afr.Enabled = true;
            // Save and apply the changes to the rule
            tv.Save();
            afr.Filter = "\"http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/crmLinkState\" = 1";
            tv.Apply();
            afr.Filter = "\"http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/crmLinkState\" = 1";
        }
}

答案 1 :(得分:0)

这是Outlook中的一个错误,MS不打算修复它。