【问题标题】:How to intercept the changes to this properties window?如何拦截对此属性窗口的更改?
【发布时间】:2020-01-08 05:34:06
【问题描述】:

我试图拦截在 VS 扩展项目 (vsix) 中更改此属性窗口时触发的更改事件(任何字段)。此扩展将针对 2019 年之前的 VS 版本(最新版本)。

我使用过dte.Events.TextEditorEvents.LineChanged,但它会间歇性地捕获事件。

有没有我可以为此目的查看的特定事件?

【问题讨论】:

  • 您想检测应用程序参数文本框还是整个调试属性窗口?预计会有更详细的信息..
  • 那个特定的设计师(又名项目设计师)不是文本编辑器,所以我不确定 TextEditorEvents.LineChanged 将如何在这里发挥作用。您希望收到哪个字段或属性的更改通知?除了项目文件被弄脏之外,我不确定是否有任何这些更改通知,因为您更改了一个或多个项目设置(如星号所示)
  • @PerryQian-MSFT 它可以是任何选项卡式窗口中的任何字段,无论是调试、构建还是应用程序。
  • @EdDore 同上。任何指向正在更改的窗口值的事件就足够了。它不仅是调试窗口。如果其他选项卡中的值发生变化,则应处理引发的事件。

标签: visual-studio events visual-studio-extensions vsix


【解决方案1】:

一开始我误以为IVsRunningDocTableEvents.OnAfterAttributeChange 可以用。但是在查看了设计器代码库(我见过的用 VB.NET 编写的少数代码库之一)后,我发现这个特定的设计器通过使用VSFPROPID_OverrideDirtyState 显式调用 IVsWindowFrame.SetProperty 来设置窗口框架的脏值,根据 cmets 中的vsshell80.idl 文件:

VSFPROPID_OverrideDirtyState  = -4014,  // BOOL/EMPTY -- tri-state value to control dirty star (*) in window caption 
//      VT_EMPTY: default handling of dirty star
//      VARIANT_TRUE: override default handling to SHOW dirty star
//      VARIANT_FALSE: override default handling to show NO dirty star

表示此设计器不利用 RDT 驱动的默认机制。 :-(

我发现您可能拦截的唯一通知是各个属性本身的 IPropertyNotifyChange,一旦您更改给定设置并将焦点移至另一个控件,它就会触发。

这可能不是你要找的,但如果你能解释为什么你需要这样的通知,我可能会想出比定期轮询设计师 VSFPROPID_OverrideDirtyState 属性更好的东西(这是唯一的另一件事这立即浮现在脑海中)。

谢谢, 埃德....

【讨论】:

  • 我希望拦截此更改事件的原因是在更改项目设置/属性时触发保存。这是一个扩展,我正在尝试将此功能添加到 - marketplace.visualstudio.com/…
  • 你觉得你能帮忙吗?
  • 如果您希望在 x 秒后自动保存,那么您实际上不需要执行任何操作,只需每隔 x 秒发出一个 Save All 命令,通过调用类似 IVsUIShell .PostExecCommand.
  • 我只想在最后一次更改后触发x 秒。 @EdDore
猜你喜欢
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多