我们在使用像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】制作自定义的列表项面板的更多相关文章

  1. WPF中反转3D列表项

    原文:WPF中反转3D列表项 WPF中反转3D列表项                                                         周银辉记得在苹果电脑中有一个很酷的 ...

  2. 每日学习心得:SharePoint 2013 自定义列表项添加Callout菜单项、文档关注、SharePoint服务端对象模型查询

    前言: 前一段时间一直都比较忙,没有什么时间进行总结,刚好节前项目上线,同时趁着放假可以好好的对之前遇到的一些问题进行总结.主要内容有使用SharePoint服务端对象模型进行查询.为SharePoi ...

  3. WPF界面设计技巧(4)—自定义列表项样式

    原文:WPF界面设计技巧(4)-自定义列表项样式 有前面修改按钮样式的基础,我们可以尝试来定制一个即好看又好用的 ListBox ,今天先来讲“好看”部分. 打开 Microsoft Visual S ...

  4. WPF界面设计技巧(5)—自定义列表项呈现内容

    原文:WPF界面设计技巧(5)-自定义列表项呈现内容 接续上次的程序,稍微改动一下原有样式,并添加一个数据模板,我们就可以达成下面这样的显示功能: 鼠标悬停于文件列表项上,会在工具提示中显示图像缩略图 ...

  5. SharePoint 2013 自定义翻页显示列表项

    项目需求:自定义开发一个能分页显示列表项的小部件,允许左右翻页,能根据用户权限来显示管理链接等. 效果如下: 技术要求:使用sharepoint rest API 来获取列表项,这样性能高,能够快速响 ...

  6. 自定义ListView适配器Adapter引用布局文件的情况下实现点击列表项时背景颜色为灰色

    listview控件设置适配器的时候,如果使用自定义的adapter,比如MyArrayAdapter extends ArrayAdapter<String> 如果listitem布局文 ...

  7. 【百度地图API】如何制作自定义样式的公交导航结果面板?

    原文:[百度地图API]如何制作自定义样式的公交导航结果面板? 摘要: 百度地图API有默认的公交导航结果面板,但样式比较单一:而百度地图上的结果面板就比较美观.如何利用百度地图API来制作一个比较美 ...

  8. SharePoint 列表项通过自定义WebService读取

    简述:给其他系统提供集成,发现SharePoint自带的WebService各种不好使,索性就自己写一点,也当做自己学习的记录了.当然内容比较简单,希望大侠们不要介意,也不要骂我啊.好了,进入正题吧. ...

  9. (2017.9.27) 自定义列表项 list-style 使用心得

    今天给某公司做招聘专页.早上完成设计图,下午开始排版.页面套用了我之前做的某人才局的招聘页面,导航栏.banner 很快就出来了.这次内容里我有些地方用了列表,当然要用 <ul> < ...

随机推荐

  1. ibatis 使用 in 查询的几种XML写法

    原文地址:http://blog.csdn.net/dracotianlong/article/details/35303593 这里摘抄学习 1.传入参数是数组 <select id=&quo ...

  2. <Data Structure and Algorithm>排序算法

    排序稳定:如果两个数相同,对他们进行的排序结果为他们的相对顺序不变.例如A={1,2,1,2,1}这里排序之后是A = {1,1,1,2,2} 稳定就是排序后第一个1就是排序前的第一个1,第二个1就是 ...

  3. libev安装与示例程序编译运行

    Linux平台C网络编程,之前总是看各大名著(如UNIX环境高级编程和UNIX网络编程,还有TCP/IP详解 卷1:协议和深入理解计算机系统(原书第2版)),同时写点小程序练习.然而还是拿不出手. 参 ...

  4. cowboy学习笔记(安装与部署)

    安装cowboy,参照官方文档:http://ninenines.eu/docs/en/cowboy/1.0/guide/getting_started/ 添加依赖库:在makefile中添加,会自动 ...

  5. Ubuntu下eclipse开发hadoop应用程序环境配置

    第一步:下载eclipse-jee-kepler-SR2-linux-gtk-x86_64.tar.gz 注意:如果电脑是64位,就下载linux下的64位eclipse,不要下载32位的eclips ...

  6. XAF 官方问题笔记

    1.How to print report direct, and print preview via an simple action? 如何通过一个按钮直接打印报表或者打印预览报表 https:/ ...

  7. PCFG -- 基于统计方法生成语法树

    语法树的作用 一棵语法树不仅包括了词性(part of speech), 还包括了短语(如名词短语, 动词短语)和结构化的信息(如主语, 谓语和宾语). 这些信息是进行机器翻译所必须的, 例如机器翻译 ...

  8. Mybatis 后台SQL不输出

    在正确设置log4j.properties之后还是无法输出想要的SQL语句 经过搜索,发现是跟slf4j-api-1.6.1.jar这个jar包冲突了. 删掉之后就正常了, 但是这个包删掉的话acti ...

  9. XtraBackup备份笔记

    安装 rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm yum in ...

  10. Ubuntu 初始化Root账户密码

    昨晚新装的Ubuntu12(电脑太烂了),每次都记不住初始化root密码的命令,既然决定开始写自己的园子了,那就在自己的园子里面记一下,方便自己稳固之心 好了,不废话了了 draenei@ubuntu ...