这篇主要讲讨论ScrollViewer的一部分

当一个元素高度过高时

1.单元素

左侧Button高度300,右侧是600,右侧的Button外部有一个ScrollViewer

    <Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Button Content="Test1"></Button><ScrollViewer Grid.Column="1"><Button Content="Test1" Height="600"></Button></ScrollViewer></Grid>

2.集合容器即StackPanel,上篇已经演示过

不管往ScrollViewer放什么元素,只要高度过高,都会出现ScrollBar供拖拉,这种机制即是我们要所要了解的.

我们来看下生成的VisualTree

逻辑树与视觉树

从逻辑树上来看Button的父元素是ScrollViewer,而视觉树的父元素则是ScrollContentPresenter.

通过ScrollBar移位单容器和列表的

我们新建一个ListBox控件,现在点ScrollBar最下面的箭头,会发现每点下,元素会向下移动一位

如果是单个元素的话,比如Button,每次位移的高度与ListBox则会不同.

以此我们可以看到WPF内部实现了这些逻辑。如何实现ScrollBar拖拉将是我们关注的重点

IScrollInfo

这个接口实现了所有一个用ScrollBar操作一个元素的所有方法

实现IScrollInfo接口的类

  1. ScrollContentPresenter 其是提供操作单元素的一个实现,放在ScrollViewer的内部模板内,所以很幸运,所以放在ScrollViewer内部的控件都将得到默认的支持
  2. StackPanel 你肯定没想到StackPanel 也实现了这个接口,那么为什么当高度超出时,并没有出现ScrollBar呢?

IScrollInfo必须与ScrollViewer结合使用,ScrollViewer内部会判断其内部元素有无实现IScrollInfo的元素,如果有则会去调用其方法.而脱离了ScrollViewer,其无法发挥作用

视觉树越少越好

用最少的视觉树满足当前UI的显示,这是最优化目标

显然在ListBox显示20个元素,而在视觉树上有100个元素,则造成80个元素的浪费存储,所以WPF提供了一个VirtualizingStackPanel,即使绑定了10000个元素,而在视觉树中则存有少数的元素,这样便不会拖垮系统的整体性能了.

转载于:https://www.cnblogs.com/Clingingboy/archive/2010/10/19/1855509.html

WPF/Sliverlight ScrollViewer与Panel(2)相关推荐

  1. WPF基础入门3 - Panel和 Canvas基本使用

    一 Panel WPF的布局控件都从System.Windows.Controls.Panel基类继承: Pane类的公共属性很多:例如, Cursor 获取或设置在鼠标指针位于此元素上时显示的光标. ...

  2. WPF实现ScrollViewer平滑滚动效果

    WPF实现滚动条只要在控件外围加上ScrollViewer即可,但是滚动的时候没有动画效果,比较生硬,在滚动的时候添加过渡动画实现平滑滚动能给我们的软件增色不少. 接下来,在上一篇博客(WPF使用Fl ...

  3. WPF 实现ScrollViewer的垂直偏移滚动跳转

    问题:考虑屏幕大小,一般都是会在表单问卷的页面使用ScrollViewer.问卷中问题漏填漏选时,在提交时校验不过,需要滚动跳转至漏填漏选项. 页面如下: 每个选项使用StackPanel,并对复选框 ...

  4. 微软XAML Studio - WPF, Sliverlight, Xamarin, UWP等技术开发者的福音

    最近又在继续倒腾 WPF 的项目,继续使用 Caliburn.Micro 和 Xceed 来堆代码.每次调试xaml上的binding,都有种要疯的赶脚. 今天路过 https://channel9. ...

  5. 让 ScrollViewer 的滚动带上动画

    让 ScrollViewer 的滚动带上动画 原文:让 ScrollViewer 的滚动带上动画 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.欢迎转载. ...

  6. 分享Silverlight/WPF/Windows Phone一周学习导读(3月1日-3月5日)

    休假一个月,没有更新Silverlight/WPF/Windows Phone学习导读.从本周开始继续分享每周最新的Silverlight/WPF/Windows Phone开发学习导读. 本周Sil ...

  7. WPF 表格控件 ReoGrid 的简单使用

    WPF 表格控件 ReoGrid 的简单使用 目录 一.概述 二.安装 三.添加控件 四.加载 Excel 五.属性设置 六.支持触摸滚动 七.其它操作 1.显示和隐藏列 2.显示特定字体 八.资源链 ...

  8. 解决VS2019中.net core WPF 暂时无法使用 Designer 的临时方法

    目录 解决 VS2019 中.net core WPF 暂时无法使用 Designer 的临时方法 安装 vs 2019 professional/enterprise版本 在vs的设置里,勾选.NE ...

  9. 分享Silverlight/WPF/Windows Phone一周学习导读

    分享Silverlight/WPF/Windows Phone一周学习导读 本周Silverlight学习资源更新: SilverLight日历控件如何获得多语言的支持 银光中国网 Silverlig ...

最新文章

  1. 利用OpenCV实现基于深度学习的超分辨率处理
  2. Java学习笔记(六)--字符串String类
  3. shiro整合ehcache
  4. Linux shell程序一
  5. Jenkins安装入门
  6. Java命令行界面(第5部分):JewelCli
  7. Azure IoT带来更高效的新能源生产和会看人脸色的无人超市
  8. 【渝粤教育】电大中专成本会计作业 题库
  9. 俄罗斯方块java代码_java的俄罗斯方块代码
  10. 如何下载官方windows10的ios镜像文件
  11. Android基于串口通讯笔记(USB,485协议,232协议)
  12. Maya---捕捉命令
  13. visual studio fatal error C1083: 无法打开源文件
  14. APP性能测试——内存测试
  15. Skype、MSN/Live Messenger、Lync全面整合
  16. 从WinMain函数看Windows程序内部运行机制
  17. 微软输入法自动导入小鹤双拼
  18. linux指令查询ip地址
  19. sparse_categorical_crossentropy的使用
  20. osChina.net工具

热门文章

  1. 如何构建数据指标体系?
  2. 盘点抖音及今日头条的优化推广方法有哪些?
  3. 安卓电子市场_关于安卓手机发展史你知道多少?原来最早安卓居然不是手机系统!...
  4. tomcat 7 mysql,Tomcat 七设置mysql数据源
  5. python解决单调栈问题
  6. pycharm的项目文件中包括什么_一个完整的项目管理流程包括什么?
  7. ubuntu ifconfig_VirtualBox中ubuntu的LAMP项目(温度采集)
  8. Spark in action on Kubernetes - 存储篇(一)
  9. 深度学习(deep learning)优化调参细节(trick)
  10. VINS-Mono代码分析与总结(完整版)