先看效果图:这个是折叠特效。

代码结构:

     model是我们的数据模型,定义了在列表显示的人物名称   图片   简介    。

Resource是我们的图片资源  和 存储图片资源路径、名称的资源文件。

GroupListCreate是我们的主要创建列表的模块。

代码如下:

public StackPanel CreateModuleEntry(List<GroupPerson> hrvGroups)
{
if (hrvGroups != null)
{ StackPanel spl = new StackPanel(); //创建一个最外围的框
List<GroupPerson> groups = hrvGroups;
foreach (GroupPerson g in groups) //根据分组去遍历
{
int count = ;
Expander ex = new Expander(); //每一个分组
ex.Header = g.Name;
List<Person> modules = new List<Person>();
modules = g.Persons;
StackPanel sp = new StackPanel(); //每一个分组的框
foreach (Person m in modules)
{
DockPanel dp = new DockPanel();
if (count >= )
{
Thickness dpMargin = new Thickness(, , , );
dp.Margin = dpMargin;
}
dp.MouseLeave += new System.Windows.Input.MouseEventHandler(dp_MouseLeave);
dp.MouseEnter += new System.Windows.Input.MouseEventHandler(dp_MouseEnter);
dp.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(dp_MouseLeftButtonDown);
dp.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(dp_MouseLeftButtonUp);
//人物头像
Bitmap bm = new Bitmap(ImagePathResource.ImageSource+m.Ico);
MemoryStream ms = new MemoryStream();
bm.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = new MemoryStream(ms.ToArray());
bi.EndInit();
ms.Dispose();
System.Windows.Controls.Image image = new System.Windows.Controls.Image();
Thickness imageMargin = new Thickness(, , , );
image.Margin = imageMargin;
image.Source = bi;
image.Width = ;
image.Height = ;
image.Stretch = Stretch.Fill; //人物名称
Label lblName = new Label();
Thickness lblNameMargin = new Thickness(, , , );
lblName.Margin = lblNameMargin;
lblName.Height = ;
lblName.Content = m.Name;
lblName.FontSize = ;
lblName.FontWeight = FontWeights.Bold; //人物说明
WrapPanel dpl = new WrapPanel();
Thickness t3 = new Thickness(, , , );
dpl.Margin = t3;
//说明文字的自动换行
for (int i = ; i < m.Introduction.Length; i++)
{
string s = m.Introduction.Substring(i, );
Label lblResume = new Label();
lblResume.Content = s;
dpl.Children.Add(lblResume);
}
dpl.ItemHeight = ; dp.Children.Add(image);
dp.Children.Add(lblName);
dp.Children.Add(dpl);
DockPanel.SetDock(image, Dock.Left);
DockPanel.SetDock(lblName, Dock.Top);
sp.Children.Add(dp);
count++;
} ex.Content = sp; spl.Children.Add(ex); }
return spl;
}
return null;
}

这里我们直接返回一个stackpanel用来在界面展示,这样自动创捷列表基本上就完成了。
里面的四个事件是用来做鼠标浮动其上和按下的效果

void dp_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
dp = sender as DockPanel;
dp.Background = System.Windows.Media.Brushes.LightGray;
}
DockPanel dp = null;
void dp_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
dp = sender as DockPanel;
dp.Background = System.Windows.Media.Brushes.LightGray;
} void dp_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
dp = sender as DockPanel;
dp.Background = System.Windows.Media.Brushes.Gray;
} void dp_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
dp = sender as DockPanel;
dp.Background = System.Windows.Media.Brushes.Transparent;
}

剩下的工作就是怎样去显示  和  显示出比较炫的效果了。

先说说显示,显示主要就在PersonView.xaml文件里面,这是一个UserControl;

这个很简单 首先在PersonView.xaml里面用一个Grid,里面再放一个ScrollViewer再加上我们的  StackPanel就大功告成了!

代码如下:

<UserControl x:Class="WpfApplication2.PersonView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
Background="Black"
d:DesignHeight="" d:DesignWidth=""
Loaded="UserControl_Loaded">
<Grid Name="gd">
<ScrollViewer Name="sv" Width="" Height="" VerticalScrollBarVisibility="Auto">
<StackPanel Name="sp">
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>

PersonView.xaml.cs文件代码:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
List<GroupPerson> gps = GetListGroup();
GroupListCreate glc = new GroupListCreate();
sp = glc.CreateModuleEntry(gps);
sv.Content = sp;
}

关于GetListGroup  我就不写了这个就是根据我们定义的数据模型去给初始化一下。

数据模型和Style我就不贴了   数据模型看我创建的列表就能看出来,  Style代码实在太多。

需要完整代码的朋友请加群

C#/WPF技术交流群: 94234450

点击加入QQ群:

不管你遇到了什么问题,我们都不会让你独自去面对!

