大佬教程收集整理的这篇文章主要介绍了Silverlight行为,触发器,图片特效,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
特性类型
目前,您可以使用三种类型的行为: Behavour、 triggerAction 和 TargetedtriggerAction。 下图显示了类的关系图:
对于简单情况的泛型 Behavior<t> 类是最好的选择,此类具有只有两个可重写的方法,通知当前的行为,当连接对象和将其结束时。 我将创建两个行为: 在单击该图像时,第一次反转图像的着色,而是更复杂的是第二个 — 它@L_489_3@动画,并在图像的鼠标中创建一个放大镜。
第一件事就是当你创建的行为是一个新的类,该类从 Behavior<t>泛型类继承,当中 T 是一个依赖项对象时,在大多数情况下您将继承自 Behavior<frameworkelement> 或 Behavior<uielement>.
1: public class InverseColorClickBehavior : Behavior<FrameworkElement>
2: {
3: public InverseColorClickBehavior() : base()
4: {
5:
6: }
7: }
在个别的情况下,我对鼠标单击事件很感兴趣。 我会附加到与对象关联的 @H_881_21@mouSELEftButtonDown 事件到 OnAttached 方法中去。 在 OnDetaching 方法中我将结束该活动。
1: protected override void OnAttached()
2: {
3: base.onAttached();
4:
5: this.AssociatedObject.MouSELEftButtonDown += new @H_325_59@mouseButtonEventHandler( AssociatedObject_MouSELEftButtonDown );
6: }
7:
8: protected override void OnDetaching()
9: {
10: base.onDetaching();
11:
12: this.AssociatedObject.MouSELEftButtonDown -= new @H_325_59@mouseButtonEventHandler( AssociatedObject_MouSELEftButtonDown );
13: }
剩下的只是在鼠标单击事件处理程序关联的对象中@L_489_3@反颜色的效果。
1: private void AssociatedObject_MouSELEftButtonDown( object sender,@H_325_59@mouseButtonEventArgs e )
2: {
3: this.AssociatedObject.Effect =
4: this.AssociatedObject.Effect == null ?
5: this.AssociatedObject.Effect = this.inverseColor :
6: this.AssociatedObject.Effect = null;
7: }
我们已经创建了该行后,我们应将其附加到特定对象。
1: <Image Stretch="Fill"
2: source="/Photos/Image1.jpg">
3: <interactivity:Interaction.behaviors>
4: <local:InverseColorClickBehavior/>
5: </interactivity:Interaction.behaviors>
6: </Image>
以下演示,当第一次您单击时颜色会反转,当第二次单击会还原原来的着色。
更复杂的是第二个特性。 它是常见的方案,您要向其中@L_489_3@动画,例如鼠标事件。 再次创建与第一个示例那样的新类,该类继承自泛型 Behavior<t> T 于一个 FrameworkElement。
我想当鼠标在该元素上的时候@L_489_3@一个放大镜和动画效果,当鼠标离开就删除这些效果作用后的元素范围。 我想要处理 MouseEnter、 MouSELEave 事件命令启用和禁用效果。 对 OnAttached 方法中的前一个实例,我将附加到与性能对象关联的 MouseEnter、 MouSELEave 事件中。 并分别在 OnDetaching 方法中我会结束该效果。 鼠标在元素上时我想要跟踪鼠标移动的活动。 这就是为什么我会附加鼠标移动事件,并会当它离开时结束元素效果。
1: protected override void OnAttached()
2: {
3: base.onAttached();
4:
5: this.AssociatedObject.MouseEnter += new @H_325_59@mouseEventHandler( AssociatedObject_MouseEnter );
6: this.AssociatedObject.MouSELEave += new @H_325_59@mouseEventHandler( AssociatedObject_MouSELEave );
7: }
8:
9: protected override void OnDetaching()
10: {
11: base.onDetaching();
12:
13: this.AssociatedObject.MouseEnter -= new @H_325_59@mouseEventHandler( AssociatedObject_MouseEnter );
14: this.AssociatedObject.MouSELEave -= new @H_325_59@mouseEventHandler( AssociatedObject_MouSELEave );
15: }
16:
17: private void AssociatedObject_MouSELEave( object sender,@H_325_59@mouseEventArgs e )
18: {
19: this.AssociatedObject.MouseMove -= new @H_325_59@mouseEventHandler( AssociatedObject_MouseMove );
20: this.AssociatedObject.Effect = null;
21: }
22:
23: private void AssociatedObject_MouseEnter( object sender,@H_325_59@mouseEventArgs e )
24: {
25: this.AssociatedObject.MouseMove += new @H_325_59@mouseEventHandler( AssociatedObject_MouseMove );
26: this.AssociatedObject.Effect = this.magnifier;
27: }
整个鼠标移动事件处理程序的工作。
1: private void AssociatedObject_MouseMove( object sender,@H_325_59@mouseEventArgs e )
2: {
3: ( this.AssociatedObject.Effect as @H_325_59@magnifier ).Center =
4: e.GetPosition( this.AssociatedObject );
5:
6: Point @H_756_56@mousePosition = e.GetPosition( this.AssociatedObject );
7: mousePosition.X /= this.AssociatedObject.ActualWidth;
8: mousePosition.Y /= this.AssociatedObject.ActualHeight;
9: this.magnifier.Center = mousePosition;
10:
11: Storyboard zoomInStoryboard = new Storyboard();
12: DoubleAnimation zoomInAnimation = new DoubleAnimation();
13: zoomInAnimation.To = this.magnifier.Magnification;
14: zoomInAnimation.Duration = TimeSpan.FromSeconds( 0.5 );
15: Storyboard.SetTarget( zoomInAnimation,this.AssociatedObject.Effect );
16: Storyboard.SetTargetProperty( zoomInAnimation,new PropertyPath( @H_325_59@magnifier.MagnificationProperty ) );
17: zoomInAnimation.FillBehavior = FillBehavior.HoldEnd;
18: zoomInStoryboard.Children.Add( zoomInAnimation );
19: zoomInStoryboard.begin();
20: }
可以@L_489_3@这种特效到XAML中,其方式与第一种相同。 这是第二个演示 (其中包括也许最常用的动画、 影响等事件)。 只是将您的鼠标光标移到形象上。
若要汇总之前,我认为触发器非常类似于 C# 中的扩展方法特性。 唯一的区别是行为是一个组件。 它封装了一些功能,可以附加到另一个组件来扩展其内置的功能.
简单的情况下 Behavior<t> 类是足够用的。 triggerAction<t> 类可用于更为常见的情况下,比起简单的 Behavior<t>. triggerAction<t> 提供了调用方法,一旦事件触发器被激发时,当您使用Behavior<t> 负责所需行为,使用triggerAction<t> 您可以指定事件触发XAML中的操作,您将会看到以下一个演示。
我将创建将应用动画的单击事件触发器。 第一步是创建一个新的类,该类继承自泛型 triggerAction<t> 类。
1: public class Wavetrigger : triggerAction<FrameworkElement>
2: {
3: protected override void Invoke(object parameter)
4: {
5: this.waveStoryboard.begin();
6: }
7: }
正如您所看到的 Invoke 方法是唯一的方法,但必须在您的触发器中。 但通常在实践中您将需要重写此类的其他几种方法。 在我们的触发器的构造函数中,我需要配置动画和过程的摘要。
1: public Wavetrigger() :
2: base()
3: {
4: this.waveAnimation = new DoubleAnimation();
5: this.waveStoryboard = new Storyboard();
6: this.waveEffect = new WaveEffect();
7: this.Initializetrigger();
8: this.waveAnimation.AutoReverse = false;
9: this.waveStoryboard.Children.Add( this.waveAnimation );
10: }
11:
12: private void Initializetrigger()
13: {
14: this.waveAnimation.From = -this.WaveFrequency;
15: this.waveAnimation.To = this.WaveFrequency;
16: this.waveAnimation.Duration = this.WaveDuration;
17: }
要设置该动画的对象,以及该动画的属性,您需要重写OnAttached 方法。 如果您试图这样做,例如在构造函数中你是不会成功的,因为关联的对象仍是未知对象。
1: protected override void OnAttached()
2: {
3: base.onAttached();
4:
5: this.AssociatedObject.Effect = this.waveEffect;
6: Storyboard.SetTarget( this.waveAnimation,this.AssociatedObject.Effect );
7: Storyboard.SetTargetProperty( this.waveAnimation,new PropertyPath( WaveEffect.WavinessProperty ) );
8: }
为了使用我会加上 Wavetrigger,它可配置 (持续时间和频率)的几个依赖属性。 我们的触发器的最后一步是应用到 XAML 中。
1: <Image Stretch="Fill"
2: source="Photos/Image3.jpg">
3: <interactivity:Interaction.triggers>
4: <interactivity:Eventtrigger EventName="MouSELEftButtonUp">
5: <local:Wavetrigger WaveFrequency="1.9" WaveDuration="00:00:05"/>
6: </interactivity:Eventtrigger>
7: </interactivity:Interaction.triggers>
8: </Image>
在这里,您可以看到我们的触发器的结果 只需单击该图像,该触发器将被执行。
第三个类型的行为是由泛型 TargetedtriggerAction<t>提供的类。 它表示操作时可以面向一个完全不同的对象,而不是其关联的对象的影响。 它允许您将触发器关联从一个对象到另一个对象,操作完全不同的元素。 例如在跟着下来的演示,我将用一个的按钮关联目标的触发器,它将被翻转,第一步要创建一个新的类,该类继承自 TargetedtriggerAction<t>是一个 image.Again 类。
1: public class TurnImageTargetedtrigger : TargetedtriggerAction<FrameworkElement>
2: {
3: protected override void Invoke(object parameter)
4: {
5:
6: }
7: protected override void OnAttached()
8: {
9: base.onAttached();
10: (this.AssociatedObject as FrameworkElement).Loaded += new RoutedEventHandler(TurnImageTargetedtrigger_Loaded);
11: }
12: protected override void OnDetaching()
13: {
14: base.onDetaching();
15: (this.AssociatedObject as FrameworkElement).Loaded -= new RoutedEventHandler(TurnImageTargetedtrigger_Loaded);
16: }
17: private void TurnImageTargetedtrigger_Loaded(object sender,RoutedEventArgs E)
18: {
19:
20: }
21: }
在这里目标对象可以访问关联的对象在加载的时候,这就是为什么我要附加 Loaded 事件到相关联对象。 此外必须定义一个 Invoke 方法,启动动画的方法。触发器已准备就绪后,我们要在 XAML 中使用它。 在以下代码片段中,您可以查看。
1: <Image x:Name="imgToFlip" Stretch="Fill"
2: source="Photos/Image4.jpg"/>
3: <Button Content="TurnImage" FontSize="14" FontFamily="{Staticresource PriMaryFontFamily}"
4: Grid.Row="1" Width="100" @H_530_243@margin="0,5,0">
5: <interactivity:Interaction.triggers>
6: <interactivity:Eventtrigger EventName="Click">
7: <local:TurnImageTargetedtrigger TargetName="imgToFlip"/>
8: </interactivity:Eventtrigger>
9: </interactivity:Interaction.triggers>
10: </Button>
下图可以看到该演示。
我们的行为 (触发器) 可以直接使用在 XAML 中或通过 Expression Blend 3 @L_489_3@它。
一旦@L_489_3@了,就可以在任何元素行为中使用到对象的内部。
您可以调整行为的相关东西(设置属性,激发事件,等等)在 属性 窗口中。
如果您只创建了行为到当前的解决方案中,Expression Blend 的行为资料库本身已有几个其他行为,如果您希望自己的自定义行为也列出到所有 Blend 项目中,您需要在注册表中注册程序集。 您需要使用 注册表编辑器 中去到以下路径进行编辑:
HKEY_CURRENT_USER (或 HKEY_LOCAL_MACHINE) 的 /Software/Microsoft/Expression/Blend/v3.0/ToolBox/Silverlight/v3.0
8.使用 DefaulttriggerAttribute
在默认情况下创建一个新的 triggerAction 时 Expression Blend 将其关联 @H_881_21@mouSELEftButtonDown 事件,如果 @H_881_21@mouSELEftButtonDown 不可用的时候,它会在 Loaded 事件中. 但有时您可能希望与不同的默认事件作自定义操作。 那么您应使用 DefaulttriggerAttibute:
1: [Defaulttrigger(typeof(UIElement),typeof(Eventtrigger),"MouSELEftButtonDown")]
2: [Defaulttrigger(typeof(ButtonBasE),"Click")]
3: public class WaveAction : triggerAction<UIElement> { }
如果把 WaveAction 拖放到一个 Button上,操作将创建一个 单击 Eventtrigger。 但是,如果把 WaveAction 拖放到任何其他 UIElement 上,将会创建 @H_881_21@mouSELEftButtonDown 触发器。
9.使用 TypeConsTraintAttribute
您可以使用 TypeConsTraintAttribute 指定对 TargetedtriggerAction 及 EventtriggerBase AssociatedObject的类型约束。
结束语
@L_489_3@ Silverlight 3 中的行为的目的有两个。 首先,行为是因为在 Silverlight 中缺少触发器的解决方法。 它们允许减少 WPF 和 Silverlight 之间的差异。 第二,它们允许无需编写任何代码就可以@L_489_3@交互性设计。 我喜欢行为,肯定会使用它们在我未来的任何项目 这篇文章介绍了一些基础。 我希望对您有所帮助。 Expression Blend 的 官方站点 中,您可以找到更多可供使用的许多特效。 也请参阅 参考资料 部分的详细信息。
欢迎您参与更多关于此话题的讨论,本文原创地址为:http://funsl.com admin博客
以上是大佬教程为你收集整理的Silverlight行为,触发器,图片特效全部内容,希望文章能够帮你解决Silverlight行为,触发器,图片特效所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。