當前位置:首頁 > IT技術 > Windows編程 > 正文

VisualStudio 調試時會不斷刷新 WPF 應用渲染
2021-09-10 18:10:51

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

在上一篇博客告訴大家,在 WPF 中更改 DrawingVisual 的 RenderOpen 用到的對象的內容將持續(xù)影響渲染效果,詳細請看 WPF 更改 DrawingVisual 的 RenderOpen 用到的對象的內容將持續(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 附加調試下的視覺效果如下圖,可以播放動畫

VisualStudio 調試時會不斷刷新 WPF 應用渲染_visualstudio

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

VisualStudio 調試時會不斷刷新 WPF 應用渲染_dotnet_02

如果在不附加調試時,有界面刷新時,那么依然還會動畫。如上圖,在鼠標在按鈕上時,此時按鈕界面需要刷新,于是觸發(fā)了渲染。在觸發(fā)渲染時,在收集的時候,重新拿到了 TranslateTransform 的值,矩形的渲染坐標更改

通過上面的例子可以看到,在附加 VisualStudio 調試時,界面將不斷觸發(fā)渲染,有時的動畫效果就是在附加 VisualStudio 調試時看起來才是對的,或者看起來不對。因此在編寫效果,需要在干掉 VisualStudio 調試看一下效果

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

可以通過如下方式獲取本文的源代碼,先創(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 文件夾

通過調試 VisualStudio 和 WPF 的源代碼可以了解到為什么在附加調試的時候將會不斷刷新

在 WPF 里面,大部分的界面刷新都由 MediaContext.PostRender 觸發(fā)。而 MediaContext.PostRender 函數(shù)在大部分依賴屬性變更的時候都會觸發(fā)(取決于依賴屬性的定義哈,是否要刷新界面或重新布局等)而可以認為大部分界面刷新也由依賴屬性變更而觸發(fā)

在 VisualStudio 2019 時,微軟給出了新功能,實時可視化樹調試。此工具有一個功能是附加到當前調試的窗口上,在調試的時候,給當前調試的應用添加一個工具欄或者加上調試使用的界面。此時調試的工具是注入到當前正在調試的應用的代碼實現(xiàn)的,此工具也是由 WPF 編寫的。剛好在 VisualStudio 調試器里面有這樣的邏輯,不斷更新調試的工具的某些依賴屬性。因為 VisualStudio 代碼是沒有開源的,我也不想去了解細節(jié),因此本文只是告訴大家 VisualStudio 有這個行為

在 VisualStudio 調試工具更新依賴屬性的時候,將會觸發(fā)元素的重新布局,從而觸發(fā) MediaContext.PostRender 方法,此時界面將會刷新。這就是為什么通過 VisualStudio 附加調試的時候,將會不斷刷新 WPF 渲染的原因

此問題在 GitHub 上也有小伙伴問,詳細請看 WriteableBitmap performance increase. · Issue #5246 · dotnet/wpf

?

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

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

開通會員,享受整站包年服務立即開通 >