在 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. Jni的Jclass JmethodID JfrieldID的差异

    Jni的Jclass JmethodID JfrieldID 这三者都是java类别的属性,本质上都是指标(Pointer).透过这些指标就能快速调用java类别的函数,或存取对象的属性值.在该类别被 ...

  2. .net非托管资源的回收

    释放未托管的资源有两种方法 1.析构函数 2.实现System.IDisposable接口 一.析构函数 构造函数可以指定必须在创建类的实例时进行的某些操作,在垃圾收集器删除对象时,也可以调用析构函数 ...

  3. 在 Windows 上快速安装并运行 Laravel 5.x

    安装 PHP 注意一:Laravel 5.0 开始对 PHP 版本的要求是 >=5.4,Laravel 5.1 要求 PHP 版本>=5.5.9,所以,建议大家尽量安装 5.5.x 的最新 ...

  4. (算法)二叉树的第m层第k个节点

    题目: 给定以下二叉树: struct node { node *left, *right; int value; }; 要求编写函数 node* foo(node *node, unsigned i ...

  5. 通过Intel XDK编写跨平台app(一)

    Intel XDK 是一个新的跨平台手机应用开发工具.它努力把整个开发流程变的简单,尽可能把所有的平台都封装到一个包中,通过收集各种开发工具来使你的开发变的简单. 在这篇文章中,我将会向你介绍什么是I ...

  6. MongoDB 聚合管道(aggregate)

    1.aggregate() 方法 我们先插入一些测试数据 { "_id" : ObjectId("5abc960c684781cda6d38027"), &qu ...

  7. Python 3 解析 html

    资料:https://docs.python.org/3/library/html.parser.html python 自带了一个类,叫 HTMLParser. 我们用的时候需要自己定义一个类,继承 ...

  8. 关于SQLite在Android开发中的知识点总结

    一.存放位置 1.内部存储-放在 data/data 底下, 也就是内部存储, 里面的文件以及文件夹是私有的, 其他 app 不能访问, 也随着 app 卸载而删除; 2.放在 sd 卡里面, 如果设 ...

  9. js判断是否包含指定字符串

      CreateTime--2017年2月28日09:37:06Author:Marydonjs判断是否包含指定字符串 var inputValue = "thunder://piaohua ...

  10. 增强基本选择器[selector_3.html]

    增强基本选择器[selector_3.html] $("ul li:first") $("ul li:last") $("table tr:even& ...