我是Outlook编程的新手,所以第一步(稍后会更高级)是以下任务:
Explorer部分很容易上手,但我在为新的检查员做上述事情时遇到了问题
我尝试了各种方法,但似乎都没有效果:
我已经尝试在NewInspector中引用Globals.Ribbons [inspector] .Ribbon1但它始终为null
我已经尝试在NewInspector中订阅Activate事件并从那里开始,但在那里Application.ActiveInspector()为null,如果我从NewInspector事件存储检查器的全局副本它不适用于第一个新检查员(仅在第二个和之后阅读邮件。而不是撰写邮件)
我尝试使用Ribbon Load事件,但这只是第一次发生
我曾尝试使用Globals.Ribbons.Ribbon1成员,但这只是第一次使用
(我发现了很多NewInspector的样本,但似乎没有人想要修改除此https://stackoverflow.com/questions/7852017/outlook-2007-ribbon-object-reference-not-set-to-an-instance-of-an-object之外的功能区,因此没有答案)
这让我发疯了......难道真的没办法做这么简单的任务了吗?
参考示例代码
void InspectorsNewInspector(Outlook.Inspector inspector)
{
AddInspectorEventHandlers(inspector);
}
private void AddInspectorEventHandlers(Outlook.Inspector inspector)
{
if (inspector == null)
{
return;
}
Ribbon1 ribbon1 = Globals.Ribbons[inspector].Ribbon1; //This always return null!!!
((Outlook.InspectorEvents_10_Event)inspector).Activate += InspectorActivate;
((Outlook.InspectorEvents_10_Event)inspector).Close += InspectorClose;
_openInspectors.Add(inspector);
}
答案 0 :(得分:0)
在“NewInspector”事件期间,您的自定义功能区未加载。如果您调试代码,您将看到它只是在'NewInspector'事件之后才进入自定义色带设计器。您可以做的是在自定义功能区加载事件期间实现所需的功能。那是
private void MyRibbon_Load(object sender, RibbonUIEventArgs e){}
在这里,您可以获得当前的活动检查员。从中你可以得到你需要的物品。
前:
Inspector inspector = Globals.WPTAddIn.Application.ActiveInspector();
if (inspector != null)
{
if (inspector.CurrentItem != null)
{
if (inspector.CurrentItem is MeetingItem)
{
MeetingItem meetingItem = (MeetingItem)inspector.CurrentItem;}}}
答案 1 :(得分:0)
我今天遇到了同样的问题并想出了一个解决方法。我基本上一直在尝试访问刚刚创建的Ribbon
的{{1}}。
为了解决这个问题,我已经在MailItem
中的每个色带上循环(不使用检查器索引器,因为它会为您提供空引用)。对于每个Globals.Ribbons
对象,我检查它的类型为Ribbon
的上下文。然后,我可以对Inspector
进行相等检查,以确定它们的引用是否相等。如果它们相等,我知道要使用Inspector.CurrentItem
这是一个片段
Ribbon