1

初始情况:

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

客观的:

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

我们找到了以下链接:

链接

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

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

谢谢!

基督教

4

3 回答 3

1

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

请记住,如果 Web 服务已关闭,每次单击都可能会在您在 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" />
于 2013-01-10T00:21:20.200 回答
0

以下标题为向 Office Fluent 用户界面添加自定义动态菜单的文章将为您指明正确的方向。

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

动态创建的菜单示例

于 2013-01-15T22:33:02.930 回答
0

好的,谢谢你的提示。最后我像这样解决了它:

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

public static RibbonIet ribbon {get; set; }

在功能区的加载事件中,我分配功能区(此),如:

Session.Common.ribbon = this;

现在我可以像控制 RibbonButton 一样:

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

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

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

也许这对其他人有帮助。

于 2013-04-30T12:10:29.497 回答