【WPF】实现QQ中的分组面板(2)——添加动画

在上一篇中,介绍了如何实现类似QQ中分组面板的功能。这一次将介绍如何用另一种方式实现这个功能,并添加动画效果。

在上一篇所介绍的方式中,主要的技术点其实就是那个作为ItemsPanel的自定义Panel。然而这种实现方式有两个主要缺点。

1.没有了Virtualizing的效果。虽然没有不可见项。

2.不便于添加动画效果。

这里将向大家介绍另一种实现方式。就是用Blend 3中非常火爆的Behavior来实现,并且可以很容易地添加上动画效果。

这个Behavior原理很简单,就是动态地计算ListBox里Item的高度。这就要求:

1.不能为ListBox的Item指定各不相同的高度。

2.要为每个Item指定一个默认的收缩时的高度。

在Rooijakkers的博客上介绍了类似的用高度的方法。不过上面的方法没有充分利用WPF的特性,写了一些不必要的逻辑,比如控件Expander 的IsExpanded属性。而且没有动画的支持。

这里使用Behavior简单步骤就是,添加一个用于ListBox的自定义Behavior,然后在ListBox的SelectionChanged事件中去设置每个Item的高 度。用Storyboard就可以很容易地实现动画效果。

这个Behavior有两个自定义属性。一个是DefaultHeight,一个是AnimationDuration。顾名思义,不解释了。核心代码如下所示。

Core Logic

private void OnAssociatedObjectSelectionChanged(object sender, SelectionChangedEventArgs e)
{
     double selectedItemFinalHeight = AssociatedObject.ActualHeight;
     Storyboard storyBoard = new Storyboard();
     for (int i = 0; i < AssociatedObject.Items.Count; i++)
     {
         ListBoxItem item = AssociatedObject.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
         if (!item.IsSelected)
         {
             selectedItemFinalHeight -= DefaultHeight;
             DoubleAnimation heightAnimation = new DoubleAnimation()
             {
                 To = DefaultHeight,
                 Duration = new Duration(new TimeSpan(0, 0, 0, 0, AnimationDuration))
             };
             Storyboard.SetTarget(heightAnimation, item);
             Storyboard.SetTargetProperty(heightAnimation, new PropertyPath (FrameworkElement.HeightProperty));
             storyBoard.Children.Add(heightAnimation);
         }
     }
     // The Padding of the ListBox.
     selectedItemFinalHeight -= 4;
     if (AssociatedObject.SelectedIndex >= 0)
     {
         ListBoxItem selectedItem = AssociatedObject.ItemContainerGenerator.ContainerFromIndex (AssociatedObject.SelectedIndex) as ListBoxItem;
         DoubleAnimation fillheightAnimation = new DoubleAnimation()
         {
             To = selectedItemFinalHeight,
             Duration = new Duration(new TimeSpan(0, 0, 0, 0, AnimationDuration))
         };
         Storyboard.SetTarget(fillheightAnimation, selectedItem);
         Storyboard.SetTargetProperty(fillheightAnimation, new PropertyPath (FrameworkElement.HeightProperty));
         storyBoard.Children.Add(fillheightAnimation);
     }
     storyBoard.Begin(AssociatedObject);
}

这个示例看截图是和上一篇中介绍的是一样。要看动画效果还是要自己试一下的。在这个代码里,也包含了上次的示例。

本文配套源码

时间: 2024-10-22 21:10:45

【WPF】实现QQ中的分组面板(2)——添加动画的相关文章

【WPF】实现QQ中的分组面板

要实现的面板的效果如下图所示: 一个面板打开了,其它的面板会自动收起.而且打开的面板会填充所有可用空间.那么这样的效果在WPF里应该如何实现呢? 1. 多个面板,排成一排,感觉可以用ListBox. 2. 然后里面的东西,点一下打开,再点一下收起.感觉就是一个Expander嘛. 3. 一个打开,其它所有的收起.可以把Expander的IsExpanded与SelectedItem绑定.

从WPF Diagram Designer Part 2学习面板、缩略图、框线选择和工具箱

