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