Office Fluent Ribbon 回调函数获取控件的当前状态..?

Office Fluent Ribbon callback function to get the current state of a control..?

我在 Visual Studio 中使用 VB .Net 为 Excel 创建了我的第一个 VSTO 插件。通常,我很难理解功能区回调。我已经让他们工作了,但我有一个问题找不到答案:

是否有功能区回调函数可以直接获取控件的状态..?

例如,要将功能区与 类 进行比较,大多数 "clickable" 控件在被单击时会触发 onAction 回调,这些可以被视为事件。复选框和切换按钮等多状态控件有 getPressed 回调来设置它们的当前状态,这些可以被认为是 属性 Set 方法。同样,基于文本的控件具有 getText 回调。

但是是否有任何与 属性 Get 方法等同的方法..?根据回调的倒置性质,这些回调似乎很可能是以 set 开头的回调,例如 setPressedsetText...但我还没有找到任何回调。

它们不存在吗,因为 get 实际上是 set,反之亦然..?

没有回调来获取这些属性的值 - 因为您是设置各种值的人,所以您应该是在内部存储这些值的人,从而为功能区和您的代码公开它们.

VSTO Ribbon Designer "wraps" up Ribbon XML 以便开发人员可以像使用 Windows 一样使用 basic 控件] 表单控件。这意味着可以在 run-time 读取和写入属性(XML 中的属性),而不是通过回调。此外,功能区控件 objects 公开 事件 而不是开发人员需要编写事件回调代码。

(请注意,对于更复杂的内容,有必要使用功能区 XML。设计器实际上仅适用于从工具箱添加的基本控件。)

文档是 here。下面是一个小例子来演示。

例如,DropDown 控件已添加到名为 DropDown1 的功能区组中。它可以在代码文件 Ribbon1.Designer.cs 中找到,它被声明为

internal Microsoft.Office.Tools.Ribbon.RibbonDropDown dropDown1;

并通过

实施
// dropDown1
// 
ribbonDropDownItem1.Label = "Item0";
ribbonDropDownItem2.Label = "Item1";
ribbonDropDownItem3.Label = "Item2";
ribbonDropDownItem4.Label = "Item3";
this.dropDown1.Items.Add(ribbonDropDownItem1);
this.dropDown1.Items.Add(ribbonDropDownItem2);
this.dropDown1.Items.Add(ribbonDropDownItem3);
this.dropDown1.Items.Add(ribbonDropDownItem4);
this.dropDown1.Label = "dropDown1";
this.dropDown1.Name = "dropDown1";
this.dropDown1.SelectionChanged += new System.EventHandler<Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs>(this.dropDown1_SelectionChanged);

请注意,此文件中的信息由 "Tools" 生成,开发人员不得对其进行编辑。可以,但不能保证 "Tools" 不会做出否定任何编辑的更改。但从中可以看出加载 Ribbon 时执行了什么(属性设置和加载列表)以及事件的创建(这将是 Ribbon XML 中的回调)。显示的所有属性和设置都是使用设计器中提供的 Properties window 生成的,与 Windows 表单控件相同。

然后在项目中的一个Ribbon组(任何选项卡,任何组)中添加了一个按钮。 Double-click 使用默认的 Click 处理程序打开 Ribbon1.cs 中的代码页,并添加了代码存根。大括号之间的代码是开发者敲的

请注意此代码如何使用 属性 ,这些属性被读取 (this.dropDown1.SelectedItem.Label) 并被设置 (ddItem.Label)。该代码显示一条消息,其中包含当前所选项目的标题,创建一个新项目,设置标题和屏幕提示,将其添加到下拉列表中,然后选择该项目。

private void btnSetGetDD1_Click(object sender, RibbonControlEventArgs e)
{
    MessageBox.Show(this.dropDown1.SelectedItem.Label);
    RibbonDropDownItem ddItem = new RibbonDropDownItem();
    ddItem.Label = "new item three added";
    ddItem.ScreenTip = "next test";
    this.dropDown1.Items.Add(ddItem);
    this.dropDown1.SelectedItemIndex = this.dropDown1.Items.Count - 1;
}