在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));
我能做的最接近的事情似乎是转到包含代码的文件,然后我必须执行文本搜索。似乎应该有更好的方法。
答案可能已经出来了,但我还没有找到正确的关键词组合。
我看不出有任何方法可以做到这一点,因为绑定不是强类型引用,它只是要使用的属性的名称,除了您之外,没有人知道是哪个类定义了这个属性。尽管以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
然而,我仍在寻找更精确的东西。