设为首页
优惠IDC
收藏本站
六狼博客
六狼论坛
开启辅助访问
切换到窄版
用户名
Email
自动登录
找回密码
密码
登录
立即注册
只需一步,快速开始
只需一步,快速开始
快捷导航
门户
首页
BBS
云计算
大数据
手机
移动开发android,ios,windows phone,windows mobile
编程
编程技术java,php,python,delphi,ruby,c,c++
前端
WEB前端htmlcss,javascript,jquery,html5
数据库
数据库开发Access,mysql,oracle,sql server,MongoDB
系统
操作系统windows,linux,unix,os,RedHat,tomcat
架构
项目管理
软件设计,架构设计,面向对象,设计模式,项目管理
企业
服务
运维实战
神马
搜索
搜索
热搜:
php
java
python
ruby
hadoop
sphinx
solr
ios
android
windows
centos
本版
帖子
用户
六狼论坛
»
首页
›
编程技术
›
MicroSoft
›
WPF
›
WPF中实现自定义虚拟容器(实现VirtualizingPanel) ...
返回列表
查看:
325
|
回复:
0
WPF中实现自定义虚拟容器(实现VirtualizingPanel)
[复制链接]
Taly.W.Y
Taly.W.Y
当前离线
积分
70
窥视卡
雷达卡
升级
13.33%
当前用户组为
秀才
当前积分为
70
, 升到下一级还需要 130 点。
20
主题
20
主题
20
主题
秀才
秀才, 积分 70, 距离下一级还需 130 积分
秀才, 积分 70, 距离下一级还需 130 积分
积分
70
发消息
楼主
|
发表于 2013-1-3 15:35:37
|
显示全部楼层
|
阅读模式
<div id="cnblogs_post_body">
在WPF应用程序开发过程中,大数据量的数据展现通常都要考虑性能问题。有下面一种常见的情况:原始数据源数据量很大,但是某一时刻数据容器中的可见元素个数是有限的,剩余大多数元素都处于不可见状态,如果一次性将所有的数据元素都渲染出来则会非常的消耗性能。因而可以考虑只渲染当前可视区域内的元素,当可视区域内的元素需要发生改变时,再渲染即将展现的元素,最后将不再需要展现的元素清除掉,这样可以大大提高性能。在WPF中System.Windows.Controls命名空间下的
VirtualizingStackPanel
可以实现数据展现的虚拟化功能,ListBox的默认元素展现容器就是它。但有时
VirtualizingStackPanel
的布局并不能满足我们的实际需要,此时就需要实现自定义布局的虚拟容器了。本文将简单介绍容器自定义布局,然后介绍实现虚拟容器的基本原理,最后给出一个虚拟化分页容器的演示程序。
一、WPF中自定义布局 (已了解容器自定义布局的朋友可略过此节)
通常实现一个自定义布局的容器,需要继承System.Windows.Controls.Panel, 并重写下面两个方法:
MeasureOverride
&mdash;&mdash; 用来测量子元素期望的布局尺寸
ArrangeOverride
&mdash;&mdash; 用来安排子元素在容器中的布局。
下面用一个简单的SplitPanel来加以说明这两个方法的作用。下面的Window中放置了一个SplitPanel,每点击一次&ldquo;添加&rdquo;按钮,都会向SplitPanel中添加一个填充了随机色的Rectangle, 而SplitPanel中的Rectangle无论有几个,都会在垂直方向上布满容器,水平方向上平均分配宽度。
实现代码如下:
<div class="cnblogs_code" >
SplitPanel <div id="cnblogs_code_open_860f43bc-6b22-42d2-b79a-bcc928f66cd3" class="cnblogs_code_hide">
1
///
<summary>
2
///
简单的自定义容器
3
///
子元素在垂直方向布满容器,水平方向平局分配容器宽度
4
///
</summary>
5
public
class
SplitPanel : Panel
6
{
7
protected
override
Size MeasureOverride(Size availableSize)
8
{
9
foreach
(UIElement child
in
InternalChildren)
10
{
11
child.Measure(availableSize);
//
测量子元素期望布局尺寸(child.DesiredSize)
12
}
13
14
return
base
.MeasureOverride(availableSize);
15
}
16
17
protected
override
Size ArrangeOverride(Size finalSize)
18
{
19
if
(
double
.IsInfinity(finalSize.Height) ||
double
.IsInfinity(finalSize.Width))
20
{
21
throw
new
InvalidOperationException(
"
容器的宽和高必须是确定值
"
);
22
}
23
24
if
(Children.Count >
0
)
25
{
26
double
childAverageWidth = finalSize.Width /
Children.Count;
27
for
(
int
childIndex =
0
; childIndex < InternalChildren.Count; childIndex++
)
28
{
29
//
计算子元素将被安排的布局区域
30
var
rect =
new
Rect(childIndex * childAverageWidth,
0
, childAverageWidth, finalSize.Height);
31
InternalChildren[childIndex].Arrange(rect);
32
}
33
}
34
35
return
base
.ArrangeOverride(finalSize);
36
}
37
}
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2008-2020
六狼论坛
(https://it.6wolf.com) 版权所有 All Rights Reserved.
Powered by
Discuz!
X3.4
京ICP备14020293号-2
本网站内容均收集于互联网,如有问题请联系
QQ:389897944
予以删除
快速回复
返回顶部
返回列表