【WPF】制作自定义的列表项面板
我们在使用像ListBox的列表控件时,我们都知道可以通过其ItemsPanel的依赖项属性来自定义一个面板来放置列表控件中的列表项。除了CLR库提供的几个面板外,我们完全可以把自己写的面板作为项列表的容器。
先给各位看看效果。

如何?效果还好吧?
面板的原理是这样的:
1、从Panel类派出一个类,我命名为MyPanel。
2、重写MeasureOverride方法,分别计算所有子元素的大小。
3、重写ArrangeOverride方法,为每个子元素随机生成X和Y坐标,然后再用这个随机生的坐标来放置子元素。
4、为了能隔一段时间自动排版一次,我就加入了一个DispatcherTimer,并公开一个SwapInterval属性,可以为调用者设置计时器的执行音隔,以秒为单位。
5、后来想想,如果每次都仅仅调用InvalidateArrange方法来重新排列子元素,好像有些枯燥,不如在重新排列之间弄一些动画效果好看点。于是,我就在重新排列子元素之前让面板“淡出”;当面板排列子元素完成后,再来个“淡入”效果,不错。只是对Opacity属性进行动画处理就可以了,也不费事。
好,整体的思路就是这样,然后把这个面板用到ListBox等列表控件的ItemsPanel上就行。
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<local:MyPanel SwapInterval="6"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
下面我贴一下整个MyPanel类的代码,以供大家参考。(代码进行了修订)
public class MyPanel:Panel
{
Random rand = null;
DispatcherTimer Timer = null; public MyPanel()
{
rand = new Random();
Timer = new DispatcherTimer();
Timer.Interval = TimeSpan.FromSeconds(SwapInterval);
Timer.Tick += Timer_Tick;
Timer.Start();
} #region 属性
public static readonly DependencyProperty SwapIntervalProperty = DependencyProperty.Register("SwapInterval", typeof(double), typeof(MyPanel), new PropertyMetadata(10d, new PropertyChangedCallback(SwapIntervalChanged), new CoerceValueCallback(CoerceValCallback))); private static void SwapIntervalChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyPanel p = d as MyPanel;
double sec = (double)e.NewValue;
p.Timer.Stop();
p.Timer.Interval = TimeSpan.FromSeconds(sec);
p.Timer.Start();
} private static object CoerceValCallback(DependencyObject d, object baseValue)
{
// 通过该方法测检依赖项属性的值
// 如果设置的值小于5秒,就自动改为5秒
double dv = (double)baseValue;
if (dv < 5d)
{
dv = 5d;
}
return dv;
} /// <summary>
/// 切换动画间隔,以秒为单位
/// </summary>
public double SwapInterval
{
get { return (double)GetValue(SwapIntervalProperty); }
set { SetValue(SwapIntervalProperty, value); }
}
#endregion void Timer_Tick(object sender, EventArgs e)
{
DoubleAnimation dat = new DoubleAnimation();
dat.From = 1d;
dat.To = 0d;
dat.Duration = TimeSpan.FromMilliseconds();
dat.Completed += (sd, arg) =>
{
// 当动画完成时,面板的Opacity为0
// 此时重新排列子元素
this.InvalidateArrange();
DoubleAnimation datBack = new DoubleAnimation();
datBack.From = 0d;
datBack.To = 1d;
datBack.Duration = TimeSpan.FromSeconds();
// 子元素排列完成后,再执行一个动画
// 将Opacity再改为1
this.BeginAnimation(OpacityProperty, datBack);
};
// 开始动画,隐藏面板
this.BeginAnimation(OpacityProperty, dat);
} protected override Size MeasureOverride(Size availableSize)
{
// 处理子元素的大小
foreach (UIElement u in InternalChildren)
{
// 一定要对每个子元素调用Measure
// 不然,就看不到子元素了
u.Measure(availableSize);
}
// 如果不要求精确计算子元素占了多少
// 空间,可以直接返回0-0的Size,但不
// 要返回正无穷大,否则后果自负
return new Size();
} protected override Size ArrangeOverride(Size finalSize)
{
// 通过该方法对子元素进行排列
foreach (UIElement item in InternalChildren)
{
// 算出子元素的坐标的随机值
double maxX = finalSize.Width - item.DesiredSize.Width;
double maxY = finalSize.Height - item.DesiredSize.Height;
if (maxX <=0d)
{
maxX = 1d;
}
if (maxY <= 0d)
{
maxY = 1d;
}
double X = rand.Next(, (int)maxX);
double Y = rand.Next(, (int)maxY);
// 调用Arrange方法安排子元素放在哪个位置
item.Arrange(new Rect(X, Y, item.DesiredSize.Width, item.DesiredSize.Height));
}
return finalSize;
}
}
代码可以移植到Windows Phone或Windows StoreApp中,原理都是一样的。
其他代码就没有必要贴了,免得影响大家看帅哥美女,我把整个项目上传就是了。
下载地址:http://files.cnblogs.com/tcjiaan/MyLayoutPanel.zip
【WPF】制作自定义的列表项面板的更多相关文章
- WPF中反转3D列表项
原文:WPF中反转3D列表项 WPF中反转3D列表项 周银辉记得在苹果电脑中有一个很酷的 ...
- 每日学习心得:SharePoint 2013 自定义列表项添加Callout菜单项、文档关注、SharePoint服务端对象模型查询
前言: 前一段时间一直都比较忙,没有什么时间进行总结,刚好节前项目上线,同时趁着放假可以好好的对之前遇到的一些问题进行总结.主要内容有使用SharePoint服务端对象模型进行查询.为SharePoi ...
- WPF界面设计技巧(4)—自定义列表项样式
原文:WPF界面设计技巧(4)-自定义列表项样式 有前面修改按钮样式的基础,我们可以尝试来定制一个即好看又好用的 ListBox ,今天先来讲“好看”部分. 打开 Microsoft Visual S ...
- WPF界面设计技巧(5)—自定义列表项呈现内容
原文:WPF界面设计技巧(5)-自定义列表项呈现内容 接续上次的程序,稍微改动一下原有样式,并添加一个数据模板,我们就可以达成下面这样的显示功能: 鼠标悬停于文件列表项上,会在工具提示中显示图像缩略图 ...
- SharePoint 2013 自定义翻页显示列表项
项目需求:自定义开发一个能分页显示列表项的小部件,允许左右翻页,能根据用户权限来显示管理链接等. 效果如下: 技术要求:使用sharepoint rest API 来获取列表项,这样性能高,能够快速响 ...
- 自定义ListView适配器Adapter引用布局文件的情况下实现点击列表项时背景颜色为灰色
listview控件设置适配器的时候,如果使用自定义的adapter,比如MyArrayAdapter extends ArrayAdapter<String> 如果listitem布局文 ...
- 【百度地图API】如何制作自定义样式的公交导航结果面板?
原文:[百度地图API]如何制作自定义样式的公交导航结果面板? 摘要: 百度地图API有默认的公交导航结果面板,但样式比较单一:而百度地图上的结果面板就比较美观.如何利用百度地图API来制作一个比较美 ...
- SharePoint 列表项通过自定义WebService读取
简述:给其他系统提供集成,发现SharePoint自带的WebService各种不好使,索性就自己写一点,也当做自己学习的记录了.当然内容比较简单,希望大侠们不要介意,也不要骂我啊.好了,进入正题吧. ...
- (2017.9.27) 自定义列表项 list-style 使用心得
今天给某公司做招聘专页.早上完成设计图,下午开始排版.页面套用了我之前做的某人才局的招聘页面,导航栏.banner 很快就出来了.这次内容里我有些地方用了列表,当然要用 <ul> < ...
随机推荐
- java覆盖和隐藏
隐藏指的是子类把父类的属性或者方法隐藏了,即将子类强制转换成父类后,调用的还是父类的属性和方法,而覆盖则指的是父类引用指向了子类对象,调用的时候会调用子类的具体方法. (1) 变量只能被隐藏(包括静态 ...
- 导入aar文件出错
错误日志: > Could not resolve all dependencies for configuration ':app:_debugCompile'. > Could not ...
- day10---异步I/O,gevent协程
协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...
- 条件随机场matlab程序下载
19:44:23 1 http://www.cs.ubc.ca/~murphyk/Software/CRF/crf.html matlab程序包: 该条件随机场程序(CRF)是针对语句进行标注,mat ...
- 《利用Python进行数据分析》第4章学习笔记
NumPy基础:数组和矢量计算 NumPy的ndarray:一种多维数组对象 该对象是一个快速灵活的大数据集容器.你可以利用这种数组对整块数据执行一些数学运算,其语法跟标量元素之间的运算一样 列表转换 ...
- Spring对Quartz的封装实现简单需注意事项
前段时间在项目中一直使用正常的Quartz突然出现了任务漏跑的情况,由于我以前看过Quartz的内部实现,凭借记忆我觉得是由于Quartz的线程池的使用出现问题导致了故障的发生.为了搞清问题的真相,我 ...
- Google one联合联发科,国内低端智能机方案怎么办?
欢迎转载opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e=46 Google在Google I/O大会, 发布的Android One,由于看重的是 ...
- 【原创】WinForm 模态对话框
今天解决的一个问题,记录下,以备后用. 问题描述:WinForm程序有超时自动退出功能,但是有些模态对话框不关掉的话会退出失败,原因(猜测): 程序倒计时用的System.Windows.Forms. ...
- 如何重载delegate
在写delegate的时候遇到一个问题,在已有一个不带参数的delegate基础上,试图再增加一个带参数的delegate,结果VS报了“already contains a definition f ...
- Wix 安装部署教程(十五) --CustomAction的七种用法
在WIX中,CustomAction用来在安装过程中执行自定义行为.比如注册.修改文件.触发其他可执行文件等.这一节主要是介绍一下CustomAction的7种用法. 在此之前要了解InstallEx ...