本文来告诉大家 CanvasVirtualControl ,在什么时候使用这个控件。



在之前的入门教程win10 uwp win2d 入门 看这一篇就够了我直接用的是CanvasControl,实际上可以使用的画布还有下面两个

虽然本文主要告诉大家CanvasVirtualControl但是也是会告诉大家什么时候用哪个

CanvasAnimatedControl

如果使用 CanvasControl ,那么只会在一开始使用了 drawn ,如果需要重新更新就需要通过调用 Invalidate

如果有很多次调用 Invalidate 会自动合并为一次,所以不能把 Invalidate 调用数和 draw 触发数作为相等。

如果是为了做动画需要不停调用 Invalidate ,在 UWP 比较好的方法是使用 CanvasAnimatedControl 这个可以到每秒 60 帧,而且在用户设备比较差的时候会降低调用频率。

所以做动画的时候需要不停触发重新渲染就使用 CanvasAnimatedControl ,关于这个控件,请看win10 uwp 萤火虫效果

Win2D 中的游戏循环:CanvasAnimatedControl

CanvasVirtualControl

和 CanvasAnimatedControl 频繁重新画不相同的,在 CanvasVirtualControl 的使用范围是很少刷新

如果满足下面任何条件就建议使用 CanvasVirtualControl 而不是 CanvasControl 因为这时的性能比较好

  • 如果你准备画一个非常大的图片

  • 不希望使用很多时间去画看不见的部分

  • 不想把整个图片都放在内存

因为 CanvasVirtualControl 使用位图虚拟化,所以不需要在所有的时候都把位图放在内存中,只有在需要显示的地方才是有效的,存放在内存的,对于不显示的地方是不放在内存,不画出来的。

在一个原来不显示的地方变为显示时就会触发RegionsInvalidated事件,这时就可以画出这部分。

void OnRegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
{
foreach (var region in args.InvalidatedRegions)
{
using (var ds = sender.CreateDrawingSession(region))
{
// draw the region
}
}
}

所以通过这个方法就可以不需要手动去判断哪些是显示的,只要触发了,就是可以画出的。那么怎么知道触发的显示的矩形?实际上从args.InvalidatedRegions就是拿到一个 Rect ,通过这个就可以判断需要显示的是哪个。

很多时候使用 CanvasVirtualControl 都是和 ScrollViewer 一起使用

 <ScrollViewer>
<canvas:CanvasVirtualControl Width="10000" Height="10000" RegionsInvalidated="OnRegionsInvalidated" />
</ScrollViewer>

所以在滚动的时候就可以判断哪些需要显示,通过只画显示的来提高性能。

当然在页面大小变化或者 CanvasVirtualControl 需要修改大小,还是需要调用 invalidated 来重新画

void VirtualControl_SizeChanged(object sender, SizeChangedEventArgs e)
{
VirtualControl.Invalidate();
}

其他博客

win10 uwp win2d 入门 看这一篇就够了

win2d 毛玻璃:win10 uwp 毛玻璃

win2d 画出好看的图形

win10 uwp 萤火虫效果

win2d 图片水印

我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

最新文章

  1. Java 二叉树遍历右视图-LeetCode199
  2. [转] Struts2入门示例教程
  3. 项目学习——电力系统底层架构ssh
  4. 51nod1215 数组的宽度
  5. IOS开发之──应用之间调用(1)
  6. moment 和ko 绑定msdate格式的日期值(静态text)
  7. sql新手全套
  8. mysql server install
  9. 一个poi操作实现导出功能的类
  10. C++中将int转变成string和string转变成int
  11. idea编译器中maven项目获取路径的方法
  12. AngularJS高级程序设计读书笔记 -- 模块篇
  13. Java 面试总结(一) —— 面试常问的关键字总结
  14. Android自定义控件及自定义属性
  15. 提示缺少tns_admin的解决办法
  16. [bzoj2288][pojChallenge]生日礼物【贪心+堆+链表】
  17. HTTP的长连接(持久连接)和短连接
  18. Python 离线工作环境搭建
  19. Mac终端查看sqlite3数据库、表数据等(含sqlite可视化工具下载)
  20. 用MVC5+EF6+WebApi 做一个考试功能(六) 仓储模式 打造EF通用仓储类

热门文章

  1. CSS3--关于z-index不生效问题
  2. scroll 滚动到指定位置触发事件 and 点击一按钮/链接让页面定位在指定的位置
  3. 一个基于Asterisk构建的VOIP应用软件:Elastix介绍
  4. Directx11教程(8) 一个新的camera类
  5. oracle-Nomount
  6. 两篇论文之CNN中正交操作
  7. No PostCSS Config found解决办法
  8. [mysql]MySQL Daemon failed to start 2016-08-14 21:27 1121人阅读 评论(18) 收藏
  9. shared_ptr的线程安全性
  10. kubernetes1.3:操作Docker