1

我正在尝试在我的 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。

4

1 回答 1

1

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

搜索词的设置是另一回事。在幕后,有一个cmdidSetSearchCombo(从记忆中回忆)允许您只设置搜索词,并且当您设置FindWhat字段时执行该命令DTE.Find

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

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

于 2013-01-21T17:38:20.067 回答