在从WPF Diagram Designer Part 1学习控件模板.移动.改变大小和旋转中介绍了图形设计器的移动.大小和旋转等功能的实现,本篇继续第二部分,学习设计面板.缩略图.框线旋转和工具箱等功能的实现. WPF Diagram Designer - Part 2 设计面板(Designer Canvas :variable size, scrollable) 在从WPF Diagram Designer Part 1学习控件模板.移动.改变大小和旋转中的示例出来的设计器,当把设计对象拖

WPF 类QQ头像

问题描述 小弟在用WPF+C#做一个类QQ的项目.QQ头像用什么控件做?听说是用ListView做,但是不会用啊!求高手帮忙! 解决方案 解决方案二:该回复于2011-02-28 14:06:58被版主删除解决方案三:假如是类似主界面显示好友列表的那里,可以去找第三方控件,比如SideBar.假如是选择头像那里,listview的LargeIcon或者SmallIcon模式可以实现.解决方案四:补充下用Listview实现头像选择的源代码://lvFaces为Listview控件,ilBigFa

Android UI仿QQ好友列表分组悬浮效果

本文实例为大家分享了Android UI仿QQ好友列表分组悬浮效果的具体代码,供大家参考,具体内容如下 楼主是在平板上測试的.图片略微有点大,大家看看效果就好 接下来贴源代码: PinnedHeaderExpandableListView.java 要注意的是 在 onGroupClick方法中parent.setSelectedGroup(groupPosition)这句代码的作用是点击分组置顶, 我这边不须要这个效果.QQ也没实用到,所以给凝视了.大家假设须要能够解开凝视 package c

捕捉WPF应用程序中XAML代码解析异常

由于WPF应用程序中XAML代码在很多时候是运行时加载处理的.比如DynamicResource,但是在编译或者运行的过程中,编写的XAML代码很可能有错误,此时XAML代码解析器通常会抛出称为XamlParseException的异常.但是抛出的XamlParseException异常提供的信息非常简单,或者是很不准确.此时我们关于通过对变通的方法来获取更多的异常信息: 我们知道,WPF应用程序中的XAML代码是在InitializeComponent方法中解析的.而这个方法通常位于窗口对象的

WPF应用程序中的发声功能

几个星期以前,我坐在一辆崭新的丰田普锐斯汽车中,听着租车公司的销售代理讲解着仪表盘上遍布 的陌生控制开关和指示器."哇,"我想,"虽然技术和车一样都那么陈旧了,制造商仍继续美化着用 户界面". 从最广义的层面上说,用户界面是人机交互的地方.虽然这一概念与技术本身一样历史悠久,但用户 界面作为一种艺术形式大放异彩倚仗的却是个人计算机革命. 现在,恐怕只有很小一部分个人计算机用户能够记得 Apple Macintosh 和 Microsoft Windows 图形 用户

UI前沿技术 – WPF应用程序中的MIDI音乐

每一台 PC 都包含一个内置的 16 人乐队,可播放一些音乐.人们不容易注意此乐队的成员,因为它 们表示的可能是 Windows 所支持的声音和视频功能阵列中利用最不充分的组件. 此 16 人乐队是在符合 MIDI(乐器数字接口)标准的硬件或软件中实现的电子音乐合成器.在 Win32 API 中,以单词 midiOut 开头的函数支持使用 MIDI 合成器播放音乐. MIDI 支持不是 .NET Framework 的一部分,但如果要在 Windows 窗体或 Windows Presentat

巧用Photoshop中的“通道”面板清理和抽取手绘线稿的方法

  巧用Photoshop中的"通道"面板清理和抽取手绘线稿的方法,简单粗暴,超实用的思路及技巧 分类: PS图片处理

在QQ中怎么看到哪些好友在线?

  我们在使用QQ聊天时,有时想看看哪些好友在线,而自己的QQ好友比较多时,我们可以通过QQ的特定功能来实现,下面小编就来教大家如何操作. 方法/步骤 打开QQ登陆面,输入账号和密码. 成功登陆QQ. 在QQ操作界面找到"联系人"栏,在其右上角有一个向下的箭头. 将鼠标指向该箭头,并单击左键,这时会出现如下对话框. 在该对话框中找到"显示在线联系人"栏. 将鼠标指向该栏,并单击左键,这时我们回到QQ操作界面就可以发现,只会显示在线的好友了. 7 当我们想恢复全部的联