在 VisualStudio 附加調(diào)試和沒有用 VisualStudio 附加調(diào)試時,對應(yīng)用程序是有不同的影響,如 VisualStudio 設(shè)計器將會在附加調(diào)試 WPF 應(yīng)用的時候,不斷刷新 WPF 應(yīng)用的渲染。也就是說,如果你覺得界面視覺效果不對或者對,也許可以甩鍋到 VisualStudio 上
在上一篇博客告訴大家,在 WPF 中更改 DrawingVisual 的 RenderOpen 用到的對象的內(nèi)容將持續(xù)影響渲染效果,詳細請看 WPF 更改 DrawingVisual 的 RenderOpen 用到的對象的內(nèi)容將持續(xù)影響渲染效果
通過以下簡單的邏輯可以實現(xiàn)一個矩形動畫的功能
private async void SetTranslateTransform(TranslateTransform translateTransform)
{
while (true)
{
translateTransform.X++;
if (translateTransform.X > 700)
{
translateTransform.X = 0;
}
await Task.Delay(TimeSpan.FromMilliseconds(10));
}
}
在 VisualStudio 附加調(diào)試下的視覺效果如下圖,可以播放動畫
然而有趣的是,在 VisualStudio 不附加調(diào)試的時候,可以發(fā)現(xiàn)界面不動了,如下圖。下圖非靜止圖片哦
如果在不附加調(diào)試時,有界面刷新時,那么依然還會動畫。如上圖,在鼠標(biāo)在按鈕上時,此時按鈕界面需要刷新,于是觸發(fā)了渲染。在觸發(fā)渲染時,在收集的時候,重新拿到了 TranslateTransform 的值,矩形的渲染坐標(biāo)更改
通過上面的例子可以看到,在附加 VisualStudio 調(diào)試時,界面將不斷觸發(fā)渲染,有時的動畫效果就是在附加 VisualStudio 調(diào)試時看起來才是對的,或者看起來不對。因此在編寫效果,需要在干掉 VisualStudio 調(diào)試看一下效果
本文所有代碼放在 github 和 gitee 歡迎小伙伴訪問
可以通過如下方式獲取本文的源代碼,先創(chuàng)建一個空文件夾,接著使用命令行 cd 命令進入此空文件夾,在命令行里面輸入以下代碼,即可獲取到本文的代碼
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 2af349867a6e6da136e5bc068357877f38788216
以上使用的是 gitee 的源,如果 gitee 不能訪問,請?zhí)鎿Q為 github 的源
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
獲取代碼之后,進入 KebelrafoRalneanarjeargi 文件夾
通過調(diào)試 VisualStudio 和 WPF 的源代碼可以了解到為什么在附加調(diào)試的時候?qū)粩嗨⑿?/p>
在 WPF 里面,大部分的界面刷新都由 MediaContext.PostRender
觸發(fā)。而 MediaContext.PostRender
函數(shù)在大部分依賴屬性變更的時候都會觸發(fā)(取決于依賴屬性的定義哈,是否要刷新界面或重新布局等)而可以認(rèn)為大部分界面刷新也由依賴屬性變更而觸發(fā)
在 VisualStudio 2019 時,微軟給出了新功能,實時可視化樹調(diào)試。此工具有一個功能是附加到當(dāng)前調(diào)試的窗口上,在調(diào)試的時候,給當(dāng)前調(diào)試的應(yīng)用添加一個工具欄或者加上調(diào)試使用的界面。此時調(diào)試的工具是注入到當(dāng)前正在調(diào)試的應(yīng)用的代碼實現(xiàn)的,此工具也是由 WPF 編寫的。剛好在 VisualStudio 調(diào)試器里面有這樣的邏輯,不斷更新調(diào)試的工具的某些依賴屬性。因為 VisualStudio 代碼是沒有開源的,我也不想去了解細節(jié),因此本文只是告訴大家 VisualStudio 有這個行為
在 VisualStudio 調(diào)試工具更新依賴屬性的時候,將會觸發(fā)元素的重新布局,從而觸發(fā) MediaContext.PostRender
方法,此時界面將會刷新。這就是為什么通過 VisualStudio 附加調(diào)試的時候,將會不斷刷新 WPF 渲染的原因
此問題在 GitHub 上也有小伙伴問,詳細請看 WriteableBitmap performance increase. · Issue #5246 · dotnet/wpf
?
本作品采用知識共享署名-非商業(yè)性使用-相同方式共享 4.0 國際許可協(xié)議進行許可。歡迎轉(zhuǎn)載、使用、重新發(fā)布,但務(wù)必保留文章署名林德熙,不得用于商業(yè)目的,基于本文修改后的作品務(wù)必以相同的許可發(fā)布。如有任何疑問,請與我
本文摘自 :https://blog.51cto.com/u