2

我对 Visual Studio Extensions 很陌生。有没有办法从 Visual Studio 2010 工具窗口与代码窗口交互。我在 VisualStudio 工具窗口上托管了一个 Datagrid。DataGrid 包含 ClassName、MethodName 等。点击className/MethodName需要达到以下

  1. 打开包含 className/MethodName 的特定 .cs 文件
  2. 突出显示特定的类名/方法名。

我知道使用“IWpfTextView”类可以实现这一点,但不确定如何。做了很多谷歌搜索但徒劳无功。即使下面的链接仍然是未回答的链接

对上述任何帮助将不胜感激。

4

2 回答 2

2

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

基本上你需要做两件事:

  1. 获取文件的 IVsTextView 实例
  2. 调用它的 SetSelection() 方法,该方法将范围(起始行、结束行、起始列、结束列)作为参数。您可能还想调用 EnsureSpanVisible() 向下滚动。

获取 IVsTextView 也很容易。在我的项目(Visual Localizer)中,有一个名为 DocumentViewsManager 的类,位于 VLlib/components 中,它有一个相当简单的方法,称为 GetTextViewForFile(),它只接受文件路径作为参数。它执行以下操作:

  1. 使用 VsShellUtilities.IsDocumentOpen 方法获取给定文件路径的 IVsWindowFrame
  2. 将此传递给 VsShellUtilities.GetTextView 方法,该方法返回 IVsTextView

希望能帮助到你。

于 2013-03-21T19:09:48.507 回答
0

谢谢cre8or。我找到了另一种方法来做同样的事情。

您需要使用“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
                        {
                        }
                    }
                }
            }
        }
    }
于 2013-04-16T13:30:33.330 回答