一起谈.NET技术,Silverlight中自定义控件

简介:   自定义控件并不是一项多么难的技术,关于自定义控件这部分有不少文章讲的很透彻,这里我主要把自己练习自定义控件的过程记录下来。  这里我以自定义控件BusyPointer为例,首先我们新建一个应用程序,命名为CustomControl,这里我们将自定义控件放入单独的项目中,所以在解决方案里添加一个...

  自定义控件并不是一项多么难的技术,关于自定义控件这部分有不少文章讲的很透彻,这里我主要把自己练习自定义控件的过程记录下来。

  这里我以自定义控件BusyPointer为例,首先我们新建一个应用程序,命名为CustomControl,这里我们将自定义控件放入单独的项目中,所以在解决方案里添加一个Silverlight Class Library项目,命名为BusyPointer,现在我们把Class1.cs类删除,然后在BusyPointer项目中添加一个Silverlight Template Control,我们为之命名为BusyPoint,这时架构如下图所示,项目中增加了一个类文件,同时增加了名为Generic的xaml文件。             捕获  现在我们开始定义控件逻辑对于BusyPoint这个控件,这里我们只是简单模仿Win7里一个鼠标行为在BusyPoint.cs文件中给其定义了一个依赖属性。

 
 
public bool IsBusy
{
get
{
return ( bool )GetValue(IsBusyProperty);
}
set
{
SetValue(IsBusyProperty, value);
ChangeState();
}
}
private void ChangeState()
{
if (IsBusy) VisualStateManager.GoToState( this , " Busied " , true );
else VisualStateManager.GoToState( this , " Normal " , true );
}
public static readonly DependencyProperty IsBusyProperty =
DependencyProperty.Register(
" IsBusy " , typeof ( bool ), typeof (BusyPoint), new PropertyMetadata( new PropertyChangedCallback(OnBusyChanged)));
private static void OnBusyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
((BusyPoint)sender).IsBusy
= ( bool )e.NewValue;
}

  关于依赖属性这个部分就不细说了,这里我们声明了一个用于当IsBusy值发生变化时的回调方法OnBusyChanged,现在我们在Generic.xaml中定义控件的样式。

 
 
< Style TargetType ="local:BusyPoint" >
< Setter Property ="Template" >
< Setter.Value >
< ControlTemplate TargetType ="local:BusyPoint" >
< Grid x:Name ="LayoutRoot" Background ="Transparent" >
< vsm:VisualStateManager.VisualStateGroups >
< vsm:VisualStateGroup x:Name ="CommonStates" >
< vsm:VisualState x:Name ="Normal" />
< vsm:VisualState x:Name ="Busied" >
< Storyboard >
< DoubleAnimationUsingKeyFrames Storyboard.TargetName ="VisualElement" Storyboard.TargetProperty ="(UIElement.RenderTransform).Angle" RepeatBehavior ="Forever" >
< SplineDoubleKeyFrame KeyTime ="0:0:1" Value ="360" />
</ DoubleAnimationUsingKeyFrames >
</ Storyboard >
</ vsm:VisualState >
</ vsm:VisualStateGroup >
</ vsm:VisualStateManager.VisualStateGroups >
< Ellipse Width ="20" Height ="20" StrokeThickness ="5.5" x:Name ="VisualElement" >
< Ellipse.Stroke >
< LinearGradientBrush EndPoint ="0.5,1" StartPoint ="0.5,0" >
< GradientStop Color ="#FF096475" Offset ="0.571" />
< GradientStop Color ="#FFA8FCFC" Offset ="1" />
</ LinearGradientBrush >
</ Ellipse.Stroke >
< Ellipse.RenderTransform >
< RotateTransform CenterX ="12.5" CenterY ="12.5" />
</ Ellipse.RenderTransform >
</ Ellipse >
</ Grid >
</ ControlTemplate >
</ Setter.Value >
 
</ Style >

  这里我们还需要添加一下命名空间xmlns:vsm="clr:namespace:System.Windows;assembly=System.Windows"

  这样我们自定义控件就完成了,下面我们在MainPage中使用这个控件,编译之后,我们就可以在CustomControl中引用BusyPointer.dll                捕获

  dll添加完成后,我们在MainPage.xaml页面中添加一个引用xmlns:by="clr-namespace:BusyPointer;assembly=BusyPointer",UI代码如下:

 
 
< by:BusyPoint x:Name ="busy" IsBusy ="False" ></ by:BusyPoint >
< Button Content ="Button" Name ="button1" Click ="button1_Click" />

  这里我们将BusyPoint控件的IsBusy设为False,我们通过这个Button将其设为True。

 
 
this .busy.IsBusy = true ;

  现在看一看页面的效果:             捕获

  虽然比起系统自带的鼠标头不怎么优雅,当然这个部分并不是重点了,只是以这个控件为例,将自定义控件的步骤梳理了一遍。

  代码下载:CustomeControl.rar   VS2010+SL3

目录
相关文章
|
5月前
|
开发框架 前端开发 JavaScript
Asp.net动态加载用户自定义控件,并转换成HTML代码
Asp.net动态加载用户自定义控件,并转换成HTML代码
26 0
|
缓存 前端开发 JavaScript
采用.Net Core技术框架开发的医院云LIS平台源码,B/S架构
基于B/S架构的医学实验室检验系统源码,整个系统的运行基于WEB层面,只需要在对应的工作台安装一个浏览器软件有外网即可访问。全套系统采用云部署模式,部署一套可支持多家医院检验科共同使用。 采用.Net Core新的技术框架、DEV报表、前端js封装、分布式文件存储、分布式缓存等,支持LIS独立部署,Docker部署等多种方式。
|
安全 NoSQL MongoDB
.Net线程同步技术解读
C#开发者(面试者)都会遇到lock(Monitor),Mutex,Semaphore,SemaphoreSlim这四个与锁相关的C#类型,本文期望以最简洁明了的方式阐述四种对象的区别。
.Net线程同步技术解读
|
移动开发 负载均衡 前端开发
2022届软件技术专业毕业生就业岗位分析(.Net方向)(7)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(7)
144 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(7)
|
网络架构
2022届软件技术专业毕业生就业岗位分析(.Net方向)(6)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(6)
163 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(6)
|
SQL 运维 监控
2022届软件技术专业毕业生就业岗位分析(.Net方向)(5)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(5)
177 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(5)
|
SQL 消息中间件 存储
2022届软件技术专业毕业生就业岗位分析(.Net方向)(4)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(4)
152 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(4)
|
SQL 运维 关系型数据库
2022届软件技术专业毕业生就业岗位分析(.Net方向)(3)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(3)
153 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(3)
|
存储 SQL 关系型数据库
2022届软件技术专业毕业生就业岗位分析(.Net方向)(2)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(2)
103 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(2)
|
人工智能 运维 Java
2022届软件技术专业毕业生就业岗位分析(.Net方向)(1)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(1)
367 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(1)