我们在使用像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. (转)CentOs上配置samba服务

    前 言 在我们使用 Windows 作为客户机的时候,通常有文件.打印共享的需求.作为Windows 网络功能之一,通常可以在 Windows 客户机之间通过 Windows Network 固有的功 ...

  2. 6410移植android4.4.2笔记(持续更新)

    如之前的android编译笔记里面描述,目前已经可以编译出armv7-neon的android镜像了,也就是说目前的环境以及aosp可以支持定制android程序了. 昨天晚上在device下面已经粗 ...

  3. VIM使用(二) 浏览内核源代码

    为了实现类似SourceInsight功能,通过VIM+Ctags+Cscope+Taglist+Source Explore +NERD Tree实现. 一, 安装插件 1)安装Ctags 和Csc ...

  4. 未注册wang域名批量查询工具

    一.支持规则查询 可自定义生成域名进行查询,可生成任意位数的字母数字域名,根据[声母].[韵母]生成单拼,双拼,三拼等域名,还可根据字典生成,支持全拼.首拼识别,全国城市区号.城市全拼.城市首拼.热门 ...

  5. 简单的OkHttp使用介绍

    Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient.关于HttpURLConnection和HttpClient的选择>>官方博客尽管Go ...

  6. 简单易懂的Activity四种启动模式

    Activity的四种启动模式 我们在项目开发的过程中,会涉及到应用中各个Activity的跳转,有些Activity是可以复用,不用重复加载,节约内存的使用. 将第二个Activity的启动模式修改 ...

  7. ABP框架详解(六)Aspects

    这种AOP式的设计非常类似于Asp.net MVC和WebApi中过滤器(Filter)机制,感觉没有太多可讲述的,只能谈谈设计思路. 框架中AspectAttribute特性用于设置到需要被拦截的T ...

  8. jar包合并

    多个jar包合并: 1.首先将所以要合并的jar包解压到同一目录中.jar xvf xxx.jar 2.用jar命令将所有.class, .aidl文件打包. jar cvf output.jar   ...

  9. opencl初体验

    总结一下,opencl的步骤差不多是这些 先要获取平台的id clGetPlatformIDs(nPlatforms, platform_id, &num_of_platforms) 然后获取 ...

  10. 你以为的ASP.NET文件上传大小限制是你以为的吗

    我们以为的文件大小限制 我们大家都知道ASP.NET为我们提供了文件上传服务器控件FileUpload,默认情况下可上传的最大文件为4M,如果要改变可上传文件大小限制,那么我们可以在web.confi ...