我正在尝试在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 Update 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。
答案 0 :(得分:1)
DTE.Find
对象是有状态的。当您调用Execute
方法时,它会将其状态刷新到查找对话框。换句话说,它不允许您在不执行搜索的情况下更改搜索选项。
搜索字词的设置是另一回事。在引擎盖下,有一个cmdidSetSearchCombo
(从内存中调用),只允许您设置搜索项,并在设置FindWhat
DTE.Find
字段时执行该命令。
作为一种变通方法,您可以使用控制字符执行搜索,以将设置刷新到对话框。我会使用\r\n
作为搜索字词,同时取消设置多行搜索选项,以确保找不到匹配项。毋庸置疑,这是一个黑客行为,如果其他所有方法都失败了你就应该诉诸于此,而你就要哭了。
您是否尝试在文本编辑器中进行搜索?编辑器通过MEF公开ITextSearchService2服务,这将允许您进行作用于单个文档的搜索,而无需与查找对话框进行交互。