Add notification badge icon to Ribbon control in Add-in - c#

We are working on powerpoint add-in. As per requirement, we need to implement notification feature to the add-in application. We are already having some Ribbon button in our Ribbon control. We need to add a badge button in the Ribbon button along with the existing buttons.
Below is the sample badge button we are looking.
I have checked with “Ribbon Button”, Split Button etc. But I couldn’t reach the solution. Will it be a possible requirement?
Is there any way to get the Location of Ribbon button? I have checked the ribbon button properties, but not found any location properties. If we get the location of Ribbon Button we can display notification panel near to ribbon button.

The best way is most probably to provide a callback for the image, and render the notification when returning the image.
Note that you need to switch to XML definition of the ribbon for that (the visual ribbon designer in Visual Studio does not support image callbacks/events, as far as I remember, it supports only trivial "click" event). Use "Export to XML" menu item to export the ribbon to XML, then define a custom image callback.
Here is a somewhat related question: How can I add the images to button using the ribbon xml?
That should do. Note that you need to force repaint when you want to change the notification; for that, you may use "onload" event to capture the ribbon, and call "repaint" method on it.
Below is an almost complete example that shows an auto-incrementing number on a ribbon button.
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");
}

Related

VSTO customise outlook folder context menu

I am basically looking to do this:
C# (outlook add-in) context menu on folders
But the problem is the it never fires the FolderContextMenuDisplay event.
Looking at the documentation it seems to be deprecated, but does anyone know what I should use instead?
Thanks!
By using Ribbon XML you can set the visibility of context menu.
In this post, I will show you how to show and hide items in a context menu by using Ribbon XML.
The context menu appears when a user right-clicks an Outlook folder.
First, add a Ribbon XML item to your Outlook project.
Then add the following code to your ThisAddIn class. This example assumes that your Ribbon is called Ribbon1 and that you are using C#:
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
return new Ribbon1();
}
Next, replace the contents of the Ribbon1.xml file with the following:
<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
<contextMenus>
<contextMenu idMso="ContextMenuFolder">
<button idMso="FolderPropertiesContext" getVisible="IsVisible" />
</contextMenu>
</contextMenus>
</customUI>
But wait. There’s more!
In Ribbon1.cs file create this method.
public bool IsVisible(Office.IRibbonControl control)
{
string name = ((Outlook.Folder)control.Context).Name;
if (foldername == "Inbox")
{
return false;
}
return true;
}
When user right-clicks the folder, then we tell Outlook to not show the command by returning false. Otherwise, we tell Outlook to go ahead and make the command visible by returning true.

How to have event or run method after the document was Closed?

I have an Word AddIn (VSTO) that will process the word document after it will be closed by the user.
Unfortunately, the DocumentBeforeClose event is raised even in cases where the document is not really going to close.
Ex: The event is raised before a dialog box is shown to the user prompting the user to save the document. Users are asked whether they want to save with a Yes, No, and Cancel button. If the user selects Cancel, the document remains open even though a DocumentBeforeClose event was raised.
For that reason is there is any way or method to make event or Method that will be raised or run after the document was closed .
I tried to do like this:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Globals.ThisAddIn.Application.DocumentBeforeClose += new Microsoft.Office.Interop.Word.ApplicationEvents4_DocumentBeforeCloseEventHandler(this.Application_DocumentBeforeClose);
// I want some thing like this
Globals.ThisAddIn.Application.DocumentAfterClose += new Microsoft.Office.Interop.Word.ApplicationEvents4_DocumentOpenEventHandler(this.Application_DocumentAfterClose);
}
public void Application_DocumentBeforeClose(Word.Document doc, ref bool Cancel)
{
MessageBox.Show(doc.Path, "Path");
}
// I want some thing like this
public void Application_DocumentAfterClose(string doc_Path)
{
MessageBox.Show(doc_Path, "Path");
}
As you already said, you can't be certain with the DocumentBeforeClose event handler that the document is actually closed afterwards. However, you can gain full control on the close process by overriding the File Close command:
Add commands to your Ribbon XML (for idMso FileClose):
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
onLoad="OnLoad">
<commands>
<command idMso="FileClose" onAction="MyClose" />
</commands>
<ribbon startFromScratch="false">
<tabs>
<!-- remaining custom UI goes here -->
</tabs>
</ribbon>
</customUI>
Providing the respective callback methods in your code:
public void MyClose(IRibbonControl control, bool cancelDefault)
{
var doc = Application.ActiveDocument;
doc.Close(WdSaveOptions.wdPromptToSaveChanges);
// check whether the document is still open
var isStillOpen = Application.IsObjectValid[doc];
}
As full sample how to customize Word commands can be found on MSDN:
Temporarily Repurpose Commands on the Office Fluent Ribbon

