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

本文关键字:导航 路径 代码 绑定 XAML Studio Visual 何快速 | 更新日期: 2023-09-27 17:57:44

我希望能够轻松地从XAML代码中导航:

  <Binding Path="Duration">

到属性的相应C#代码:

  public static DependencyProperty DurationProperty =
     DependencyProperty.Register("Duration", typeof(int), typeof(MainWindow));

我能做的最接近的事情似乎是转到包含代码的文件,然后我必须执行文本搜索。似乎应该有更好的方法。

答案可能已经出来了,但我还没有找到正确的关键词组合。

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

我看不出有任何方法可以做到这一点,因为绑定不是强类型引用,它只是要使用的属性的名称,除了您之外,没有人知道是哪个类定义了这个属性。尽管以Resharper为例,您可以使用navigate to member(IntelliJ模式中的ctrl+alt+shift+N)并在那里搜索Duration,但这将为您提供解决方案中定义Duration成员的所有类。

我怀疑这方面是否有任何生产准备,尽管有人可能会为Visual Studio编写一些特定的插件来处理一些案例。

只需将鼠标光标放在方法名称&点击F12

它会将您重定向到cs文件中定义的方法。

好吧,似乎没有标准(免费)的方法来做到这一点。但正如其他人所指出的,它只是一个带引号的字符串。因此,我用VB编写了一个小宏,并使用VS2010 macro/Add-in中的"技术将其粘贴到XAML代码编辑器的上下文菜单中;运行";以及";Run On";Visual Studio 2010 中的命令

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

然而,我仍在寻找更精确的东西。