Outlook加载项 - 在运行时/从代码启用/禁用按钮

时间:2013-01-09 14:55:00

标签: outlook vsto add-in

初始状况:

我们正在使用基于Framework 4.0,VSTO,DevExpress WinForm控件的VS.NET 2010在C#中开发Outlook 2010的加载项。在Designer中,我们有一个带有RibbonTab的Ribbon,然后是一个RibbonGroup,然后是一个RibbonButton。我们正在使用此Outlook加载项中的Web服务。

目的:

我们需要在WebService可用/不可用(来自/离开代码)时启用/禁用RibbonButtons

我们找到了以下链接:

链接

功能区对象模型概述:http://msdn.microsoft.com/en-us/library/bb608623.aspx 功能区概述:http://msdn.microsoft.com/en-us/library/bb386097.aspx 演练:在运行时更新功能区上的控件:http://msdn.microsoft.com/en-us/library/bb608628.aspx

在试图弄清楚如何实现这一点后,我们决定在此处发布/提出这个问题。有没有人有示例代码?我们尝试了IRibbonExtensibility和CreateRibbonExtensibilityObject =>我们添加了RibbonTab,Group和Button,并添加了Click事件=>的订阅。事件被触发但未处理(在button_Click(...)=> System.Diagnostics.Debugger.Break()没有破坏代码执行)

谢谢!

基督教

3 个答案:

答案 0 :(得分:1)

您希望以相当频繁的速率使功能区无效,以刷新每个选项卡/按钮的可见性。您可以通过订阅Click事件(正如您已完成)然后调用RibbonObject.Invalidate();来完成此操作。然后为每个按钮添加getEnabled="yourTestFunction"参数,其中public bool yourTestFunction(Office.IRibbonControl control)(在Ribbon.cs文件中定义)返回Web服务是否可用。

请注意,如果网络服务已关闭,每次点击都会使您的应用程序挂起您在网络服务检查中设置的超时时间

修改
刚刚意识到_Click事件没有映射到Excel COM库中,所以这里有一些代码会在每次更改单元格时运行(不像每次单击那样频繁,但希望足够好)。

ThisAddIn.cs

public static Excel.Application e_application;
public static Office.IRibbonUI e_ribbon;
    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        e_application = this.Application;
        e_application.SheetSelectionChange += new Excel.AppEvents_SheetSelectionChangeEventHandler(e_application_SheetSelectionChange);
    }

    void e_application_SheetSelectionChange(object Sh, Excel.Range Target)
    {
        e_ribbon.Invalidate();
    }

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
        e_application.SheetSelectionChange -= new Excel.AppEvents_SheetSelectionChangeEventHandler(e_application_SheetSelectionChange);
        e_application = null;
    }

Ribbon1.cs

public void Ribbon_Load(Office.IRibbonUI ribbonUI)
{
    this.ribbon = ribbonUI;
    ThisAddIn.e_ribbon = ribbonUI; //Add this line
}

    public bool getEnabledTest(Office.IRibbonControl control)
    {
        //Whatever you use to test your Web Service
        //return false;
    }

Ribbon1.xml

 <button id="WebService" label="Use The Web Service" onAction="executeWebService" getEnabled="getEnabledTest" />

答案 1 :(得分:0)

以下文章标题为Adding Custom Dynamic Menus to the Office Fluent User Interface,将为您指明正确的方向。

以下是动态创建菜单的示例,您可以修改教程以满足您的特定需求。

An example of a dynamically created menu

答案 2 :(得分:0)

好的,谢谢你的提示。最后我解决了这个问题:

我声明了一个静态功能区对象,如:

public static RibbonIet ribbon {get; set; }

在功能区的加载事件中我指定功能区(this),如:

Session.Common.ribbon = this;

现在我可以控制RibbonButton,如:

Session.Common.ribbon.buttonCreateIncident.Enabled = true;

由于webService调用是在一个单独的线程中运行的,我必须使用MethodInvoker来更改启用/禁用按钮。它是这样的:

If (InvokeRequired)
{
Invoke(new MethodInvoker(() => Session.Common.ribbon.buttonCreateIncident.Enabled = true));
}

也许这对其他人有帮助。