點擊藍字“大白技術控”關注我喲
加個“星標★”,每日良時,好文必達!
WPF中的Data 如何Debug?
大家平時做WPF開發,相信用 的小伙伴比較多。XAML代碼曾經在某些特殊版本的 中是可以加斷點進行調試的,不過目前多數版本都不支持在XAML加斷點來調試。
那如果自己需要綁定的 沒生效,該怎么去檢測或Debug排查問題呢?下面大白給出幾種自己用過的方法,本人的開發環境是 Win10專業版x64 + 2019專業版v16.2.2,以下內容中給出了詳細步驟的方法都親測有效。
方法1: 修改注冊表 + 修改文件
在注冊表中增加一個選項,
具體做法是,在目錄\\中創建文件夾, 然后在其里面創建子文件夾WPF安裝vs2015時功能選擇,然后新建一個DWORD(32位)值,將其值設置為1.
注冊表
也可以將下面的文件另存為 trace.reg,然后雙擊進行設置。
Windows Registry Editor Version 5.00
[ ]
"ManagedTracing"=dword:00000001
接下來,需要在你的的能影響 .exe.生成的那個 .文件下加入折疊區域的內容:
App.
由于我這邊相關的文件就是App.,所以只需在App.中加入該內容。
圖中折疊的部分如下:
<system.diagnostics>
<sources>
<source name="System.Windows.Data" switchName="BindingSwitch" >
<listeners>
<add name="BindingTextListener" />
listeners>
source>
<source name="System.Windows.DependencyProperty" switchName="BindingSwitch" >
<listeners>
<add name="BindingTextListener" />
listeners>
source>
<source name="System.Windows.Freezable" switchName="BindingSwitch" >
<listeners>
<add name="BindingTextListener" />
listeners>
source>
<source name="System.Windows.RoutedEvent" switchName="BindingSwitch" >
<listeners>
<add name="BindingTextListener" />
listeners>
source>
<source name="System.Windows.Media.Animation" switchName="BindingSwitch" >
<listeners>
<add name="BindingTextListener" />
listeners>
source>
<source name="System.Windows.NameScope" switchName="BindingSwitch" >
<listeners>
<add name="BindingTextListener" />
listeners>
source>
<source name="System.Windows.ResourceDictionary" switchName="BindingSwitch" >
<listeners>
<add name="BindingTextListener" />
listeners>
source>
<source name="System.Windows.Markup" switchName="BindingSwitch" >
<listeners>
<add name="BindingTextListener" />
listeners>
source>
<source name="System.Windows.Documents" switchName="BindingSwitch" >
<listeners>
<add name="BindingTextListener" />
listeners>
source>
sources>
<switches>
<add name="BindingSwitch" value="All" />
switches>
<sharedListeners>
<add name="BindingTextListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="BindingTrace.log" />
<add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false"/>
<add name="BindingXmlListener" type="System.Diagnostics.XmlWriterTraceListener" traceOutputOptions="None" initializeData="BindingTrace.xml" />
sharedListeners>
<trace autoflush="true" indentsize="4">trace>
system.diagnostics>
設置好后,你build這個wpf項目后,當啟動Debug時,在其相應的debug目錄下會多出一個 .log文件,比如, 我這邊的內容上這樣的:
WPF -日志文件
我配置監聽器()時,將debug的信息設置成了.log格式,與.txt格式相比其優勢是: 當用vs code打開時,自帶高亮,看起來比較爽。
<add name="BindingTextListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="BindingTrace.log" />
當然也有小伙伴希望將Trace信息導出為xml,也可以的,只需將加入內容開頭部分的:
<source>
<listeners>
<add name="BindingTextListener" />
listeners>
source>
改為:
<source name="System.Windows.Data" switchName="BindingSwitch" >
<listeners>
<add name="BindingXmlListener" />
listeners>
source>
即可。
那么,此時在其相應的debug目錄下會多出一個 .xml文件,我這邊的內容上這樣的:
.xml
參考:
WPF | Debug
45- · /old-wpf-blog
方法2: 在XAML中設置 + 在xaml中需要debug的View對應的 .xaml.cs文件中啟用WPF Trace
該方法適用于 .NET 3.5以后(包括 .NET core)的WPF .
首先需要給該View的xaml文件的某個節點加入rces.="High",
"CaliburnMicro_Calculator.Views.CalculatorView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CaliburnMicro_Calculator.Views"
xmlns:cal="http://www.caliburnproject.org"
mc:Ignorable="d"
Width="240">
我這邊直接在這個view的根節點中加入rces.="High",結果如下:
"CaliburnMicro_Calculator.Views.CalculatorView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CaliburnMicro_Calculator.Views"
xmlns:cal="http://www.caliburnproject.org"
mc:Ignorable="d"
Width="240" PresentationTraceSources.TraceLevel="High">
此時,我們還需要在目標View的對應的 .xaml.cs文件中啟用WPF Trace.
// Enable WPF tracing
PresentationTraceSources.Refresh();
PresentationTraceSources.DataBindingSource.Listeners.Add(new ConsoleTraceListener());
PresentationTraceSources.DataBindingSource.Switch.Level = SourceLevels.All;
此時,在(輸出窗口)就可以看到數據綁定的相關信息了。
窗口
可能有人會好奇中的紅色字體是怎么來的,vs的默認是黑色。
其實安裝一個vs插件就好了,傳送門:
.
當然,你還可以在此時啟用"診斷工具",位置是:調試 -> 窗口 -> 顯示診斷工具安裝vs2015時功能選擇,配合起來用起來更爽喔~
VS中顯示診斷工具方法3: 2019 (16.4之后的版本)安裝 XAML
這個VS插件由微軟XAML團隊推出,看起來像是實現了方法1或方法2的自動化。
XAML for 2019 下載地址:
相關代碼已開源:
/xaml--tool: XAML error in a 2019
當安裝好這個插件時,重啟VS就可以用了,debug時,調試窗口中會多一個選項"XAML ()"。點擊該選項,debug相關窗口中會顯示Data 的詳細信息。
XAML ()
此時,WPF trace level附近的...還可以點擊進行設置。
XAML 插件 設置方法4: 使用第三方debug工具
首推Snoop,這個工具大概2006年就出來了,歷史悠久,最初由微軟Blend團隊的Pete Blois開發,功能也異常強大,而且目前也一直有Cory 等人負責維護和更新。
Snoop主界面
左上角支持,屬性或層級很多時,可以快速定位目標節點。
Snoop中的Tree, , Data 均支持(過濾搜索),而和Data 都可以打斷點。
當某個屬性的值改變時,整個屬性的背景更改為黃色高亮一秒鐘,以吸引用戶注意。
Snoop允許你查看您在應用程序中指定的事件列表。當你單擊元素時,你可以看到哪些元素受到影響,并查看哪個(方法或任何人)處理了該點擊。的事件以綠色顯示。這是Snoop提供的查看隧道和事件冒泡傳遞之間的區別的強有力方法,特別是當這些事件處理得太快或根本不處理,它們如何影響您的可視化元素。
當出現 error時,可以選擇應用程序右側的屬性,然后右鍵單擊以深入了解綁定或綁定表達式,以便給出更詳細的錯誤說明。
在Snoop的左上角,有一個下拉框可以打開,然后選擇"Show only with "以查看應用程序所具有的可視數據綁定錯誤列表。
設置"Show only with "
Snoop 的一個眾所周知的功能是能夠識別數據綁定問題。當看到組件是否綁定正確時,我通常只是嘗試一下,看看它是否有效。如果無效,我轉向 調試模式下的窗口。如果無法立即看到該值,我會這樣做:將 Snoop 附加()到我的應用,并從應用程序樹視圖上方的搜索/篩選器欄中選擇"Show only with "選項。
和Debug的步驟如下:
然后在snoop上依次點:
按鈕, Snoop按鈕(望遠鏡),借助找需要的目標元素,接下來 debug就比較順暢了。
還可以使用它來顯示任何具有綁定錯誤( error)的控件(就像word中的拼寫檢查一樣):
Snoop 中的綁定錯誤會紅色高亮顯示
也有小伙伴在用或WPF ,不過這個工具好久沒更新了。
WPF 這個項目之前是在上的,后來沒人維護了,目前有人手動fork到上,但沒見任何更新。
還有小伙伴用 Mole這個 插件,對于這個插件,Snoop的維護者Cory 等人也有參與喔,有興趣的朋友可以去試試~
Mole for 插件下載:
Mole for VS 2015 is from the
.
Mole for VS 2017 is from the
.
Mole for VS 2019 is from the
.
mole其他方法:
這兩種方法本人不太熟悉,有興趣的可以自己找相關資料去試試哈~有問題歡迎留言交流~
End
歡迎各位讀者加入.NET技術交流群,在公眾號后臺回復“加群”或者“學習”即可。
文末彩蛋微信后臺回復“asp”,給你:一份全網最強的ASP.NET學習路線圖。
回復“cs”,給你:一整套 C# 和 WPF 學習資源!
回復“core”,給你:2019年大會上發布的.NET core 3.0學習視頻!
回復“so”,給你:一套給力的 超級搜索力視頻 課程!
轉發至朋友圈,是對我最大的支持。