在Visual Studio中,如何快速从XAML绑定路径导航到相应的代码?

问题描述

| 我希望能够轻松地从XAML代码导航:
  <Binding Path=\"Duration\">
属性的相应C#代码
  public static DependencyProperty DurationProperty =
     DependencyProperty.Register(\"Duration\",typeof(int),typeof(MainWindow));
我似乎最能做的就是转到包含代码文件,然后我必须执行文本搜索。似乎应该有更好的方法。 答案可能已经存在,但是我还没有找到正确的关键词组合。     

解决方法

由于绑定不是强类型引用,因此我看不到任何方法,它只是要使用的属性的名称,除了您知道哪个类定义了此属性之外,没有人可以使用。尽管例如使用Resharper,您可以使用
navigate to member
(在IntelliJ模式中为ctrl + alt + shift + N)并在其中搜索
Duration
,但这将为您提供定义
Duration
成员的解决方案中的所有类。 我怀疑这方面是否有任何准备就绪的产品,尽管有人可能会为Visual Studio写一些特定的插件来处理某些情况。     ,只需将鼠标光标放在方法名称上,然后按
F12
。 它会将您重定向到
cs
文件中定义的方法。     ,好吧,似乎没有标准的(免费)方法可以做到这一点。但正如其他人指出的那样,它只是带引号的字符串。因此,我在VB中编写了一个小宏,并使用Visual Studio 2010中“运行”和“运行”命令的VS2010宏/外接程序中发现的技术,将其粘贴到XAML代码编辑器的上下文菜单中
Option Strict Off
Option Explicit Off
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

\' This is intended to be used as a quick & dirty \"go to definition\" for
\' properties referenced in XAML. The idea is that you have something like:
\'
\'  <Binding Path=\"InterestRate\">
\'
\' You click on the name and run the macro which looks for the current word
\' in quotes (\"InterestRate\") which should match on something like:
\'
\' MainWindow.xaml.cs(41):  DependencyProperty.Register(\"InterestRate\",...
\'
Public Module QuotedSearch
    Sub DoQuotedSearch()
        Dim Pattern As String
        DTE.ExecuteCommand(\"Edit.SelectCurrentWord\")
        Pattern = \"\"\"\" & DTE.ActiveDocument.Selection.Text & \"\"\"\"
        DTE.ExecuteCommand(\"Edit.FindinFiles\")
        DTE.Find.FindWhat = Pattern
        DTE.Find.Target = vsFindTarget.vsFindTargetFiles
        DTE.Find.MatchCase = True
        DTE.Find.MatchWholeWord = False
        DTE.Find.MatchInHiddenText = True
        DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxLiteral
        DTE.Find.SearchPath = \"Current Project\"
        DTE.Find.SearchSubfolders = True
        DTE.Find.FilesOfType = \"*.*\"
        DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResults1
        DTE.Find.Action = vsFindAction.vsFindActionFindAll
        If (DTE.Find.Execute() = vsFindResult.vsFindResultNotFound) Then
            Throw New System.Exception(\"vsFindResultNotFound\")
        End If
    End Sub
End Module
但是,我仍在寻找更精确的方法。