使用VSPackage从Visual Studio工具窗口突出显示代码窗口文本

时间:2013-03-13 10:17:43

标签: c# visual-studio-2010 vs-extensibility vspackage

我对Visual Studio Extensions不熟悉。有没有办法从Visual Studio 2010工具窗口与代码窗口进行交互。 我在VisualStudio工具窗口上托管了一个Datagrid。 DataGrid包含ClassName,MethodName e.tc.点击className / MethodName需要实现以下

  1. 打开包含className / MethodName
  2. 的特定.cs文件
  3. HighLight特定的className / MethodName。
  4. 我知道这可以使用“IWpfTextView”类,但不知道如何。做了很多谷歌搜索,但徒劳无功。即使下面的链接仍未得到解答link

    非常感谢上述任何帮助。

2 个答案:

答案 0 :(得分:2)

我实际上做了几乎相同的事情。您可以在Visual Localizer上看到完整的源代码。

基本上你需要做两件事:

  1. 获取文件的IVsTextView实例
  2. 调用其SetSelection()方法,该方法将范围(起始行,结束行,起始列,结束列)作为参数。您可能还想调用EnsureSpanVisible()向下滚动。
  3. 获取IVsTextView也很容易。在我的项目(Visual Localizer)中有一个名为DocumentViewsManager的类,它位于VLlib / components中,它有一个相当简单的方法叫做GetTextViewForFile(),它只接受文件路径作为参数。它执行以下操作:

    1. 使用VsShellUtilities.IsDocumentOpen方法获取给定文件路径的IVsWindowFrame
    2. 将此传递给VsShellUtilities.GetTextView方法,该方法返回IVsTextView
    3. 希望它有所帮助。

答案 1 :(得分:0)

谢谢你。 我找到了另一种方法。

您需要使用“TextSelection”类来突出显示上面的代码行。

    foreach (CodeElement codeElement in projectItem.FileCodeModel.CodeElements)// search for the function to be opened
    {
        // get the namespace elements
        if (codeElement.Kind == vsCMElement.vsCMElementNamespace)
        {
            foreach (CodeElement namespaceElement in codeElement.Children)
            {
                // get the class elements
                if (namespaceElement.Kind == vsCMElement.vsCMElementClass || namespaceElement.Kind == vsCMElement.vsCMElementInterface)
                {
                    foreach (CodeElement classElement in namespaceElement.Children)
                    {
                        try
                        {
                            // get the function elements to highlight methods in code window
                            if (classElement.Kind == vsCMElement.vsCMElementFunction)
                            {
                                if (!string.IsNullOrEmpty(highlightString))
                                {
                                    if (classElement.Name.Equals(highlightString, StringComparison.Ordinal))
                                    {
                                        classElement.StartPoint.TryToShow(vsPaneShowHow.vsPaneShowTop, null);

                    classElement.StartPoint.TryToShow(vsPaneShowHow.vsPaneShowTop, null);

                        // get the text of the document
                     EnvDTE.TextSelection textSelection = window.Document.Selection as EnvDTE.TextSelection;

                        // now set the cursor to the beginning of the function
                        textSelection.MoveToPoint(classElement.StartPoint);
                        textSelection.SelectLine();

                                    }
                                }
                            }
                        }
                        catch
                        {
                        }
                    }
                }
            }
        }
    }