win10 uwp win2d CanvasVirtualControl CanvasAnimatedControlCanvasVirtualControl其他博客

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

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

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

CanvasAnimatedControl

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

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

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

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

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();
}

其他博客

win2d 毛玻璃:win10 uwp 毛玻璃

win2d 画出好看的图形

win10 uwp 萤火虫效果

win2d 图片水印


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张高兴的博客

张高兴的 Xamarin.Forms 开发笔记:TapGestureRecognizer 的简单介绍与应用

13620
来自专栏木宛城主

ASP.NET MVC使用Bootstrap系列(3)——使用Bootstrap 组件

Bootstrap为我们提供了十几种的可复用组件,包括字体图标、下拉菜单、导航、警告框、弹出框、输入框组等。在你的Web Application中使用这些组件...

733100
来自专栏非著名程序员

基础篇章:关于 React Native 之 KeyboardAvoidingView 组件的讲解

友情提示:RN学习,从最基础的开始,大家不要嫌弃太基础,会的同学请自行略过,希望不要耽误已经会的同学的宝贵时间) 看完了这个组件的名字 KeyboardAvoi...

48050
来自专栏谦谦君子修罗刀

RN手势

React Native框架底层的手势响应系统提供了响应处理器,PanResponder API将这些手势响应处理器再次进行封装,便于开发者对手势进行处理。 ...

354120
来自专栏林德熙的博客

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

本文主要翻译,可能带有一定的主观性和局限性,说的东西可能不对或者不符合每个人的预期。如果觉得我有讲的不对的,就多多包含,或者直接关掉这篇文章,但是请勿生气或者发...

18420
来自专栏BestSDK

年薪30万的前端面试题,你能答对几道?|附答案

HTML面试题 1.XHTML和HTML有什么区别 HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言 最主要的不同: XHTML 元...

43260
来自专栏hbbliyong

Idea 常用功能汇总,工作中常用技巧,移出请说明原因,笔记花了好长时间汇总的

1.隐藏没用到的文件 比如 IDEA 的项目配置文件(.iml 和.idea),打开 Settings-File Types, 加入要隐藏的文件后缀。 ? 2...

28960
来自专栏张高兴的博客

张高兴的 Xamarin.Forms 开发笔记:TapGestureRecognizer 的简单介绍与应用

37870
来自专栏前端说吧

vue - v-model实现自定义样式の多选与单选

来不及研究为什么,我先直接在原来项目上赶紧建了一个test页面,先赶紧实现我的这种设想:

50410
来自专栏乐百川的学习频道

用WPF做一个简易浏览器

微软的WPF(Windows Presentation Foundation)是目前Windows平台上最好用的图形界面框架了。如果想在Windows平台上编写...

37550

扫码关注云+社区

领取腾讯云代金券