WPF制作QQ列表(仿qq列表特效)

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

代码结构:

     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 = 1;
                    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 >= 2)
                        {
                            Thickness dpMargin = new Thickness(0, 10, 0, 0);
                            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(0, 0, 0, 0);
                        image.Margin = imageMargin;
                        image.Source = bi;
                        image.Width = 50;
                        image.Height = 50;
                        image.Stretch = Stretch.Fill;

                        //人物名称
                        Label lblName = new Label();
                        Thickness lblNameMargin = new Thickness(15, 0, 0, 0);
                        lblName.Margin = lblNameMargin;
                        lblName.Height = 25;
                        lblName.Content = m.Name;
                        lblName.FontSize = 13;
                        lblName.FontWeight = FontWeights.Bold;

                        //人物说明
                        WrapPanel dpl = new WrapPanel();
                        Thickness t3 = new Thickness(15, 0, 0, 0);
                        dpl.Margin = t3;
                        //说明文字的自动换行
                        for (int i = 0; i < m.Introduction.Length; i++)
                        {
                            string s = m.Introduction.Substring(i, 1);
                            Label lblResume = new Label();
                            lblResume.Content = s;
                            dpl.Children.Add(lblResume);
                        }
                        dpl.ItemHeight = 18;

                        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="300" d:DesignWidth="250"
              Loaded="UserControl_Loaded">
    <Grid Name="gd">
        <ScrollViewer Name="sv" Width="250" Height="300"  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

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

时间: 2024-10-31 14:33:26

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

Android 利用ExpandableListView显示和查询仿QQ分组列表用户信息

在我们的项目开发过程中,经常会对用户的信息进行分组,即通过组来显示用户的信息,同时通过一定的查询条件来显示查询后的相关用户信息,并且通过颜色选择器来设置列表信息的背景颜色. 其中借鉴xiaanming:http://blog.csdn.net/xiaanming/article/details/12684155 下面来看看项目运行后的效果图以及代码结构图: 下面通过代码来实现整个效果. 1.主界面布局activity_main.xml <span style="font-size:18px

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

因项目需要需要用到仿QQ联系人列表的控件样式,于是网上找到一个轮子(https://github.com/TealerProg/TreeView),工作完成现在简单分析一下这个源码.   一. 需要用到的知识如下: ①安卓事件分发机制:(http://blog.csdn.net/lvxiangan/article/details/9309927  或 http://gundumw100.iteye.com/blog/1052270) ②安卓View绘制:http://blog.csdn.net/

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

Android高级控件(六)--自定义ListView高仿一个QQ可拖拽列表的实现 我们做一些好友列表或者商品列表的时候,居多的需求可能就是需要列表拖拽了,而我们选择了ListView,也是因为使用ListView太久远了,导致对他已经有浓厚的感情了,我们之前也是写过几篇关于ListView的博文 Android实训案例(三)--实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果! Android高级控件(一)--ListView绑定CheckBox实现全选,增加和删除等功能 A

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

效果图: 布局中去指定自定义FrameLayout: <!-- 自定义仿QQ列表Item滑动 --> <view.custom.shangguigucustomview.MyCustomFrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_

android列表收缩与展开仿QQ好友列表(非常详细,附源码)

好友QQ列表,可以展开,可以收起,在android中,以往用的比较多的是listview,虽然可以实现列表的展示,但在某些情况下,我们还是希望用到可以分组并实现收缩的列表,那就要用到android的ExpandableListView,今天研究了一下这个的用法,也参考了很多资料动手写了一个小demo,实现了基本的功能,下面直接上效果图以及源代码~! ExpandableListView是一个垂直滚动显示两级列表项的视图,与ListView不同的是,它可以有两层:每一层都能够被独立的展开并显示其子

QQ概念版(WPF制作)

984 QQ概念版 编辑 QQ 概念版是腾讯首款NUI(自然用户交互)产品,全面实现了多点触摸操作.是腾讯利用微软最新一代的客户端展现层技术--WPF,打造的IM产品. 中文名 QQ 概念版 游戏类别 聊天软件NUI 游戏平台 QQ 开发商 腾讯 发行商 腾讯 目录 1简介 2系统要求 3用户评测 4产品介绍 5评测数据 6更新日志 ? Beta 1.3 ? Beta 1.2 ? Beta 1.1 1简介编辑 在实现IM的基础功能外,QQ概念版还推出了动感相框.动态背景.多Tab聊天窗口.3D交

Android高级控件(五)——如何打造一个企业级应用对话列表,以QQ,微信为例

Android高级控件(五)--如何打造一个企业级应用对话列表,以QQ,微信为例 看标题这么高大上,实际上,还是运用我么拿到listview去扩展,我们讲什么呢,就是研究一下QQ,微信的这种对话列表,我们先看一个传统的ListView是怎么样的,我们做一个通讯录吧,通讯录的组成就是一个头像,一个名字,一个电话号码,一个点击拨打的按钮,既然这样,那我们的item就出来了 call_list_item.xml <?xml version="1.0" encoding="ut

Android特效专辑(六)——仿QQ聊天撒花特效,无形装逼,最为致命

Android特效专辑(六)--仿QQ聊天撒花特效,无形装逼,最为致命 我的关于特效的专辑已经在CSDN上申请了一个专栏--http://blog.csdn.net/column/details/liuguilin.html 日后我所写的特效专辑也会以一添加在这个专栏上,今天写的这个特效,是关于聊天的,你肯定遇到过,就是你跟人家聊天的时候,比如发送应(么么哒),然后屏幕上全部就是表情了,今天我们就是做这个,撒花的特效,国际惯例,上图 截图 实现这样的效果,你要知道贝塞尔曲线,何谓贝塞尔曲线?其实

WPF下的仿QQ图片查看器

本例中的大图模式使用图片控件展示,监听控件的鼠标滚轮事件和移动事件,缩略图和鹰眼模式采用装饰器对象IndicatorObject和Canvas布局.百分比使用一个定时器,根据图片的放大倍数计算具体的数值显示. 首先看看效果图: 以下开始绘制图片 定义缩略图上白色的矩形,这其实是一个Indicator,它的外围是一个Canvas,然后缩略图是一个Image控件 internal class IndicatorObject : ContentControl { private MaskCanvas

仿QQ浏览器mac版官网主页 html+css3特效

这是一款超酷的CSS3动态背景动画特效,CSS3仿QQ浏览器官网彗星动画背景特效. 在线演示本地下载 原文地址:https://www.cnblogs.com/wwhhq/p/8280750.html