自定义任务窗格如何在保持UI响应的同时切换可见性?

我正试图在Excel加载项中添加一个自定义任务窗格,该窗口的用途与“数据透视表”窗格类似。

目的是当select一个表时,自定义窗格应该出现,应该消失。 为此,我创build了一个自定义任务窗格:

this._taskPane = Globals.AddIn.CustomTaskPanes.Add( new TableTaskPane(), "FooPane"); this._taskPane.DockPositionRestrict = MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoHorizontal; 

当select表格时,窗格变得可见,并且当取消select时,窗格被隐藏:

 ListObject table = AddTable(); // Creates the table and populates with data. table.Selected += range => this._taskPane.Visible = true; table.Deselected += range => this._taskPane.Visible = false; 

这实现了显示和隐藏窗格的效果,但不幸的是在UI中产生了一些延迟,在任务窗格在可见性状态之间转换时光标在单元之间“跳动”。

这似乎是因为Visible属性的setter阻塞,直到任务窗格完成转换。 在Excel 2013中,它从窗口一侧滑出,大约需要500毫秒。

我看不到任何方式来改变这种行为 – 我已经尝试在STA线程上调度属性设置,但它导致相同的阻塞。 我很乐意改变任务窗格,让它在没有转换的情况下立即出现(比如Pivot Table窗格),但是我也没有看到任何事情发生。

我做错了吗? 有没有办法解决这个直接的COM或一些其他隐秘的行为?

您可以通过closures这里find的愚蠢的Windowsanimationfunction来完成这个(甚至更多的性能改进):控制面板 – >系统和安全 – >系统 – >高级设置 – >性能设置 – >视觉效果。

在这种情况下,我相信你需要关掉这个:

  • 在窗口内animation控件和元素。

但是这些对于加快速度也是很好的:

  • 淡入淡出或滑动菜单到视图中
  • 滑开combobox
  • 最小化和最大化时animation化窗口。

您应该能够通过窗格API将窗格宽度设置为零,否则将使用Windows API SetWindowPos。 然后改变可见性。 我不使用VSTO,但知道可以使用原始的Office窗格对象来完成。