在前一阵子,我在网上找到了这个相册DEMO,其不仅支持图相册图片的顺(逆)序浏览,还支持简单的图片处理(放大缩小Zoom,旋转Rotate,透明Transparency),在图片上打水印以及使用Ink在图片上涂鸭。
在线演示:
下面就是它的一些演示截图。
首先是缩放,旋转和透明处理:
首先是缩放,旋转和透明处理:
然后是使用Ink的涂鸭:
<
ControlTemplate
xmlns
="http://schemas.microsoft.com/client/2007"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" >
Grid x:Name ="Part_Root" MouseEnter ="btnClearMouseEnter" MouseLeave ="btnClearMouseLeave"
MouseLeftButtonDown ="btnClearMouseDown" MouseLeftButtonUp ="btnClearMouseUp"
Grid.Resources
Storyboard ="Part_MouseEnter" /> ="Part_MouseDown" ="Part_MouseUp" ="Part_MouseLeave" </ Rectangle ="Part_BackgroundRect" TextBlock ="Part_Caption" ="Part_ForegroundRect" ="Part_HighlightRect" Grid
ControlTemplate
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" >
Grid x:Name ="Part_Root" MouseEnter ="btnClearMouseEnter" MouseLeave ="btnClearMouseLeave"
MouseLeftButtonDown ="btnClearMouseDown" MouseLeftButtonUp ="btnClearMouseUp"
Grid.Resources
Storyboard ="Part_MouseEnter" /> ="Part_MouseDown" ="Part_MouseUp" ="Part_MouseLeave" </ Rectangle ="Part_BackgroundRect" TextBlock ="Part_Caption" ="Part_ForegroundRect" ="Part_HighlightRect" Grid
ControlTemplate
从上面代码可以看出其采用控件模版的方式进行定义。但其鼠标在按钮上移入移出等状态的Storyboard(故事板)并未进行定义。而肯体的实现被放在了相应的子类(Button.xaml和RepeatButton.xaml)进行实现。下面就是其中的Button.xaml内容:
MouseLeftButtonDown
ColorAnimation Duration ="00:00:00.25" To ="#3DFFFFFF" Storyboard.TargetName ="Part_HighlightRect"
Storyboard.TargetProperty ="(Shape.Fill).(SolidColorBrush.Color)" Storyboard ="00:00:00.2" ="#22000000" ="#00FFFFFF" ="Part_BackgroundRect" strokeThickness ="4" RadiusX ="16" RadiusY ="36" stroke ="#46000000" Rectangle.Fill LinearGradientBrush EndPoint ="0.5,-0.4" StartPoint
GradientStop Color ="Gray" Offset ="0.242" ="DarkBlue" ="0.333" LinearGradientBrush Rectangle ="Part_Caption" VerticalAlignment ="Center" HorizontalAlignment
Foreground ="Gold" Text ="Button" TextBlock.RenderTransform TranslateTransform X ="0" Y ="-2" TextBlock ="Part_ForegroundRect" ="Top"
RadiusY Width ="124" Height ="32" ="0.13" ="#FFFFFFFF" ="1" VerticalAlignment Fill x:Name
注:这样设计方式本人感觉很有意思,很有“面向对象”的味道,呵呵。
下面简要浏览一下ButtonBase.xaml.cs的代码:
下面简要浏览一下ButtonBase.xaml.cs的代码:
[TemplatePart(Name
=
"
Part_Root
"
, Type
typeof
(Panel))]
[TemplatePart(Name Part_Caption (TextBlock))]
[TemplatePart(Name Part_ForegroundRect (Rectangle))]
[TemplatePart(Name Part_BackgroundRect Part_HighlightRect Part_MouseEnter (Storyboard))]
[TemplatePart(Name Part_MouseLeave Part_MouseDown Part_MouseUp (Storyboard))]
public abstract partial class ButtonBase : Control
{
/// <summary>
定义单击事件
</summary>
event EventHandler Click;
执行单击事件的绑定方法
protected void OnClick()
{
if (Click != null )
{
Click( this new EventArgs());
}
}
标题属性
string Caption
{
get { return .Part_Caption.Text; }
set .Part_Caption.Text value; }
}
鼠标移入控件区域时启动Part_MouseEnter故事板,下面类似
</summary> <param name="sender"></param> <param name="e"></param> virtual Part_Root_MouseEnter( object sender, MouseEventArgs e)
{
Part_MouseEnter.Begin();
}
Part_Root_MouseLeave( Part_Root_MouseLeftButtonDown( Part_Root_MouseLeftButtonUp( // 执行单击事件的绑定方法 OnClick();
}
Storyboard Part_MouseEnter, Part_MouseDown, Part_MouseLeave, Part_MouseUp;
Rectangle Part_ForegroundRect, Part_BackgroundRect, Part_HighlightRect;
Panel Part_Root;
TextBlock Part_Caption;
}
[TemplatePart(Name Part_Caption (TextBlock))]
[TemplatePart(Name Part_ForegroundRect (Rectangle))]
[TemplatePart(Name Part_BackgroundRect Part_HighlightRect Part_MouseEnter (Storyboard))]
[TemplatePart(Name Part_MouseLeave Part_MouseDown Part_MouseUp (Storyboard))]
public abstract partial class ButtonBase : Control
{
/// <summary>
定义单击事件
</summary>
event EventHandler Click;
执行单击事件的绑定方法
protected void OnClick()
{
if (Click != null )
{
Click( this new EventArgs());
}
}
标题属性
string Caption
{
get { return .Part_Caption.Text; }
set .Part_Caption.Text value; }
}
鼠标移入控件区域时启动Part_MouseEnter故事板,下面类似
</summary> <param name="sender"></param> <param name="e"></param> virtual Part_Root_MouseEnter( object sender, MouseEventArgs e)
{
Part_MouseEnter.Begin();
}
Part_Root_MouseLeave( Part_Root_MouseLeftButtonDown( Part_Root_MouseLeftButtonUp( // 执行单击事件的绑定方法 OnClick();
}
Storyboard Part_MouseEnter, Part_MouseDown, Part_MouseLeave, Part_MouseUp;
Rectangle Part_ForegroundRect, Part_BackgroundRect, Part_HighlightRect;
Panel Part_Root;
TextBlock Part_Caption;
}
其实上面的代码与我们平时写.net控件类似,也是属性事件的定义。当然不同的地方就是对故事板的使用,
而故事板会让我们的按钮在鼠标触发事件时在UI上看起来更酷。当然下面还要看一下相应的Button中的内容,因
为这才是实际运行时使用的控件,其代码如下:
而故事板会让我们的按钮在鼠标触发事件时在UI上看起来更酷。当然下面还要看一下相应的Button中的内容,因
为这才是实际运行时使用的控件,其代码如下:
Button : ButtonBase
{
Button()
{
加载Button.xaml中的内容,为下面获取元素进行相应操作 xaml ResourceHelper.GetTemplate( .GetType());
ControlTemplate template (ControlTemplate)XamlReader.Load(xaml);
.Template template;
.ApplyTemplate();
}
对当前模板(xaml)中的元素进行(主要是鼠标)事件绑定
override OnApplyTemplate()
{
Part_Root (Panel)GetTemplateChild( );
Part_Caption (TextBlock)GetTemplateChild( );
Part_ForegroundRect (Rectangle)GetTemplateChild( );
Part_BackgroundRect );
Part_HighlightRect );
Part_MouseEnter (Storyboard)GetTemplateChild( );
Part_MouseLeave );
Part_MouseDown );
Part_MouseUp );
Part_Root.SizeChanged += SizeChangedEventHandler(Part_Root_SizeChanged);
Part_Root.MouseEnter MouseEventHandler(Part_Root_MouseEnter);
Part_Root.MouseLeave MouseEventHandler(Part_Root_MouseLeave);
Part_Root.MouseLeftButtonDown MouseButtonEventHandler(Part_Root_MouseLeftButtonDown);
Part_Root.MouseLeftButtonUp MouseButtonEventHandler(Part_Root_MouseLeftButtonUp);
}
按钮的实际高度或宽度发生变化时的处理事件
Part_Root_SizeChanged( Part_Root.ActualWidth - 16d;
Part_ForegroundRect.Height Part_Root.ActualHeight 12d;
Part_HighlightRect.Width 10d;
Part_HighlightRect.Height 8d;
(Part_Root.ActualWidth > Part_Root.ActualHeight)
{
Part_BackgroundRect.RadiusX Part_ForegroundRect.RadiusX Part_HighlightRect.RadiusX
Part_Root.ActualHeight / 2d;
Part_BackgroundRect.RadiusY Part_ForegroundRect.RadiusY Part_HighlightRect.RadiusY
Part_Root.ActualWidth 4d;
}
else
{
Part_BackgroundRect.RadiusX 4d;
Part_BackgroundRect.RadiusY 2d;
}
}
}
{
Button()
{
加载Button.xaml中的内容,为下面获取元素进行相应操作 xaml ResourceHelper.GetTemplate( .GetType());
ControlTemplate template (ControlTemplate)XamlReader.Load(xaml);
.Template template;
.ApplyTemplate();
}
对当前模板(xaml)中的元素进行(主要是鼠标)事件绑定
override OnApplyTemplate()
{
Part_Root (Panel)GetTemplateChild( );
Part_Caption (TextBlock)GetTemplateChild( );
Part_ForegroundRect (Rectangle)GetTemplateChild( );
Part_BackgroundRect );
Part_HighlightRect );
Part_MouseEnter (Storyboard)GetTemplateChild( );
Part_MouseLeave );
Part_MouseDown );
Part_MouseUp );
Part_Root.SizeChanged += SizeChangedEventHandler(Part_Root_SizeChanged);
Part_Root.MouseEnter MouseEventHandler(Part_Root_MouseEnter);
Part_Root.MouseLeave MouseEventHandler(Part_Root_MouseLeave);
Part_Root.MouseLeftButtonDown MouseButtonEventHandler(Part_Root_MouseLeftButtonDown);
Part_Root.MouseLeftButtonUp MouseButtonEventHandler(Part_Root_MouseLeftButtonUp);
}
按钮的实际高度或宽度发生变化时的处理事件
Part_Root_SizeChanged( Part_Root.ActualWidth - 16d;
Part_ForegroundRect.Height Part_Root.ActualHeight 12d;
Part_HighlightRect.Width 10d;
Part_HighlightRect.Height 8d;
(Part_Root.ActualWidth > Part_Root.ActualHeight)
{
Part_BackgroundRect.RadiusX Part_ForegroundRect.RadiusX Part_HighlightRect.RadiusX
Part_Root.ActualHeight / 2d;
Part_BackgroundRect.RadiusY Part_ForegroundRect.RadiusY Part_HighlightRect.RadiusY
Part_Root.ActualWidth 4d;
}
else
{
Part_BackgroundRect.RadiusX 4d;
Part_BackgroundRect.RadiusY 2d;
}
}
}
到这里还有另一个按钮控件RepeatButton没有介绍,其实它的内容也上面的Button代码相似,所以就不多介绍了。
当然RepeatButton最终的用处是被放在了ImageSelector控件中做为子控制被加载,这其中与我们开发“复合型”控件
相似。
下面就是Button控制的运行效果,如下所示:
呵呵。
好了,今天的内容就先到这里了。
tag:silverlight,button,imagesnipper
tag:silverlight,button,imagesnipper
作者:代震军,daizhj
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。