Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 要保留功能区状态,请使用VSF_C#_Excel_Vsto_Excel 2013 - Fatal编程技术网

C# 要保留功能区状态,请使用VSF

C# 要保留功能区状态,请使用VSF,c#,excel,vsto,excel-2013,C#,Excel,Vsto,Excel 2013,我有一个简单的VSTO Excel 2013应用程序级外接程序,带有自定义功能区,其中包括切换按钮和复选框。如果我打开两个文件(工作簿),我可以看到功能区不会在多个窗口中保持其状态,这意味着如果我在第二个工作簿上单击复选框或切换按钮,第一个工作簿上会显示相同的复选框状态,反之亦然。我发现一篇文章描述了outlook的类似情况:但不幸的是,Excel中没有Inspector窗口事件。您知道如何处理它吗?您需要在功能区XML中使用回调而不是属性。此外,当用户更改活动窗口时,您需要调用界面的Inval

我有一个简单的VSTO Excel 2013应用程序级外接程序,带有自定义功能区,其中包括切换按钮和复选框。如果我打开两个文件(工作簿),我可以看到功能区不会在多个窗口中保持其状态,这意味着如果我在第二个工作簿上单击复选框或切换按钮,第一个工作簿上会显示相同的复选框状态,反之亦然。我发现一篇文章描述了outlook的类似情况:但不幸的是,Excel中没有Inspector窗口事件。您知道如何处理它吗?

您需要在功能区XML中使用回调而不是属性。此外,当用户更改活动窗口时,您需要调用界面的Invalidate/InvalidateControl方法,以强制Office应用程序(在您的示例中为Excel)为控件的当前状态调用回调。这很简单

在MSDN的以下系列文章中,您可以阅读有关Ribbon UI(也称为Fluent UI)的更多信息:

此外,您可能会发现以下内容很有帮助:


我尝试了一个切换按钮打开的示例,然后切换到另一个工作簿。切换按钮不存在。但是,如果您将按下的值存储在变量中,并在切换按钮的getPressed回调中返回该值,那么它就起作用了

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>

这里的讨论可能会为您提供有关此问题的更多信息。您好,感谢我之前找到的链接,但根据它,此问题没有任何乐趣:)希望找到解决此问题的方法我在这里提出了另一个简单的解决方案:您好Eugene,我以前看到过您的答案,然而,我已经在Designer中创建了一个功能区,除非我完全错了,否则这个问题更多地与“活动”窗口相关,而不是与“活动”窗口相关。在特定情况下,当活动窗口功能区状态更改时,它也会反映在活动窗口中的。如果这不是一个大问题,你可以把几行在这里,因为这是常见的问题,将有助于所有的插件开发人员。ThanksIt似乎我需要在一篇博文中深入描述它。。。无法更新处于活动状态的功能区控件。你无法控制。唯一可能的方法是在切换到另一个/此工作簿时使用回调。我明白了,所以基本上我们都被这个问题困住了。我确实在活动窗口功能区状态上有正确的激活和启用状态,所以这个问题更像是一个装饰性的问题,而不是功能性的问题。是的,在2013年之前的版本中,这很好,因为我们没有伪SDI。然而,在2013年,人们感觉每个窗口都是纯SDI,这看起来是不可接受的。事实上,办公室决定何时召回。你可以在需要的时候提出要求。
private bool isButtonPressed = false;
    public void buttonAction(Office.IRibbonControl control, bool isPressed)
    {
        isButtonPressed = isPressed;
    }
    public bool buttonPressed(Office.IRibbonControl control)
    {
        return isButtonPressed;
    }