【发布时间】:2015-12-11 11:26:43
【问题描述】:
场景
我希望仅当插入符号位于 Xml 注释块中时才在自定义菜单中启用命令
''' ... If caret is here, in a Vb.Net Xml comment block.
或
/// ... If caret is here, in a C# Xml comment block.
然后,预期结果的伪代码:
C#:
private void CmdExample_BeforeQueryStatus(object sender, EventArgs e) {
// Enable this command only if the caret is in a Xml comment block.
((OleMenuCommand)sender).Enabled = IsCaretInXmlComment?();
}
Vb:
Private Sub CmdExample_BeforeQueryStatus(ByVal sender As Object, ByVal e As EventArgs) _
Handles cmdExample.BeforeQueryStatus
' Enable this command only if the caret is in a Xml comment block.
DirectCast(sender, OleMenuCommand).Enabled = IsCaretInXmlComment?()
End Sub
问题
只是,我怎么能做到呢?在 Vb.Net 或 C# 中。
研究
我不知道该怎么做,所以我对 vsCMElement 枚举的值进行了反复试验,因为我看到了类似的 here,但是CodeElement2.Kind 属性总是抛出 NullReferenceException。
C#:
TextPoint tp =
((TextSelection)MyDte.ActiveDocument.Selection).ActivePoint;
CodeElement2 ce =
MyDte.ActiveDocument.ProjectItem.FileCodeModel.
CodeElementFromPoint(tp, vsCMElement.vsCMElementOther);
Vb:
Dim tp As TextPoint =
CType(MyDte.ActiveDocument.Selection, TextSelection).ActivePoint
Dim ce As CodeElement2 =
MyDte.ActiveDocument.ProjectItem.FileCodeModel.
CodeElementFromPoint(tp, vsCMElement.vsCMElementOther)
我也发现了这个 question,但是没有说明性的代码示例,我对此非常迷茫。
【问题讨论】:
-
引导答案的两个问题:您要使用哪种语言进行检测?即,如果打开,什么类型的文件很重要?另外,您需要针对的 Visual Studio 最低版本是多少?
-
@Jason Malinowski 感谢您的评论。我正在 Vb.Net 中开发扩展,这里是安装程序:visualstudiogallery.msdn.microsoft.com/…,这里是源代码:mediafire.com/download/kih2744ii5il1rf/…,但是我可以翻译 C# 示例。该扩展应适用于 Vb 和 C# 注释块检测。什么类型的文件?:当然是 Vb 和 C# 源文件,并且仅适用于当前代码编辑器窗口中的活动文档(并非所有打开的文档)。我的目标是 Visual Studio 2013 SDK。
-
检测活动文档及其语言是我过去解决的问题,我只需要帮助确定插入符号位置是否在 VB.Net 或 C# 类型的 XML 注释块中,活动文档文件的类型真的无关紧要,我更愿意对此进行任何过滤,因为无论出于何种原因,文本文件 (.txt) 都可能包含带有 xml cmets 的 VB 或 C# 的代码示例。
-
我忘了提到我正在寻找一种比从插入符号位置获取线更一致的方法,修剪线,然后检测前三个字符是“'''”还是“ ///”。我想检测该块是否是完全限定的 Xml 注释块(这意味着,带有开始和结束 xml 标记)
-
您仍然希望定位的最低版本是 2012 年?既然 Roslyn 在那里,这在 2015 年更容易,但这会破坏兼容性。
标签: c# .net vb.net visual-studio-extensions visual-studio-sdk