J'ai écrit le fichier Ribbon.xml pour un projet VSTO Excel. L'élément onglet ressemble à ceci:Modification de la propriété visible de l'onglet VSTO via l'événement Workbook_Open
<tab id="myId" idMso="TabAddIns" label="My Tab" visible="false">
Lorsqu'un classeur est ouvert, je veux l'onglet soit caché par défaut, ce qui est accompli par la propriété visible étant définie sur false. Ensuite, je souhaite modifier la propriété visible à true dans l'événement Workbook_Open. C'est là que je suis coincé. Je ne pense pas que ce serait difficile, mais j'ai passé quelques heures à chercher la réponse. Il semble que la plupart des exemples 1) basculer la visibilité d'un onglet par un button callback, ce qui n'est pas ce que je veux faire, ou 2) sont en mesure d'accéder au ribbon's properties, que je n'ai pas été capable de reproduire jusqu'à présent (bien que la plupart les ressources sont anciennes, donc je pense que MS a déménagé ces propriétés depuis).
Est-ce que quelqu'un sait comment changer facilement la propriété visible à true pour que l'onglet soit affiché?
Merci!
INFORMATIONS AVEC MISE À JOUR:
ThisAddIn.cs
namespace Doodles_Reporting
{
public partial class ThisAddIn
{
public RibbonApi ribbonApi;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
return new Ribbon();
}
void Application_WorkbookOpen(Excel.Workbook Wb)
{
//first, check if there is an application/process for each workbook
Excel.Workbooks books = Globals.ThisAddIn.Application.Workbooks;
if (books.Count > 1)
{
try
{
//close workbook that was just opened and then reopen it with new process/application.
string filePath = Wb.FullName;
Wb.Close();
Excel.Application excelApp = new Excel.Application();
excelApp.Visible = true;
excelApp.DisplayFullScreen = true;
excelApp.Workbooks.Open(filePath);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK);
}
}
else
{
//second, check if the workbook is a Doodles workbook
try
{
DocumentProperties props = (DocumentProperties)Wb.CustomDocumentProperties;
var selectedTable = props["selectedTable"].Value;
configureDoodles();
}
catch (Exception)
{
//THIS IS WHERE I WANT TO SET THE RIBBON VISIBILITY TO FALSE
}
}
}
private void configureDoodles()
{
RibbonApi.app = Globals.ThisAddIn.Application;
RibbonApi.wBookPropertiesConfig = new WorkbookPropertiesConfig(RibbonApi.app.ActiveWorkbook);
RibbonApi.presenter = new ExcelPresenter(RibbonApi.app.ActiveWorkbook);
ribbonApi = new RibbonApi();
}
#region VSTO generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
this.Application.WorkbookOpen += new Excel.AppEvents_WorkbookOpenEventHandler(Application_WorkbookOpen);
}
#endregion
}
}
Ribbon.cs
namespace Doodles_Reporting
{
[ComVisible(true)]
public class Ribbon : Office.IRibbonExtensibility
{
private Office.IRibbonUI ribbon;
public Ribbon()
{
}
#region IRibbonExtensibility Members
public string GetCustomUI(string ribbonID)
{
return GetResourceText("Doodles_Reporting.Ribbon.xml");
}
#endregion
#region Ribbon Callbacks
//Create callback methods here. For more information about adding callback methods, visit http://go.microsoft.com/fwlink/?LinkID=271226
public void Ribbon_Load(Office.IRibbonUI ribbonUI)
{
this.ribbon = ribbonUI;
}
public bool toggleVisibility(Office.IRibbonControl control)
{
return (control.Id == "TabAddIns") ? true : false;
}
public void onSomeEvent()
{
this.ribbon.InvalidateControl("TabAddIns");
}
public void SignIn(Office.IRibbonControl ribbonUI)
{
Globals.ThisAddIn.ribbonApi.signIn();
}
public void SqlCreatorFormLoad(Office.IRibbonControl ribbonUI)
{
Globals.ThisAddIn.ribbonApi.showSqlCreator();
}
public void refreshData(Office.IRibbonControl ribbonUI)
{
Globals.ThisAddIn.ribbonApi.refreshData();
}
public void drilldownSelectionLoad(Office.IRibbonControl ribbonUI)
{
Globals.ThisAddIn.ribbonApi.setDrilldownColumns();
}
public void Drilldown(Office.IRibbonControl ribbonUI)
{
Globals.ThisAddIn.ribbonApi.drilldown();
}
public void editProperties(Office.IRibbonControl ribbonUI)
{
}
#endregion
#region Helpers
private static string GetResourceText(string resourceName)
{
Assembly asm = Assembly.GetExecutingAssembly();
string[] resourceNames = asm.GetManifestResourceNames();
for (int i = 0; i < resourceNames.Length; ++i)
{
if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
{
using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
{
if (resourceReader != null)
{
return resourceReader.ReadToEnd();
}
}
}
}
return null;
}
#endregion
}
}
Qu'avez-vous essayé, et qu'est-ce qui ne fonctionne pas? Est-ce que vous ne pouvez pas obtenir une référence à l'onglet à partir du gestionnaire Workbook_Open (utilisez un champ statique), ou est-ce que cela ne fonctionne pas? – hoodaticus
À droite, je ne peux pas obtenir une référence à l'onglet du gestionnaire Workbook_Open. Pardonnez ma question ignorante, mais quel devrait être le champ statique? Je suis également tombé sur ce lien (https://msdn.microsoft.com/en-us/library/bb772088.aspx), mais je n'arrive pas à trouver le nom de mon ruban sous Globals.Ribbons. – christopheralan88
Qui tire en premier? 'Application_WorkbookOpen' ou' CreateRibbonExtensibilityObject'? –