WPF制作QQ列表(仿qq列表特效)的更多相关文章

  1. WPF C#截图功能 仿qq截图

    原文:WPF C#截图功能 仿qq截图 先上效果图 源码下载地址:http://download.csdn.net/detail/candyvoice/9788099 描述:启动程序,点击窗口butt ...

  2. WPF ”真正的“高仿QQ

    时常可以在各种论坛 博客 看到 各种所谓的 高仿QQ. 说实话 越看越想笑呢.(PS:纯粹的 抨击 那些 不追求 UI 完美主义者) 例如:       本次模仿 采用 C# WPF XAML , 总 ...

  3. WPF 自定义TreeView控件样式,仿QQ联系人列表

    一.前言 TreeView控件在项目中使用比较频繁,普通的TreeView并不能满足我们的需求.因此我们需要滴对TreeView进行改造.下面的内容将介绍仿QQ联系人TreeView样式及TreeVi ...

  4. 仿QQ列表左滑删除

    一直想写个仿QQ通讯列表左滑删除的效果,今天终于忙里偷闲,简单一个. 大概思路是这样的: 通过 ontouchstartontouchmoveontouchend 结合css3的平移. 不多说,直接上 ...

  5. Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现

    Android高级控件(六)--自定义ListView高仿一个QQ可拖拽列表的实现 我们做一些好友列表或者商品列表的时候,居多的需求可能就是需要列表拖拽了,而我们选择了ListView,也是因为使用L ...

  6. jQuery实现的3个基础案例(仿QQ列表分组,二级联动下拉框,模拟员工信息管理系统)

    1.仿QQ列表分组 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&quo ...

  7. Android-自定义仿QQ列表Item滑动

    效果图: 布局中去指定自定义FrameLayout: <!-- 自定义仿QQ列表Item滑动 --> <view.custom.shangguigucustomview.MyCust ...

  8. Android仿QQ登录下拉历史列表

    demo中包含了Sqlite数据库增删改查,对存储的账号进行按照最新的时间排序,限制了最多存储5条数据. 效果图: 1.首先创建MyHelper建表: public class MyHelper ex ...

  9. 动手分析安卓仿QQ联系人列表TreeView控件

    因项目需要需要用到仿QQ联系人列表的控件样式,于是网上找到一个轮子(https://github.com/TealerProg/TreeView),工作完成现在简单分析一下这个源码.   一. 需要用 ...

  10. WPF系列教程——(一)仿TIM QQ界面 - 简书

    原文:WPF系列教程--(一)仿TIM QQ界面 - 简书 TIM QQ 我们先来看一下TIM QQ长什么样,整体可以将界面分为三个部分 TIM QQ 1. 准备 阅读本文假设你已经有XAML布局的基 ...

随机推荐

  1. leetcode面试准备:Triangle

    leetcode面试准备:Triangle 1 题目 Given a triangle, find the minimum path sum from top to bottom. Each step ...

  2. JQuery实现点击div以外的位置隐藏该div窗口

    简单示例代码: <body> <script type="text/javascript" src="http://ajax.googleapis.co ...

  3. codeigniter 分页类练习

    controller page页: <?php class Blog extends CI_Controller{ public function __construct(){ parent:: ...

  4. my sql 实现批量操作及注意问题

    使用in来实现批量操作是个很不错的想法: /*实现查询*/ select * from goods where goodsid in (102,103); /*实现批理删除*/ delete from ...

  5. MVC系统过滤器、自定义过滤器

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  6. 基于WebForm+EasyUI的业务管理系统形成之旅 -- 构建Web界面(Ⅴ)

    上篇<基于WebForm+EasyUI的业务管理系统形成之旅 -- 数据统计>,主要介绍系统数据统计所采用图形.报表工具. 本篇将如何构建Web界面以及新增.编辑.导出数据等功能. 一.在 ...

  7. Oracle行转列的函数

    --行转列的函数-- CREATE OR REPLACE FUNCTION Calvin( col IN VARCHAR2,dw IN VARCHAR2) RETURN VARCHAR2 IS ret ...

  8. Problem - 433C - Codeforces解题报告

    对于这题本人刚开始的时候的想法是:先把最大两数差的位置找到然后merge计算一个值再与一连串相同的数做merge后计算一个值比较取最大值输出:可提交后发现不对,于是本人就搜了一下正解发现原来这题的正确 ...

  9. POJ1159 - Palindrome(区间DP)

    题目大意 给定一个字符串S,问最少插入多少个字符可以使字符串S变为回文串 题解 用dp[i][j]表示把字符串s[i-j]变为回文串需要插入的最小字符数 如果s[i]==s[j]那么dp[i][j]= ...

  10. 群赛 ZOJ3741(dp) ZOJ3911(线段树)

    zoj3741 简单dp.wa了两个小时,中间改了好多细节.后来还是不对,参考了别人的代码,发现一个致命问题,初始化的时候,不是每种状态都能直接达到的.初始化成-1. (题目有个小坑,0<=L& ...