Silverlight实用窍门系列:60.Silverlight中自定义Behavior,实现图片动画渐变Behavior

简介:

在Silverlight中我们需要了解Behavior行为,它可以将一些常用的行为、效果等封装起来,在需要调用的时候可以非常方便的调用,主要需要引用System.Windows.Interactivity.DLL。它的运行本质是为采用了Behavior行为的源对象自动加载处理事件。

        我们自定义一个Behavior行为需要做到以下三点方可成功。

        一、继承于System.Windows.Interactivity.DLL中的Behavior<T>类,其中的T可以更换为Image、TextBox、Label等所有的元素对象甚至是DependencyObject,表示这个自定义的Behavior可以作用于哪种控件。

        二、重写覆盖OnAttached方法,在这个方法中需要为添加Behavior行为的对象附加事件.

        三、重写覆盖OnDetaching方法,在这个方法中需要为删除Behavior行为的对象卸载事件.

        定义好Behavior行为之后,在界面上需要如以下方式使用:

复制代码
<UserControl x:Class="SLBehavior.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:me="clr-namespace:SLBehavior"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="800">

<Grid x:Name="LayoutRoot" Background="White">
<Image Source="lv.jpg" HorizontalAlignment="Left" Width="352" Height="318"
Margin="27,27,0,0" x:Name="img1" >
<i:Interaction.Behaviors>
<me:OpacityBehavior From="1" To="0.7"/>
</i:Interaction.Behaviors>
</Image>

<Image Source="hua.jpg" HorizontalAlignment="Left" Width="221" Margin="402,0,0,-33" x:Name="img2" >
<i:Interaction.Behaviors>
<me:OpacityBehavior From="1" To="0.5"/>
</i:Interaction.Behaviors>
</Image>
</Grid>
</UserControl>
复制代码

        自定义的Behavior行为代码如下,是一个控制图片透明度的动画效果。

复制代码
    public class OpacityBehavior : Behavior<Image>
{
private double _From = 1;
private double _To = 0.6;
//装载DoubleAnimation动画的故事板
Storyboard sboard = new Storyboard();
DoubleAnimation danima = new DoubleAnimation();
Image img;

/// <summary>
/// 透明度从多少开始
/// </summary>
public double From
{
get { return _From; }
set { _From = value; }
}

/// <summary>
/// 透明度到多少结尾
/// </summary>
public double To
{
get { return _To; }
set { _To = value; }
}

/// <summary>
/// 在为某个对象添加Behavior行为时附加事件
/// </summary>
protected override void OnAttached()
{
base.OnAttached();

//清除故事版和资源
img = this.AssociatedObject as Image;
sboard.Children.Clear();
img.Resources.Clear();
//设置img控件的透明度的Double类型数字变化
danima.SetValue(Storyboard.TargetNameProperty, img.Name);
danima.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("UIElement.Opacity"));
danima.Duration = new Duration(new TimeSpan(0, 0, 1));
sboard.Children.Add(danima);
img.Resources.Add("Storyboard", sboard);

//绑定鼠标事件
img.MouseEnter += new MouseEventHandler(img_MouseEnter);
img.MouseLeave += new MouseEventHandler(img_MouseLeave);
}

/// <summary>
/// 在为某个对象移除Behavior行为时注销事件
/// </summary>
protected override void OnDetaching()
{
base.OnDetaching();
img.MouseEnter -= new MouseEventHandler(img_MouseEnter);
img.MouseLeave -= new MouseEventHandler(img_MouseLeave);
}

void img_MouseEnter(object sender, MouseEventArgs e)
{
danima.From = this.From;
danima.To = this.To;
sboard.Begin();
}

void img_MouseLeave(object sender, MouseEventArgs e)
{
danima.From = this.To;
danima.To = this.From;
sboard.Begin();
}
}
复制代码

        注意:A:  AssociatedObject属性是使用此行为的对象。B:在行为中定义的属性可以在Xaml界面直接赋值。

        最后,如需源码请点击 SLBehavior.zip 下载,效果如下两张图所示:


本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2012/03/19/2403331.html,如需转载请自行联系原作者


相关文章
|
Java API Maven
微服务技术系列教程(27) - SpringCloud- Zuul整合Swagger管理微服务所有API
微服务技术系列教程(27) - SpringCloud- Zuul整合Swagger管理微服务所有API
183 0
|
JavaScript Java 测试技术
基于Java的线上招聘问答系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的线上招聘问答系统的设计与实现(源码+lw+部署文档+讲解等)
137 1
|
5天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
307 116
|
20天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
7天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
505 45
Meta SAM3开源:让图像分割,听懂你的话
|
14天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
695 222
|
2天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
137 95