當(dāng)前位置:首頁 > IT技術(shù) > Windows編程 > 正文

VisualStudio 調(diào)試時(shí)會(huì)不斷刷新 WPF 應(yīng)用渲染
2021-09-10 18:10:51

在 VisualStudio 附加調(diào)試和沒有用 VisualStudio 附加調(diào)試時(shí),對應(yīng)用程序是有不同的影響,如 VisualStudio 設(shè)計(jì)器將會(huì)在附加調(diào)試 WPF 應(yīng)用的時(shí)候,不斷刷新 WPF 應(yīng)用的渲染。也就是說,如果你覺得界面視覺效果不對或者對,也許可以甩鍋到 VisualStudio 上

在上一篇博客告訴大家,在 WPF 中更改 DrawingVisual 的 RenderOpen 用到的對象的內(nèi)容將持續(xù)影響渲染效果,詳細(xì)請看 WPF 更改 DrawingVisual 的 RenderOpen 用到的對象的內(nèi)容將持續(xù)影響渲染效果

通過以下簡單的邏輯可以實(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í)會(huì)不斷刷新 WPF 應(yīng)用渲染_visualstudio

然而有趣的是,在 VisualStudio 不附加調(diào)試的時(shí)候,可以發(fā)現(xiàn)界面不動(dòng)了,如下圖。下圖非靜止圖片哦

VisualStudio 調(diào)試時(shí)會(huì)不斷刷新 WPF 應(yīng)用渲染_dotnet_02

如果在不附加調(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í)看起來才是對的,或者看起來不對。因此在編寫效果,需要在干掉 VisualStudio 調(diào)試看一下效果

本文所有代碼放在 githubgitee 歡迎小伙伴訪問

可以通過如下方式獲取本文的源代碼,先創(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 不能訪問,請?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ì)請看 WriteableBitmap performance increase. · Issue #5246 · dotnet/wpf

?

VisualStudio 調(diào)試時(shí)會(huì)不斷刷新 WPF 應(yīng)用渲染_visualstudio_03
本作品采用知識(shí)共享署名-非商業(yè)性使用-相同方式共享 4.0 國際許可協(xié)議進(jìn)行許可。歡迎轉(zhuǎn)載、使用、重新發(fā)布,但務(wù)必保留文章署名林德熙,不得用于商業(yè)目的,基于本文修改后的作品務(wù)必以相同的許可發(fā)布。如有任何疑問,請與我

本文摘自 :https://blog.51cto.com/u

開通會(huì)員,享受整站包年服務(wù)立即開通 >