在 Blend 中集成了很多行为,首先需要了解一下Behaviors(行为)的几个关键点:

(1)Behaviors(行为)是可复用代码集合,可以被任何对象附加使用;

(2)设计人员和开发人员可以使用Behaviors(行为)在不用设计任何代码的情况下,添加相关功能到XAML中;

(3)Behaviors(行为)可以通过XAML附加到任何对象元素中,无需设计任何后台代码;

(4)一个Behaviors(行为)可以被多个对象同时调用;

在 Silverlight 中已有的行为里面,FluidMoveBehavior 行为可以很方便的实现很多有趣的动画,从而大大

简化了我们的开发。

本文介绍如何实现在 Windows Phone 中的 ListBox 中,选中其中一项后,以动画的效果显示详细信息,让人

感觉内容是从 ListBox 中飞出来的,新闻列表类的应用比较常见:

步骤一:

在 MainPage 的 XAML 页面中,添加一个 ListBox,每一项包含标题和一张配图:

<ListBox x:Name="listbox">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Width="460" Margin="10"> <TextBlock Text="{Binding Title}" TextAlignment="Center" VerticalAlignment="Center" Margin="30"
FontSize="30" Foreground="AliceBlue"/>

<Image Source="{Binding Img}" Width="80"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

第二步,添加一个 StackPanel,里面添加一个 TextBlock 用来显示选中项的标题,Image 用来显示选中项的配图:

<StackPanel x:Name="stack" Orientation="Vertical" DataContext="{Binding SelectedItem, ElementName=listbox}" Margin="10">
<TextBlock Text="{Binding Title}" Foreground="YellowGreen" FontSize="40" Margin="10,20"
TextAlignment="Center" FontFamily="Buxton Sketch"/>
<Image Source="{Binding Img}"/>
</StackPanel>

可以看出,在 StackPanel 中,给它的 DataContext 属性 绑定的是上面的 listbox 控件的 SelectItem 选项,

这样当单击 listbox 时,StackPanel 中的 Children 便能绑定到 选中项 的标题和图片。

第三步:

声明一个包含 标题 和 图片的类:

    public class News
{
public string Title { get; set; }
public string Img { get; set; }
}

在项目中添加一个名为 Images 的文件夹,里面添加 8 张示例图片,并在 MainPage 的 CodeBehind 页面中,添加相应的绑定数据:

        // 构造函数
public MainPage()
{ InitializeComponent(); this.Loaded += MainPage_Loaded;
} List<News> listNews; // 数据源
void MainPage_Loaded(object sender, RoutedEventArgs e)
{ listNews = new List<News>(); listNews.Add(new News { Img = "/Images/01.jpg", Title = "Beautiful -01" });
listNews.Add(new News { Img = "/Images/02.jpg", Title = "Beautiful -02" });
listNews.Add(new News { Img = "/Images/03.jpg", Title = "Beautiful -03" });
listNews.Add(new News { Img = "/Images/04.jpg", Title = "Beautiful -04" });
listNews.Add(new News { Img = "/Images/05.jpg", Title = "Beautiful -05" });
listNews.Add(new News { Img = "/Images/06.jpg", Title = "Beautiful -06" });
listNews.Add(new News { Img = "/Images/07.jpg", Title = "Beautiful -07" });
listNews.Add(new News { Img = "/Images/08.jpg", Title = "Beautiful -08" }); listbox.ItemsSource = listNews; // 绑定到列表控件
}

第四步,为了实现当用户单击 Back 键时,清空详细信息中的文字和图片,在页面的 OnBackKeyPress 事件中添加代码:

    protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
if (listbox.SelectedIndex > -)
{
listbox.SelectedIndex = -;
e.Cancel = true;
}
base.OnBackKeyPress(e);
}

实现上面四步后,可以实现当单击 ListBox 中项的时候,可以显示项目的详细信息,不过没有动画效果,不够生动:

第五步,添加动画效果,此时需要用到 FluidMoveBehavior 行为了,此时需要打开 Blend 进行操作。首先选择

左侧的 资产 -> 行为 -> FluidMoveBehavior,把它拖动到 “对象与时间线” 中的 StackPanel 详细信息控件上,拖动后的效果:

在右侧的属性面板中设置该  FluidMoveBehavior:

第六步,因为 FluidMoveBehavior  的行为将尝试查找之前使用 FluidMoveSetTagBehavior 行为标记有相同数据的元素,

所以给 listbox 中 DataTemplate 里面的 StackPanel 设置 FluidMoveSetTagBehavior 行为。

因为前四步中使用的集合中的数据是运行时数据,所以并不能在 Blend 中直接看到,这里我们走一点捷径,不在这里创建示例数据,

而是把 FluidMoveSetTagBehavior 拖动到页面中的任何元素后,设置好相应属性后,在 xaml 代码中剪切到 DataTemplate 里面

的 StackPanel 节点中,比如 根节点 Grid 上:

设置它的 AppliesTo 属性和 Tag 属性:

然后把 Blend 生成的代码,剪切到 ListBox 的 DataTemplate 里面的 StackPanel 节点中 。

