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

时间:2014-03-24 13:33:55

标签: excel vsto ms-office

我尝试在Excel加载项中添加自定义任务窗格,其目的与“数据透视表”窗格类似。

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

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

选择表格后,窗格变为可见,取消选择后,窗格将隐藏:

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线程上安排属性设置,但它会导致相同的阻止。我很乐意更改任务窗格,使其在没有转换的情况下立即显示(如数据透视表窗格),但我也看不到任何可能发生的事情。

我做错了吗?有没有办法通过直接COM或其他一些隐藏的行为来解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以通过关闭此处的愚蠢Windows动画功能来完成此操作(以及更多性能改进): 控制面板 - >系统和安全 - >系统 - >高级设置 - >性能设置 - >视觉效果。

在这种特殊情况下,我认为你需要关闭这个:

  • 动画窗口内的控件和元素。

但这些对于加快速度也很有用:

  • 将菜单淡入或滑入视图
  • 滑动打开的组合框
  • 最小化和最大化时动画窗口。

答案 1 :(得分:1)

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