VSTO Excel preserve Ribbon state

I have simple VSTO Excel 2013 Application level Add-in with custom Ribbon, which includes toggle button and checkbox. If I open two files (workbooks) I can see that the Ribbons do not preserve their state across multiple windows, meaning if I click on checkbox or toggle button on Second workbook the same checkbox state is shown on a first workbook and vise versa. I found an article which describes a similar situation for outlook : https://www.add-in-express.com/creating-addins-blog/2013/01/30/preserve-outlook-ribbon-controls-state/ but unfortunately the Inspector window event is not available in Excel. Any idea on how to deal with it?
You need to use callbacks instead of attributes in the Ribbon XML. Also when a user changes the active window you need to call the Invalidate/InvalidateControl method of the IRibbonUI interface to force Office applications (Excel in your case) call your callbacks for the current state of controls. It's pretty easy...
You can read more about the Ribbon UI (aka Fluent UI) in the following series of articles in MSDN:
Customizing the 2007 Office Fluent Ribbon for Developers (Part 1 of 3)
Customizing the 2007 Office Fluent Ribbon for Developers (Part 2 of 3)
Customizing the 2007 Office Fluent Ribbon for Developers (Part 3 of 3)
Also you may find the following ones helpful:
Chapter 11: Creating Dynamic Ribbon Customizations (1 of 2)
Chapter 11: Creating Dynamic Ribbon Customizations (2 of 2)
I tried a sample with a toggle button with toggle on and then switched to another workbook the toggle button doesnt persist. But then if you stored the pressed value in a variable and return that on getPressed callback of a toggle button it worked.
Ribbon.xml
<?xml version="1.0" encoding="UTF-8"?>
<customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab idMso="TabAddIns">
<group id="group1" label="group1">
<toggleButton id="toggleButton1" label="toggleButton1" size="large" getPressed="buttonPressed" onAction="buttonAction"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Ribbon.cs
private bool isButtonPressed = false;
public void buttonAction(Office.IRibbonControl control, bool isPressed)
{
isButtonPressed = isPressed;
}
public bool buttonPressed(Office.IRibbonControl control)
{
return isButtonPressed;
}

How to intercept clicking of a built-in Office Ribbon control

I'm wondering if it's possible to detect when a user has clicked the Header/Footer button in Excel so I can show some custom header/footer related ribbon controls on my add-in's tab and hide them when the user is not in header/footer edit mode.
Is it possible to hijack this button click somehow? I've seen applications hijack the Excel Save before. I'm looking for similar behavior just with the header/footer button.
I'm using C#, Visual Studio 2012 and Excel 2010. I've created my custom ribbon using the Ribbon XML approach.
One way I've discovered that worked was to use the <commands> section in the Ribbon XML (which I didn't know existed.) Apparently this mechanism allows you to re-purpose actions intrinsic to Excel but beware that not all controls support re-purposing the onAction callback)
<?xml version="1.0" encoding="UTF-8"?>
<customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<commands>
<command idMso="HeaderFooterInsert" onAction="testHeaderFooter"/>
</commands>
<ribbon>
<tabs>...
along with the associated event handler:
public void testHeaderFooter(Office.IRibbonControl control, bool cancelDefault)
{
MessageBox.Show("Testing.");
cancelDefault = false;
}
This link was very helpful:
http://social.msdn.microsoft.com/Forums/office/en-US/e1a60d16-053e-4697-b17c-b22d602f0400/intercept-the-onaction-event-of-a-gallery-element-of-excel-2007-ui-ribbon?forum=vsto

how to add child windows as tabs in wpf ribbon window?

I am new to WPF, I want create a project with ribbon window. I started new project and started with new window with ribbon control. What I want is, when user click on a button in ribbon control, I need to add another window as a tab instance in my main window under the ribbon control like we see in office word (new document) and Photoshop etc. How to achieve this behavior, I searched on google and I found a lot of tutorials how to add ribbon control not going further. any one help me..
In your RibbonWindow XAML, define a TabControl
<RibbonWindow>
...
<TabControl Name="mainTabControl" />
</RibbonWindow>
Add an EventHandler to your RibbonButton:
<RibbonButton Name="newTabRibbonButton" Click="newTabRibbonButton_Click_1" />
private void newTabRibbonButton_Click_1(object sender, RoutedEventArgs e)
{
TabItem newItem = new TabItem();
newItem.Header = "New Document";
mainTabControl.Items.Add(newItem);
}
Note however, that you need to define the Content for your TabItem.

Categories