【问题标题】:Unable to set certain Find Options in VS 2012 Extension无法在 VS 2012 扩展中设置某些查找选项
【发布时间】:2013-01-21 17:29:47
【问题描述】:

我正在尝试在我的 VS2012 扩展中打开查找对话框,但我无法设置除查找文本以外的任何选项:

    var dte=(_DTE)Package.GetGlobalService(typeof(_DTE));
    dte.ExecuteCommand("Edit.Find");

    // this gets set:
    dte.Find.FindWhat="test";

    // but all others are ignored:
    dte.Find.Target=vsFindTarget.vsFindTargetSolution;
    dte.Find.MatchCase=false;
    dte.Find.MatchWholeWord=true;

我错过了什么吗?我正在使用 VS 2012 更新 1。


感谢 Ameen,我现在正在尝试一种不同的方法,但是我找不到任何关于在发出命令时需要如何设置参数的文档:

    object a=false;
    object b=null;
    dte.Commands.Raise(
      VSConstants.GUID_VSStandardCommandSet97.ToString("B").ToUpper(),
      (int)VSConstants.VSStd97CmdID.FindMatchCase, ref a, ref b);

这总是会给我一个 E_INVALIDARG。

【问题讨论】:

  • 这是 MEF 扩展吗?如果您使用的是 MPF 或本机扩展,在某些时候,您会收到带有 IServiceProvider 的调用 SetSite。使用该服务提供者为IOleCommandTarget 使用SUIHostCommandDispatch (see here] 的服务定义执行QueryService。然后调用该服务的Exec 方法而不是使用DTE 的raise 命令。DTE 经历了这么多让我畏缩的数据翻译层。
  • 对于使用我提到的方法的参数,使用CComVariant对象。

标签: visual-studio-2012 vspackage


【解决方案1】:

DTE.Find 对象是有状态的。当您在其上调用 Execute 方法时,它会将其状态刷新到查找对话框。换句话说,它不允许您在不执行搜索的情况下更改搜索选项。

搜索词的设置是另一回事。在后台,有一个cmdidSetSearchCombo(从内存中调用),它允许您只设置搜索词,并且当您设置DTE.FindFindWhat 字段时执行该命令。

作为一种解决方法,您可以使用控制字符执行搜索以将设置刷新到对话框中。我会使用\r\n 作为搜索词,同时取消设置多行搜索选项,以确保找不到匹配项。不用说这是一个 hack,如果所有其他方法都失败并且你快哭了,你应该求助于这个。

您是否尝试在文本编辑器中进行搜索?编辑器通过 MEF 公开 ITextSearchService2 服务,这将允许您执行范围为单个文档的搜索,而无需与查找对话框交互。

【讨论】:

  • 对话框中的选项对应于“在文件中查找”而不是“快速查找”。编辑器中的小 UI 显示“快速查找”选项。您正在执行的代码很可能会尝试为小型 UI 设置选项。尝试将Find.Target 属性设置为vsFindTargetSolution,看看是否能解决问题。
  • 不走运,显然它无法从扩展程序访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
相关资源
最近更新 更多