
在SnipperImages中为了进行图片列表导航(前后方向)设计了ImageSelector控件,而这个控件不同于
之前介绍过的button,CheckBox,SlIDer,主要是其xaml中的UI元素变得数量庞大且行为更加复杂。所以通过
了解这个控件,我们能够更好的熟悉StoryBoard,Path,ImageBrush,Scaletransform,Translatetransform
等对象及属性的使用场景。
首先来看一下DEMO运行效果:
显示一张图片所使用的ui元素如下所示(其中之一):
< Path x:name ="leftimg3" stroke ="White" MouseleftbuttonDown ="OnimgClicked" >
< Path.Data >
< PathGeometry >
< Pathfigure x:name ="pathfigure_leftimg3" IsClosed ="True" StartPoint ="130,15" >
< linesegment x:name ="line1_leftimg3" Point ="250,25" />
< linesegment x:name ="line2_leftimg3" Point ="250,95" />
< linesegment x:name ="line3_leftimg3" Point ="130,115" />
</ Pathfigure >
</ PathGeometry >
</ Path.Data >
< Path.Fill >
< ImageBrush x:name ="leftimg3Brush" Stretch ="Fill" />
</ Path.Fill >
</ Path >
大家发现了,上面的内容只是可以正常显示一个图像(通过设置leftimg3Brush的ImageSource属性)而
在每一个图片下方都会有一个倒影效果,其使用的就是Scaletransform,其代码布局如下:
< Path x:name ="left3Reflection" stroke ="White" >
< Path.Data >
< PathGeometry >
< Pathfigure x:name ="pathfigure_left3Reflection" IsClosed ="True" StartPoint ="130,120" >
< linesegment x:name ="line1_left3Reflection" Point ="250,100" />
< linesegment x:name ="line2_left3Reflection" Point ="250,170" />
< linesegment x:name ="line3_left3Reflection" Point ="130,190" />
</ Pathfigure >
</ PathGeometry >
</ Path.Data >
< Path.Fill >
< ImageBrush x:name ="leftReflection3Brush" Stretch ="Fill" >
< ImageBrush.relativetransform >
< transformGroup >
<!-- 实现投影效果 -->
< Scaletransform ScaleX ="1" ScaleY ="-1" />
< Translatetransform Y ="1" />
</ transformGroup >
</ ImageBrush.relativetransform >
</ ImageBrush >
</ Path.Fill >
< Path.OpacityMask >
< linearGradIEntBrush StartPoint ="0.5,0" EndPoint ="0.5,1" >
< linearGradIEntBrush.GradIEntStops >
< GradIEntStop Offset ="0.0" color ="#2F000000" />
< GradIEntStop Offset ="1.0" color ="#00000000" />
</ linearGradIEntBrush.GradIEntStops >
</ linearGradIEntBrush >
</ Path.OpacityMask >
</ Path >
而有关如何实现倒影效果可以参考 这篇文章。当然如果使用BLEND来制作倒影效果会更容易,但不知道为
什么,目前的BLEND还无法实现对子对象的属性设置(因为上面的XAML代码被放在了PATH对象中,而BLEND
在可视状态下只能看到PATH那一层的对象,而无法设置ImageBrush="leftReflection2Brush"这个对象)。
有了7个path对象加载图像(使用里面的ImageBrush的ImageSource属性)。还有7个path对象分别对应
实现7个图像的倒影效果。也就是下图中所显示的:
当然除此以外,还有2组PATH对象分别是:
lastimgBrush,lastReflectionBrush:用于当点击右侧导航按钮时,设置为当前分页下最右侧图像,以
避免出现图片为空(空框)的情况。
避免出现图片为空(空框)的情况。
有了这些静态的UI元素之后,我们还需要让其动起来,所以要用到StoryBoard(故事板)。而有关该内容
介绍可参见如下链接:使用silverlight中的Storyboard实现动画效果
因为本DEMO中用的是PointAnimation(当动画值的变化[FROM ...TO...]类型是 Point型时使用),所以这
里直接就把相应的Xaml代码放在这里了,代码很简单。
首先是当点击右侧导航按钮时的Storyboard代码:
Code
<Storyboard x:name='flowForward' Completed='onForwardFlowCompleted'>
<PointAnimation Storyboard.Targetname='pathfigure_centerimg' Storyboard.TargetProperty='StartPoint' From='250,15' To='330,5' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_centerimg' Storyboard.TargetProperty='Point' From='370,25' To='470,5' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_centerimg' Storyboard.TargetProperty='Point' From='370,95' To='470,145' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_centerimg' Storyboard.TargetProperty='Point' From='250,115' To='330,145' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_centerReflection' Storyboard.TargetProperty='StartPoint' From='250,120' To='330,155' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_centerReflection' Storyboard.TargetProperty='Point' From='370,100' To='470,155' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_centerReflection' Storyboard.TargetProperty='Point' From='370,170' To='490,195' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_centerReflection' Storyboard.TargetProperty='Point' From='250,190' To='310,195' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_rightimg1' Storyboard.TargetProperty='StartPoint' From='330,5' To='430,25' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_rightimg1' Storyboard.TargetProperty='Point' From='470,5' To='550,15' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_rightimg1' Storyboard.TargetProperty='Point' From='470,145' To='550,115' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_rightimg1' Storyboard.TargetProperty='Point' From='330,145' To='430,95' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_right1Reflection' Storyboard.TargetProperty='StartPoint' From='330,155' To='430,100' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_right1Reflection' Storyboard.TargetProperty='Point' From='470,155' To='550,120' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_right1Reflection' Storyboard.TargetProperty='Point' From='490,195' To='550,190' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_right1Reflection' Storyboard.TargetProperty='Point' From='310,195' To='430,170' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_rightimg2' Storyboard.TargetProperty='StartPoint' From='430,25' To='500,25' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_rightimg2' Storyboard.TargetProperty='Point' From='550,15' To='620,15' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_rightimg2' Storyboard.TargetProperty='Point' From='550,115' To='620,115' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_rightimg2' Storyboard.TargetProperty='Point' From='430,95' To='500,95' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_right2Reflection' Storyboard.TargetProperty='StartPoint' From='430,100' To='500,100' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_right2Reflection' Storyboard.TargetProperty='Point' From='550,120' To='620,120' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_right2Reflection' Storyboard.TargetProperty='Point' From='550,190' To='620,190' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_right2Reflection' Storyboard.TargetProperty='Point' From='430,170' To='500,170' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_rightimg3' Storyboard.TargetProperty='StartPoint' From='500,25' To='550,25' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_rightimg3' Storyboard.TargetProperty='Point' From='620,15' To='670,15' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_rightimg3' Storyboard.TargetProperty='Point' From='620,115' To='670,115' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_rightimg3' Storyboard.TargetProperty='Point' From='500,95' To='550,95' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_right3Reflection' Storyboard.TargetProperty='StartPoint' From='500,100' To='550,100' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_right3Reflection' Storyboard.TargetProperty='Point' From='620,120' To='670,120' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_right3Reflection' Storyboard.TargetProperty='Point' From='620,190' To='670,190' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_right3Reflection' Storyboard.TargetProperty='Point' From='500,170' To='550,170' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_leftimg1' Storyboard.TargetProperty='StartPoint' From='180,15' To='250,15' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_leftimg1' Storyboard.TargetProperty='Point' From='300,25' To='370,25' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_leftimg1' Storyboard.TargetProperty='Point' From='300,95' To='370,95' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_leftimg1' Storyboard.TargetProperty='Point' From='180,115' To='250,115' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_left1Reflection' Storyboard.TargetProperty='StartPoint' From='180,120' To='250,120' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_left1Reflection' Storyboard.TargetProperty='Point' From='300,100' To='370,100' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_left1Reflection' Storyboard.TargetProperty='Point' From='300,170' To='370,170' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_left1Reflection' Storyboard.TargetProperty='Point' From='180,190' To='250,190' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_leftimg2' Storyboard.TargetProperty='StartPoint' From='130,15' To='180,15' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_leftimg2' Storyboard.TargetProperty='Point' From='250,25' To='300,25' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_leftimg2' Storyboard.TargetProperty='Point' From='250,95' To='300,95' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_leftimg2' Storyboard.TargetProperty='Point' From='130,115' To='180,115' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_left2Reflection' Storyboard.TargetProperty='StartPoint' From='130,120' To='180,120' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_left2Reflection' Storyboard.TargetProperty='Point' From='250,100' To='300,100' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_left2Reflection' Storyboard.TargetProperty='Point' From='250,170' To='300,170' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_left2Reflection' Storyboard.TargetProperty='Point' From='130,190' To='180,190' Duration='0:0:0.5'/>
</Storyboard>
然后是点击左侧导航时的StoryBoard代码:
Code
<Storyboard x:name='flowBackward' Completed='onBackwardFlowCompleted'>
<PointAnimation Storyboard.Targetname='pathfigure_centerimg' Storyboard.TargetProperty='StartPoint' From='430,25' To='330,5' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_centerimg' Storyboard.TargetProperty='Point' From='550,15' To='470,5' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_centerimg' Storyboard.TargetProperty='Point' From='550,115' To='470,145' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_centerimg' Storyboard.TargetProperty='Point' From='430,95' To='330,145' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_centerReflection' Storyboard.TargetProperty='StartPoint' From='430,100' To='330,155' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_centerReflection' Storyboard.TargetProperty='Point' From='550,120' To='470,155' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_centerReflection' Storyboard.TargetProperty='Point' From='550,190' To='490,195' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_centerReflection' Storyboard.TargetProperty='Point' From='430,170' To='310,195' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_leftimg1' Storyboard.TargetProperty='StartPoint' From='330,5' To='250,15' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_leftimg1' Storyboard.TargetProperty='Point' From='470,5' To='370,25' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_leftimg1' Storyboard.TargetProperty='Point' From='470,145' To='370,95' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_leftimg1' Storyboard.TargetProperty='Point' From='330,145' To='250,115' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_left1Reflection' Storyboard.TargetProperty='StartPoint' From='330,155' To='250,120' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_left1Reflection' Storyboard.TargetProperty='Point' From='470,155' To='370,100' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_left1Reflection' Storyboard.TargetProperty='Point' From='490,195' To='370,170' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_left1Reflection' Storyboard.TargetProperty='Point' From='310,195' To='250,190' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_leftimg2' Storyboard.TargetProperty='StartPoint' From='250,15' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_leftimg2' Storyboard.TargetProperty='Point' From='370,25' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_leftimg2' Storyboard.TargetProperty='Point' From='370,95' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_leftimg2' Storyboard.TargetProperty='Point' From='250,115' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_left2Reflection' Storyboard.TargetProperty='StartPoint' From='250,120' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_left2Reflection' Storyboard.TargetProperty='Point' From='370,100' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_left2Reflection' Storyboard.TargetProperty='Point' From='370,170' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_left2Reflection' Storyboard.TargetProperty='Point' From='250,190' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_leftimg3' Storyboard.TargetProperty='StartPoint' From='180,15' To='130,15' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_leftimg3' Storyboard.TargetProperty='Point' From='300,25' To='250,25' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_leftimg3' Storyboard.TargetProperty='Point' From='300,95' To='250,95' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_leftimg3' Storyboard.TargetProperty='Point' From='180,115' To='130,115' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_left3Reflection' Storyboard.TargetProperty='StartPoint' From='180,120' To='130,120' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_left3Reflection' Storyboard.TargetProperty='Point' From='300,100' To='250,100' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_left3Reflection' Storyboard.TargetProperty='Point' From='300,170' To='250,170' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_left3Reflection' Storyboard.TargetProperty='Point' From='180,190' To='130,190' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_rightimg1' Storyboard.TargetProperty='StartPoint' From='500,25' To='430,25' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_rightimg1' Storyboard.TargetProperty='Point' From='620,15' To='550,15' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_rightimg1' Storyboard.TargetProperty='Point' From='620,115' To='550,115' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_rightimg1' Storyboard.TargetProperty='Point' From='500,95' To='430,95' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_right1Reflection' Storyboard.TargetProperty='StartPoint' From='500,100' To='430,100' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_right1Reflection' Storyboard.TargetProperty='Point' From='620,120' To='550,120' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_right1Reflection' Storyboard.TargetProperty='Point' From='620,190' To='550,190' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_right1Reflection' Storyboard.TargetProperty='Point' From='500,170' To='430,170' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_rightimg2' Storyboard.TargetProperty='StartPoint' From='550,25' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_rightimg2' Storyboard.TargetProperty='Point' From='670,15' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_rightimg2' Storyboard.TargetProperty='Point' From='670,115' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_rightimg2' Storyboard.TargetProperty='Point' From='550,95' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='pathfigure_right2Reflection' Storyboard.TargetProperty='StartPoint' From='550,100' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line1_right2Reflection' Storyboard.TargetProperty='Point' From='670,120' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line2_right2Reflection' Storyboard.TargetProperty='Point' From='670,190' Duration='0:0:0.5'/>
<PointAnimation Storyboard.Targetname='line3_right2Reflection' Storyboard.TargetProperty='Point' From='550,170' Duration='0:0:0.5'/>
</Storyboard>
上面的两块xaml代码分别 *** 作UI元素(注意只有六组,而不是七组,因为整体动态效果用六组PATH对象移动即可实现)。
注:目前无法在BLEND下对两个StoryBoard的运行效果进行设计测试,也就是之前BLEND截图中箭头所指示的
"No StoryBoard Open",造成这个问题的原因目前我还不大清楚,有兴趣的朋友不妨也帮助分析一下原因。
到这里,页面上的图象展示元素和StoryBoard就介绍完了,当然还有两个按钮控件(Repeatbutton类型)没有介绍,因为
其功能只是实现按钮事件触发Storyboard运行,而且有关button按钮控件的类继承关系及设计原理我之前已写过一篇文章作
了一些介绍,大家参考一下即可。
好了,xaml内容介绍完了,下面介绍一下CS代码,首先是事件参数声明(详细内容见注释):
/// <summary>
/// ImageSelector事件参数
/// </summary>
public class ImageSelectedEventArgs : EventArgs
{
/// <summary>
/// 当前选择的图片源信息
/// </summary>
public string Source;
/// <summary>
/// 当前选择的图片位图对象
/// </summary>
public BitmAPImage ImageSource;
}
然后是选择图片时的事件处理句柄(关于使用参见接下来的代码):
/// <summary>
/// ImageSelected事件处理句柄
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate voID ImageSelectedEventHandler( object sender, ImageSelectedEventArgs e);
接着是控件的主体类了(详情见注释):
/// <summary>
/// ImageSelector控件类
/// </summary>
public partial class ImageSelector : UserControl
{
/// <summary>
/// 声明ImageSelected事件处理句柄的实例
/// </summary>
public event ImageSelectedEventHandler ImageSelected;
public ImageSelector()
{
InitializeComponent();
// 图像刷数组初始化,用于绑定指定的BitmAPImage信息
imageBrushArray = new ImageBrush[ 7 ]; // 7为当前页图片数
imageBrushArray[ 0 ] = leftimg3Brush;
imageBrushArray[ 1 ] = leftimg2Brush;
imageBrushArray[ 2 ] = leftimg1Brush;
imageBrushArray[ 3 ] = centerimgBrush;
imageBrushArray[ 4 ] = rightimg1Brush;
imageBrushArray[ 5 ] = rightimg2Brush;
imageBrushArray[ 6 ] = rightimg3Brush;
// “倒影效果”图像刷数组初始化,用于绑定指定的BitmAPImage信息
reflectionBrushArray = new ImageBrush[ 7 ]; // 7为当前页图片数
reflectionBrushArray[ 0 ] = leftReflection3Brush;
reflectionBrushArray[ 1 ] = leftReflection2Brush;
reflectionBrushArray[ 2 ] = leftReflection1Brush;
reflectionBrushArray[ 3 ] = centerReflectionBrush;
reflectionBrushArray[ 4 ] = rightReflection1Brush;
reflectionBrushArray[ 5 ] = rightReflection2Brush;
reflectionBrushArray[ 6 ] = rightReflection3Brush;
// 绑定鼠标点击图片(外侧Path对象)后的事件
leftimg3.MouseleftbuttonDown += new MousebuttonEventHandler(OnimgClicked);
leftimg2.MouseleftbuttonDown += new MousebuttonEventHandler(OnimgClicked);
leftimg1.MouseleftbuttonDown += new MousebuttonEventHandler(OnimgClicked);
rightimg3.MouseleftbuttonDown += new MousebuttonEventHandler(OnimgClicked);
rightimg2.MouseleftbuttonDown += new MousebuttonEventHandler(OnimgClicked);
rightimg1.MouseleftbuttonDown += new MousebuttonEventHandler(OnimgClicked);
centerimg.MouseleftbuttonDown += new MousebuttonEventHandler(OnimgClicked);
}
/// <summary>
/// 定义图像点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
voID OnimgClicked( object sender, MousebuttonEventArgs e)
{
ImageSelectedEventArgs args = new ImageSelectedEventArgs();
// 设置事件参数
args.ImageSource = ((Path)sender).Fill.GetValue(ImageBrush.ImageSourceProperty) as BitmAPImage;
// 调用图片选择事件
OnImageSelected(args);
}
/// <summary>
/// 定义图片选择事件
/// </summary>
/// <param name="e"></param>
protected voID OnImageSelected(ImageSelectedEventArgs e)
{
if (ImageSelected != null )
{
// 调用绑定的处理事件代码
ImageSelected( this , e);
}
}
/// <summary>
/// 实始化图像数组并绑定相应的图像Brush
/// </summary>
/// <param name="imageUris"> 图片路径信息 </param>
public voID Setimages( string [] imageUris)
{
imageArray = imageUris;
if (imageArray.Length >= 7 )
{
// 设置当前显示的图片数组的左起索引数
imageIndex = 0 ;
// 绑定相应的图像Brush
UpdateImages();
}
}
/// <summary>
/// 定义“flowForward(前进)”对象(Storyboard类型) 的Completed处理事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
voID onForwardFlowCompleted( object sender, EventArgs e)
{
// 当storyboard动画效果完成时置为NulL
firstimgBrush.ImageSource = null ;
lastimgBrush.ImageSource = null ;
firstReflectionBrush.ImageSource = null ;
lastReflectionBrush.ImageSource = null ;
}
/// <summary>
/// 定义“flowBackward(后退)”对象(Storyboard类型) 的Completed处理事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
voID onBackwardFlowCompleted( object sender, EventArgs e)
{
// 当storyboard动画效果完成时置为NulL
firstimgBrush.ImageSource = null ;
lastimgBrush.ImageSource = null ;
firstReflectionBrush.ImageSource = null ;
lastReflectionBrush.ImageSource = null ;
}
/// <summary>
/// “后退”按钮点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
voID btnBack_Click( object sender, EventArgs e)
{
if (imageIndex != - 1 )
{
// 更新最左侧图像刷和“倒影”对象,使其在下面storyboard运动过程中逐渐被遮盖
firstimgBrush.ImageSource = new BitmAPImage(new Uri(imageArray[imageIndex],
UriKind.relativeOrabsolute));
firstReflectionBrush.ImageSource = new BitmAPImage(new Uri(imageArray[imageIndex],
UriKind.relativeOrabsolute));
// 注:后退方向与我们通常认为的方向相反(通常是imageIndex--),这块不知道是作者的疏忽还是别的原因
imageIndex ++ ;
if (imageIndex == imageArray.Length)
{
imageIndex = 0 ;
}
UpdateImages();
// 运行"后退"storyboard效果
flowBackward.Begin();
}
}
/// <summary>
/// “前进”按钮点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
voID btnForward_Click( object sender, EventArgs e)
{
if (imageIndex != - 1 )
{
// 更新最右侧图像刷和“倒影”对象,使其在下面storyboard运动过程中逐渐被遮盖
lastimgBrush.ImageSource = new BitmAPImage(new Uri(imageArray[(imageIndex + 6) %
imageArray.Length], UriKind.relativeOrabsolute));
lastReflectionBrush.ImageSource = new BitmAPImage(new Uri(imageArray[(imageIndex + 6) %
imageArray.Length], UriKind.relativeOrabsolute));
// 注:前进方向与我们通常认为方向相反(通常是imageIndex++),这块不知道是作者的疏忽还是别的原因
imageIndex -- ;
if (imageIndex < 0 )
{
imageIndex = imageArray.Length - 1 ;
}
UpdateImages();
// 运行"前进"storyboard效果
flowForward.Begin();
}
}
/// <summary>
/// 绑定相应的图像Brush
/// </summary>
voID UpdateImages()
{
int brushIndex = imageIndex;
for ( int i = 0 ; i < 7 ; i ++ )
{
// 加载图像信息
imageBrushArray[i].ImageSource = new BitmAPImage(new Uri(imageArray[brushIndex],
UriKind.relativeOrabsolute));
reflectionBrushArray[i].ImageSource = new BitmAPImage(new Uri(imageArray[brushIndex],
UriKind.relativeOrabsolute));
brushIndex ++ ;
// 当到达最大长度时,则清零(回到起始位置,实现循环效果)
if (brushIndex == imageArray.Length)
{
brushIndex = 0 ;
}
}
}
/// <summary>
/// 图像刷数组用于绑定(显示)指定的BitmAPImage信息
/// </summary>
private ImageBrush[] imageBrushArray;
/// <summary>
/// "倒影"效果图像刷数组
/// </summary>
private ImageBrush[] reflectionBrushArray;
/// <summary>
/// 图片路径信息数组
/// </summary>
private string [] imageArray;
/// <summary>
/// 当前显示的图片数组的左起索引数
/// </summary>
private int imageIndex = - 1 ;
}
上面的控件类主要是实现了初始化属性成员(图片数组)和相应UI元素事件的绑定(MouseleftbuttonDown),
然后是相应的事件处理代码(前进,后退按钮事件)。当然在实现上我个人认为还有一些问题(在注释中已说明)。
但总体上代码布局还是很清爽的。
下面即是本文开头DEMO页面的xaml代码(源码包中的Page3.xaml):
Code
<!--控件声明-->
<ctl:ImageSelector x:name='imageSelector' ImageSelected='OnImageSelected' Canvas.top='400' Loaded='imageSelector_Loaded'/>
<!--当用户点某一图片时显示元素-->
<InkPresenter x:name="snipCanvas" Background="#80F5F5DC" Opacity="0" Canvas.left="100" Canvas.top="70" WIDth="600" Height="430" Cursor="Hand">
<InkPresenter.Resources>
<Storyboard x:name="snipCanvasFadeIn">
<DoubleAnimation Storyboard.Targetname="snipCanvas" Storyboard.TargetProperty="Opacity" From="0.0" To="1.0" Duration='0:0:0.5'/>
<DoubleAnimation Storyboard.Targetname="snipCanvasScale" Storyboard.TargetProperty="ScaleX" From="0.0" To="1.0" Duration='0:0:0.5'/>
<DoubleAnimation Storyboard.Targetname="snipCanvasScale" Storyboard.TargetProperty="ScaleY" From="0.0" To="1.0" Duration='0:0:0.5'/>
</Storyboard>
<Storyboard x:name="snipCanvasFadeOut">
<DoubleAnimation Storyboard.Targetname="snipCanvas" Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration='0:0:0.5'/>
<DoubleAnimation Storyboard.Targetname="snipCanvasScale" Storyboard.TargetProperty="ScaleX" From="1.0" To="0.0" Duration='0:0:0.5'/>
<DoubleAnimation Storyboard.Targetname="snipCanvasScale" Storyboard.TargetProperty="ScaleY" From="1.0" To="0.0" Duration='0:0:0.5'/>
</Storyboard>
</InkPresenter.Resources>
<InkPresenter.Rendertransform>
<Scaletransform x:name="snipCanvasScale" ScaleX="0.0" ScaleY="0.0" CenterX="300" CenterY="215"/>
</InkPresenter.Rendertransform>
<Canvas Canvas.left="577" Canvas.top="3" WIDth="20" Height="20" Background="Crimson" MouseleftbuttonUp="onExitMouseUp">
<line X1="4" Y1="4" X2="16" Y2="16" stroke="White" strokeThickness="3" />
<line X1="16" Y1="4" X2="4" Y2="16" stroke="White" strokeThickness="3" />
</Canvas>
<Image x:name="snipImage" Canvas.left="10" Canvas.top="40"
WIDth="580" Height="380" Stretch="Uniform" />
</InkPresenter>
而相应的CS代码如下所示:
voID imageSelector_Loaded( object sender, RoutedEventArgs e)
{
string baseUri = Application.Current.Host.source.absoluteUri.Substring( 0 ,
Application.Current.Host.source.absoluteUri.LastIndexOf( " / " ));
// 初始化设置图片链接数组
imageSelector.Setimages( new string []
{
String.Concat(baseUri, " /../Images/1.jpg " ),
String.Concat(baseUri, " /../Images/2.jpg " ), " /../Images/3.jpg " ), " /../Images/4.jpg " ), " /../Images/5.jpg " ), " /../Images/6.jpg " ), " /../Images/7.jpg " ), " /../Images/8.jpg " )
});
}
voID OnImageSelected( object sender, ImageSelectedEventArgs e)
{
// 当选择某一图片时,放大显示
snipCanvas.Cursor = Cursors.Hand;
snipCanvasFadeIn.Begin();
snipImage.SetValue(Image.sourceProperty, e.ImageSource);
}
voID onExitMouseUp( object sender, MousebuttonEventArgs e)
{
// 当点击关闭时
snipCanvasFadeOut.Begin();
}
上面代码中的OnImageSelected用于单击某张图片时放大显示,如下图:
好了,今天的内容就先到这里了。
tag:silverlight,imageselector,imagesnipper
作者:代震军,daizhj
原文链接:http://www.cnblogs.com/daizhj/archive/2008/09/10/1288315.HTML
源码下载,请 点击这里:) 总结
以上是内存溢出为你收集整理的SnipperImages(Silverlight DEMO)控件设计之--ImageSelector全部内容,希望文章能够帮你解决SnipperImages(Silverlight DEMO)控件设计之--ImageSelector所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)