最终 MainPage 的 XAML 页面中的代码为:

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ListBox x:Name="listbox">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Width="460" Margin="10">
<i:Interaction.Behaviors>
<el:FluidMoveSetTagBehavior AppliesTo="Children" Tag="DataContext"/>
</i:Interaction.Behaviors>
<TextBlock Text="{Binding Title}" TextAlignment="Center"
VerticalAlignment="Center" Margin="30" FontSize="30" Foreground="AliceBlue"/>
<Image Source="{Binding Img}" Width="80"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox> <StackPanel x:Name="stack" Orientation="Vertical" DataContext="{Binding SelectedItem, ElementName=listbox}" Margin="10">
<i:Interaction.Behaviors>
<el:FluidMoveBehavior InitialTag="DataContext" Duration="0:0:1">
<el:FluidMoveBehavior.EaseY>
<CircleEase EasingMode="EaseOut"/>
</el:FluidMoveBehavior.EaseY>
<el:FluidMoveBehavior.EaseX>
<CircleEase EasingMode="EaseOut"/>
</el:FluidMoveBehavior.EaseX>
</el:FluidMoveBehavior>
</i:Interaction.Behaviors>
<TextBlock Text="{Binding Title}" Foreground="YellowGreen" FontSize="40"
Margin="10,20" TextAlignment="Center" FontFamily="Buxton Sketch"/>
<Image Source="{Binding Img}"/>
</StackPanel>
</Grid>

完成,运行实现单击后详细信息飞出 ListBox 的效果。

工程源码下载

参考文档:

FluidMoveBehavior、FluidMoveSetTagBehavior 和数据存储

FluidMoveBehavior

Channel9 中看到一个 wpf 的视频:http://channel9.msdn.com/Shows/Visual-Studio-Toolbox/User-Interfaces-in-WPF

(1)FluidMoveBehavior 之 ListBox 中详细内容项飞出来的更多相关文章

  1. WP8_访问ListBox中的Item项中的某个元素

    How to access a Control placed inside ListBox ItemTemplate in WP7(转) In this post I am going to talk ...

  2. Winform 遍历 ListBox中的所有项

    foreach(DataRowView row in listBox.Items ) { MessageBox.Show(row["displayMember"].ToString ...

  3. C#中listbox中选中多项,并删除

    1.SelectionMode 改成可以多选2.利用KeyDown事件: private void listBox1_KeyDown(object sender, KeyEventArgs e) { ...

  4. x名称空间中的内容

    原文:x名称空间中的内容 x名称空间映射的是http://schemas.microsoft.com/winfx/2006/xaml,它包含的类均与XAML的解析有关,下面分三部分介绍 一:x名称空间 ...

  5. C# winform listBox中的项上下移动(转)

    C# winform listBox中的项上下移动 分类: C# winform2009-06-24 12:37 876人阅读 评论(0) 收藏 举报 winformc#object //上移节点   ...

  6. /etc/resolv.conf文件中的search项作用;如何保持resolv.conf文件内容不被修改

    /etc/resolv.conf文件中的search项作用 resolv.conf文件中有search项时,主机名解析规则顺序: DNS配置文件如下: # cat /etc/resolv.conf ; ...

  7. 【Java面试题】15 String s="Hello"; s=s+“world!”;这两行代码执行后,原始的String对象中的内容到底变了没有?String与StringBuffer的超详细讲解!!!!!

    1.Java中哪些类是不能被继承的? 不能被继承的是那些用final关键字修饰的类.一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的,在java中,System,Str ...

  8. 解决VS2015中没有报表项(ReportViewer)的方法

    作者:何时.微笑成了种奢求 VS2015中没有报表项(ReportViewer),怎么办?这篇文章主要为大家详细介绍了解决VS2015中没有报表项(ReportViewer)的方法,感兴趣的小伙伴们可 ...

  9. Kafka在大型应用中的 20 项最佳实践

    原标题:Kafka如何做到1秒处理1500万条消息? Apache Kafka 是一款流行的分布式数据流平台,它已经广泛地被诸如 New Relic(数据智能平台).Uber.Square(移动支付公 ...

随机推荐

  1. 如何安装pip、升级pip包。mac下安装包的路径

    参考:https://pip.pypa.io/en/stable/installing/ 1.wget -c  https://bootstrap.pypa.io/get-pip.py 2.pytho ...

  2. Guava API - FluentIterable Predicate Function Odering Range Splitter

    这写API可解决的问题 1. 集合元素的过滤 - FluentIterable Predicate Range Function 1) 先说Predicate<T>,这个相当与一个过滤原则 ...

  3. 移植tslib和Qt5.6到三星s5pv210开发板

    tslib1.4移植 下载tslib1.4后 1.cp tslib-1.4.tar.bz2 /home/gec 2.tar jxvf tslib-1.4.tar.bz2 3.sudo -s 4.cd ...

  4. C# 利用反射动态创建对象[摘录]

    摘自:http://hi.baidu.com/yangyuhang/blog/item/f12ea90e13f214e336d12250.html 在VS.Net中,有很多种方法动态调用对象的构造函数 ...

  5. SSH免密码登陆以及穿越跳板机

    1. 免密码直连  [user@hostA ~] $ssh hostB STEP1. 在hostA上生成RSA公钥私钥(在~/.ssh/下生成RSA私钥id_rsa,公钥id_rsa.pub) [us ...

  6. 搜集整理一些Cron表达式例子

    1.cronExpression配置说明 字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / ...

  7. leetCode 86.Partition List(分区链表) 解题思路和方法

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  8. Cocos2d-x -- 如何让背景从上到下滚动

    1. 首先,声明一个2个大小的sprite数组 class GameScreen : public cocos2d::Layer { public: ... cocos2d::Sprite *back ...

  9. 转换到 StoryBoard 的公布说明(Converting to Storyboards Release Notes)

    转换到 StoryBoard 的公布说明(Converting to Storyboards Release Notes) 太阳火神的漂亮人生 (http://blog.csdn.net/opengl ...

  10. 从CM刷机过程和原理分析Android系统结构

    前面101篇文章都是分析Android系统源代码,似乎不够接地气. 假设能让Android系统源代码在真实设备上跑跑看效果,那该多好.这不就是传说中的刷ROM吗?刷ROM这个话题是老罗曾经一直避免谈的 ...