将通知徽章图标添加到加载项中的功能区控件

时间:2018-02-09 13:19:32

标签: c# winforms powerpoint office-interop add-in

我们正在开发powerpoint插件。根据要求,我们需要为加载项应用程序实现通知功能。我们的Ribbon控件中已经有一些Ribbon按钮。我们需要在功能区按钮中添加徽章按钮以及现有按钮。

以下是我们正在寻找的示例徽章按钮。

enter image description here

我已经使用“Ribbon Button”,Split Button等进行了检查。但是我无法达到解决方案。这可能是一个要求吗?

有没有办法获取功能区位置按钮?我检查了功能区按钮属性,但未找到任何位置属性。如果我们获得功能区按钮的位置,我们可以在功能区按钮附近显示通知面板。

1 个答案:

答案 0 :(得分:1)

最好的方法是为图像提供回调,并在返回图像时呈现通知。

请注意,您需要切换到功能区的XML定义(Visual Studio中的可视功能区设计器不支持图像回调/事件,据我记得,它仅支持琐碎的"单击&#34 ;事件)。使用"导出到XML"菜单项将功能区导出为XML,然后定义自定义图像回调。

enter image description here

这是一个有点相关的问题:How can I add the images to button using the ribbon xml?

应该这样做。请注意,如果要更改通知,则需要强制重新绘制;为此,你可以使用" onload"捕获功能区的事件,并调用"重绘"方法就可以了。

下面是一个几乎完整的示例,显示了功能区按钮上的自动递增数字。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" 
          onLoad="Ribbon_Load">
  <ribbon>
    <tabs>
      <tab idMso="TabAddIns">
        <group id="MyGroup" label="My Group">
          <button id="MyButton" size="large" label="Button With Flag"
                  getImage="Ribbon_GetHelloImage" 
                  onAction="Ribbon_SayHello"  />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

C#

[ComVisible(true)]
public class Ribbon1 : Office.IRibbonExtensibility
{
    private Office.IRibbonUI ribbon;
    private Timer timer = new Timer();

    public void Ribbon_Load(Office.IRibbonUI ribbonUI)
    {
        this.ribbon = ribbonUI;

        timer.Interval = 1000;
        timer.Start();
        timer.Tick += (sender, args) => ribbon.InvalidateControl("MyButton");
    }

    public Bitmap Ribbon_GetHelloImage(Office.IRibbonControl ctrl)
    {
        var bitmap = new Bitmap(32, 32);
        var flagGraphics = Graphics.FromImage(bitmap);
        flagGraphics.DrawString(DateTime.Now.Second.ToString(), 
            new Font(FontFamily.GenericSansSerif, 10), 
            Brushes.Red, 12, 0);

        return bitmap;
    }

    public void Ribbon_SayHello(Office.IRibbonControl ctrl)
    {
        MessageBox.Show("Hello", "Hello");
    }

enter image description here