本文主要讲述如何在Silverlight2中开发一个自定义控件,我使用环境是VS2008 Silverlight2 Beta2。
一:创建Silverlight2 类库项目,如下图:
然后我们添加一个控件类,该可以继承自Control类,也可以继承自其他类比如ContentControl,ItemControl。我们继承自ContentControl,代码如下:
using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; namespace CarySLCustomControlLib { public class CarySLCustomControl : ContentControl {} }
其实现在已经做好了一个最简单的自定义控件,我们给给他一个控件模板就可以了。在Page.xaml的Grid中添加如下代码:
<custom:CarySLCustomControl> <custom:CarySLCustomControl.Template> <ControlTemplate> <Grid x:Name="RootElement"> <Rectangle x:Name="BodyElement" Width="200" Height="100" Fill="Lavender" Stroke="Purple" RadiusX="16" RadiusY="16" /> <TextBlock Text="Cary Click" HorizontalAlignment="Center"VerticalAlignment="Center" /> </Grid> </ControlTemplate> </custom:CarySLCustomControl.Template> </custom:CarySLCustomControl>
效果如下图:
二:创建控件模板
下面我们为控件提供一个默认的控件模板,像类库项目中添加添加Generic.xaml文件,代码如下:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:custom="clr-namespace:CarySLCustomControlLib;assembly=CarySLCustomControlLib" <Style TargetType="custom:CarySLCustomControl"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="custom:CarySLCustomControl"> <Grid x:Name="RootElement"> <Rectangle x:Name="BodyElement" Width="200" Height="100" Fill="LightCoral" Stroke="Purple" RadiusX="16" RadiusY="16" /> <TextBlock Text="Cary Click" HorizontalAlignment="Center"VerticalAlignment="Center" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary>
向我们的控件类CarySLCustomControl的构造函数中添加如下代码:
this.DefaultStyleKey = typeof(CarySLCustomControl);
在Page.xaml中我们只需要引用控件<custom:CarySLCustomControl/>,就可以达到上面一样的效果了。
三:模板绑定
我们在使用控件的时候都会做响应的属性设定,比如:
<custom:CarySLCustomControl Width="500" Height="500" Background="LightGreen"/>
但是你现在做该设置是不会生效的,还仍然使用控件模板的设定,我们可以在控件模板中通过使用 {TemplateBinding ControlProperty} 的标识扩展句法来绑定到控件的属性来实现,使用ContentPresenter控件可以灵活的设置各个属性。修改后的Generic.xaml的代码如下:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:custom="clr-namespace:CarySLCustomControlLib;assembly=CarySLCustomControlLib"
<Style TargetType="custom:CarySLCustomControl">
<Setter Property="Width" Value="200" />
<Setter Property="Height" Value="100" />
<Setter Property="Background" Value="Lavender" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="custom:CarySLCustomControl">
<Grid x:Name="RootElement">
<Rectangle x:Name="BodyElement" Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}" Fill="{TemplateBinding Background}"
Stroke="Purple" RadiusX="16" RadiusY="16" />
<ContentPresenter Content="{TemplateBinding Content}"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontSize="{TemplateBinding FontSize}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
Page.xaml中更改控件的属性如下:
<custom:CarySLCustomControl Width="250" Height="150" Background="LightGreen"> <custom:CarySLCustomControl.Content> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> <Ellipse Width="75" Height="75" Margin="10"> <Ellipse.Fill> <RadialGradientBrush GradientOrigin="0.25,0.25"> <GradientStop Offset="0.25" Color="LightGray" /> <GradientStop Offset="1.0" Color="DarkGoldenrod" /> </RadialGradientBrush> </Ellipse.Fill> </Ellipse> <TextBlock Text="Cary Click" VerticalAlignment="Center" /> </StackPanel> </custom:CarySLCustomControl.Content> </custom:CarySLCustomControl>
效果如下图:
四:添加一个单击事件
WPF中支持向下和向下的事件路由,路由事件的路由可有效地向上遍历或向下遍历树,这要取决于该事件是隧道路由事件还是冒泡路由事件,而Silverlight中的路由事件只支持冒泡路由策略。下面我们为该控件添加一个单击事件,代码如下:
public class CarySLCustomControl : ContentControl { public event RoutedEventHandler Click; public CarySLCustomControl() { this.DefaultStyleKey = typeof(CarySLCustomControl); this.MouseLeftButtonUp += new MouseButtonEventHandler(CarySLCustomControl_MouseLeftButtonUp); } void CarySLCustomControl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (Click != null) Click(this, new RoutedEventArgs()); }
}
现在我们就可以使用控件的单击事件了,Page.xaml中如下:
<custom:CarySLCustomControl Click="CarySLCustomControl_Click">
Page.xaml.cs中编写事件处理程序如下:
void CarySLCustomControl_Click(Object sender, RoutedEventArgs e) { System.Windows.Browser.HtmlPage.Window.Alert("Click!"); }
运行后如下图:
五:可视化状态
在Silverlight中微软引入一种新的模式来处理事件和用户进行交互,例如当鼠标经过控件时。控件可以从一种状态转换到另一种状态,我们下面就已从"normal" 状态到 "pressed" 状态来进行简单的说明。我们使用Silverlight中的Visual State Manager (VSM)来简化对可视化状态和可视化状态转换之间的处理。使用VisualState对象来定义不同的状态,VisualTransition对象定义状态间的转换。使用VisualStateManager类的静态方法GoToState来控制状态的装换。修改完成后的generic.xaml中的代码如下:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:custom="clr-namespace:CarySLCustomControlLib;assembly=CarySLCustomControlLib" xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"> <Style TargetType="custom:CarySLCustomControl"> <Setter Property="Width" Value="200" /> <Setter Property="Height" Value="100" /> <Setter Property="Background" Value="Lavender" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="custom:CarySLCustomControl"> <Grid x:Name="RootElement"> <vsm:VisualStateManager.VisualStateGroups> <vsm:VisualStateGroup x:Name="CommonStates"> <vsm:VisualStateGroup.Transitions> <vsm:VisualTransition To="Normal" Duration="0:0:0.2"/> <vsm:VisualTransition To="MouseOver" Duration="0:0:0.2"/> </vsm:VisualStateGroup.Transitions> <vsm:VisualState x:Name="Normal" /> <vsm:VisualState x:Name="MouseOver"> <Storyboard> <ColorAnimation Storyboard.TargetName="BodyElement" Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)" To="Pink" Duration="0" /> </Storyboard> </vsm:VisualState> </vsm:VisualStateGroup> </vsm:VisualStateManager.VisualStateGroups> <Rectangle x:Name="BodyElement" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Fill="{TemplateBinding Background}" Stroke="Purple" RadiusX="16" RadiusY="16" /> <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Center"
VerticalAlignment="Center" FontSize="{TemplateBinding FontSize}" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary>
在控件类CarySLCustomControl中添加如下代码:
public CarySLCustomControl() { this.MouseEnter += new MouseEventHandler(CarySLCustomControl_MouseEnter); this.MouseLeave += new MouseEventHandler(CarySLCustomControl_MouseLeave);
}
void CarySLCustomControl_MouseEnter(object sender, MouseEventArgs e) { VisualStateManager.GoToState(this, "MouseOver", true); } void CarySLCustomControl_MouseLeave(object sender, MouseEventArgs e) { VisualStateManager.GoToState(this, "Normal", true); } 这样就可以了。到此一个最简单的控件就开发好了。
发表评论
-
平淡的2007
2007-12-24 08:04 813早上起来,送女朋友去公交车站,然后回来赶紧打开电脑,先 ... -
DreamSpark发布,高校学生免费使用Visual Studio 2008 Professional Edition 等微软软件
2008-02-20 13:23 1410今天上网无意中搜索到学生可以免费使用VS2008专业版,后来又 ... -
坚持学习WF(1):从HelloWorld开始
2008-04-04 16:30 887[置顶]坚持学习WF文章索 ... -
坚持学习WF(2):WF创作模式和设计时工具
2008-04-05 17:19 633[置顶]坚持学习WF文章索 ... -
坚持学习WF(3):WF框架概览
2008-04-08 07:27 781[置顶]坚持学习WF文章索 ... -
坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty)
2008-04-12 00:01 1141[置顶]坚持学习WF文章索引 活动(Activity) 活动 ... -
坚持学习WF(5):自定义活动(CustomActivity)
2008-04-13 15:25 918当WF提供的标准活动不能满足我们的需求的时候,我们就需要定义自 ... -
MOSS点滴(1):如何开发和部署feature
2008-04-16 21:35 834Features 是MOSS 2007以开箱即用的一套新功能, ... -
MOSS点滴(2):自定义Application Page
2008-04-19 20:07 841在MOSS中后台管理的页面都是Application Pag ... -
坚持学习WF(6):开发可复用的宿主程序
2008-04-21 21:45 692我们之前写工作流宿主 ... -
MOSS点滴(3):说说MOSS中的母版页
2008-04-25 21:15 1176MOSS中有两种页面:Site P ... -
MOSS点滴(4):实现Form认证
2008-04-29 21:12 701本文主要参考了网上的一些文章,但有些文章有些地方说的不是很明确 ... -
坚持学习WF(7):流程控制(Flow Control)
2008-04-30 18:10 828本文主要说说WF中和流 ... -
坚持学习WF(8):本地服务之调用外部方法
2008-05-09 08:17 753WF提供了一组核心服务 ... -
MOSS中的WebPart开发
2008-05-10 13:53 1054由于在asp.net1.1的时候asp.net中还没有webp ... -
坚持学习WF(9):本地服务之事件处理
2008-05-28 07:49 792[置顶]坚持学习WF文章索引 一:先来介绍两个活动 Even ... -
坚持学习WF(10):在工作流中使用关联
2008-06-01 13:03 686[置顶]坚持学习WF文章索 ... -
坚持学习WF(11):工作流通信与队列
2008-06-07 15:45 729[置顶]坚持学习WF文章索引 WF 提供的通信模型是构建于 ... -
MOSS中创建自定义内容类型
2008-06-12 20:23 1098一:简要介绍 某类内容 ... -
.NET中IDisposable接口的基本使用
2008-06-15 12:01 943首先来看MSDN中关于这个接口的说明: [ComVisible ...
相关推荐
在开发基于Silverlight的应用程序时,常常会遇到各种挑战,特别是在处理用户输入,尤其是文件上传这类功能时。"TextBoxEx控件"就是为了解决Silverlight 2.0 Beta版本中文件输入问题而诞生的一个解决方案。这个控件...
**Telerik RadControls for Silverlight Beta2** 是一个专门针对微软Silverlight开发平台的UI控件库,由Telerik公司提供。这个库包含了丰富的用户界面元素,旨在帮助开发者快速、高效地构建出交互性强、视觉效果优秀...
在压缩包中,"AgDataGridSetup-8.2.2-Beta2.exe"是安装程序,用于在开发环境中部署和配置AgDataGrid控件。"Readme-说明.htm"文件通常包含了关于这个版本的详细信息,如新特性、已知问题、安装指南等,对于正确使用和...
在Silverlight 2 Beta 1版本中,引入了对多种编程语言的支持,包括Visual Basic、Visual C#、IronRuby和IronPython,这极大地扩展了开发者的工具箱。此外,新版本加强了数据和服务的交互能力,支持JSON、Web Service...
在Silverlight 2版本中,AgDataGrid提供了丰富的功能,包括数据编辑、排序、分组、过滤、行选择和自定义列显示等,极大地增强了用户界面的交互性和数据管理能力。v8.2.3 Beta3是该产品的特定版本,可能包含了一些新...
Silverlight 2 是微软推出的一种富互联网应用程序(RIA)开发技术,它在浏览器中提供类似桌面应用的交互体验。在本文中,我们将逐步学习如何使用Silverlight 2进行开发。 ### 1. 创建基本的Silverlight应用 #### ...
在Silverlight Beta2中,这些交互方式已经相当成熟,开发者可以根据需求选择最适合的方法。值得注意的是,尽管这些技术在早期版本就已经存在,但每个版本的Silverlight都会进行优化和改进,提供更好的性能和更简洁的...
尽管 Silverlight 5 Beta 包含了许多新功能,但还有一些特性并未在 Beta 版本中提供。这些特性将在最终版本中加入。 #### 法律声明 Silverlight 5 Beta 的使用须遵循相应的许可协议和条款。具体详情可参考随产品...
- **概念介绍**:Silverlight是一种由微软开发的跨浏览器的插件技术,它允许开发者在网页中创建丰富的交互式用户体验。随着Silverlight 2 Beta 1的发布,该平台变得更加强大,提供了更多的功能和支持。 - **步骤说明...
Silverlight 2是微软推出的一种富互联网应用程序平台,它在Beta 1版本中引入了多种新特性,包括对多种编程语言的支持(如Visual Basic、Visual C#、IronRuby、IronPython),以及对JSON、Web Service、WCF和Sockets...
这个解决方案展示了如何通过自定义控件和事件处理来解决框架本身存在的问题,也体现了在软件开发中对兼容性和用户体验的关注。同时,覃小春在注释中提供的博客链接(blog.csdn.net/colijian)可以为其他开发者提供更...
在Silverlight 2中,开发者可以利用JSON、Web Service、Windows Communication Foundation (WCF)以及Socket支持来实现数据交互和网络通信,这大大扩展了其功能范围。JSON支持使得数据交换更加轻量级和高效,而WCF则...
针对已有一定基础的开发者,介绍Silverlight 2.0的高级应用技巧,如复杂动画设计、自定义控件开发、高性能数据处理等。 #### (29) Silverlight 2.0综合实践案例(Level200) 提供一系列完整的应用案例,覆盖多个行业...
总的来说,Visifire_v3.5.2_beta2是一个强大的图表控件,它利用Silverlight或WPF的技术,提供灵活的数据可视化解决方案,并且遵循开源许可,方便开发者在不同项目中自由使用。通过示例和文档,开发者可以快速上手,...
对于初学者来说,**Silverlight 2 Beta 1**版本是一个很好的起点。在开始学习之前,你需要安装Visual Studio 2008,并创建一个新的Silverlight Application项目模板。创建完项目后,你可以将Silverlight应用程序嵌入...