silverlight学习总结【完】

以下内容是个人理解,不保证正确性。且假设使用C#,并且有一定的相关知识和XML基础。

 

silverlight是什么,能做什么

silverlight用XAML来做前端界面,用.NET或者JS作为程序脚本支持,在浏览器内外运行的应用。可以认为和FLASH 和ADOBE AIR有很大的功能重叠。

当然他能做大部分flash或者air程序的工作。

silverlight知识层次

包括控件、布局、多媒体、XAML基础、属性和事件、数据、网络、调试等等。

SL的界面可以用XAML和C#(或者其他)写。一般都用XAML,所以要先介绍XAML。

0.预防针

本文将按照个人的语言习惯将同一类object称作一个标签集。

此外,用VS2008或2010新建一个SL工程,可以看到每个XAML下都有一个同名CS文件,这是XAML对应的控制类。此外,SL还有资源树,类似于QT中的资源文件,可以设定一个唯一关键字访问资源。

1.XAML基础

XAML是一种标记语言,就是包装过的XML。每个XML开头都有声明命名空间。所以

1.1 Namespace

<UserControl x:Class="MySilverlight.Page"
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
<Grid Background="OldLace">
</Grid>
</UserControl> 


简单地来说,UserControl代表了这个XAML继承自UserControl类,该类提供基本的UI。随后的x:Class表示这个XAML对应的CS文件中的类名。


扩展:
x:key 为资源树中的内容提供唯一标示
x:Name 为一个控件之类的提供唯一标示


xmls开头的行定义默认的XAML命名空间,只需要复制粘贴就行了,和XML一样这些都是固定的。注意如果要用到SL SDK的类,需要声明xmls:sdk


1.2 XAML语法

因为XAML是封装XML,所以就是那些,用<name></name>, <name/>,<name property="XXX"/>这些。当然,属性除了可以在XAML中直接定义,也可以在对应的CS文件里定义。

2.控件

 查看silverlight支持的控件,或者按照功能分类的基本控件

2.1 基本控件列表

按钮:Button,HyberlinkButton(单击打开链接),RepeatButton(按下状态下不断发送单击事件)

选择:checkBox,ComboBox,ListBox,RadioBox,Slider

日期选择:Calendar,DataPicker

文本显示:TextBlock,RickTextBox

可编辑文本:RichTextBox AutoCompleteBox(自动完成,带下拉菜单,类似浏览器地址栏), TextBox, PasswordBox

进度条:ProcessBar

数据表:DataGrid, TreeView, DataPager

多媒体:Image ,InkPresenter(绘画板), MediaElement, MultiScaleImage

HTML加载:WebBrowser

布局:Border,Canvas,Grid..........

对话框:Open/SaveFileDialog, ChildWindow, Popup

等等控件

如果你熟悉图形界面编程,大多数控件都和其他UI库没差别。

2.2 控件的外观

空间通常都有比如Height, Width, Background等属性,对于panel,还有margin之类的。可以用XML的属性设置方法设,或者在对应的CS中设置。这些都很简单。

也可以在空间中添加<style>子标签进行大量style定义。

也可以通过将Style声明为资源(resources)为多个同类控件定制统一外观。方法是:

在XAML文件的布局中声明这个布局的resources属性,添加style标签,用TargetType说明控件类型,并用x:key定义一个关键字。用Setter定义详细的控件,setter有两个属性,property和value。

在需要应用该style的空间上添加一个style属性,值就是该style对应的key

 

<StackPanel.Resources>
<Style TargetType="Button" x:Key="myButtonStyle">
<Setter Property="Background" Value="Purple" />
<Setter Property="Foreground" Value="#9900FF" />
<Setter Property="Height" Value="50" />
<Setter Property="Width" Value="100" />
<Setter Property="Margin" Value="5" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="FontSize" Value="14" />
</Style>
</StackPanel.Resources>
<Button x:Name="button3" Width="130" Content="Click Me Instead!" Style="{StaticResource myButtonStyle}"/>

2.3 深层定制控件

Style定义的内容有限,使用templates可以更深层定制一个控件。声明方法跟style一样。

可以作为某控件的一个标签

<Button Content="Button1">
<Button.Template>
<ControlTemplate TargetType="Button">
<!--Define the ControlTemplate here.-->
</ControlTemplate>
</Button.Template>
</Button>

或者作为一个资源,只是标签是ControlTemplate,其他和style一样。

当然template也可以作为style的一个setter定义在style中,这种方式也更常用。这时property是template

<StackPanel>
<StackPanel.Resources>
<Style TargetType="Button" x:Key="newTemplate">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
......

 控件通常是用更小的部件拼接成的,比如说button有一个矩形区域和一个border,这些部件称作FrameElement. Template必须声明一个Root FrameElement(一般是Border?)下列代码演示对button外观的定制

<ControlTemplate TargetType="Button">
<Border x:Name="RootElement">
<Border.Background>
<SolidColorBrush x:Name="BorderBrush" Color="Black"/>
</Border.Background>
......

 ControlTemplate当然就是template声明,用x:Name声明了Border是一个rootElement

注意到代码中的TemplateBinding(模板绑定)标签,意思就是说这个属性将留给使用附加有该template的控件的用户决定,而不由templates定义死。有些属性是由ControlTemplate的父类继承的,无需声明模板绑定,比如FontSize等。参看详细声明

此外,Button还有各种状态,点击,鼠标悬浮,按下等等,要对不同的状态定制,可以使用VisualState标签。不同的states组成VisualStateGroups。就Button而言有CommonStates和FocusStates两组。下面代码演示了添加方法:

<ControlTemplate TargetType="Button">
<Border x:Name="RootElement">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
......

 此外VisualStateGroup还有一个Transitions属性,可以包含VisualTransition子标签。因为默认的动画是延迟一秒,如果想自定义动画时间,可以使用这个标签。VisualTransition包含From,To,GeneratedDuration,分别是状态转换的两边和 时间值。该标签可以用StoryBoard子标签定义一个详细的动画。 

<VisualTransition From="MouseOver" To="Normal"
GeneratedDuration
="0:0:1.5">

 使用templates最方便的就是修改默认template,可以避免很多麻烦。

3. 布局

SL的Panel控件包括

  • canvas: 在该区域内使用坐标值定义子控件的位置,这也是唯一允许控件重叠的布局
  • StackPanel:横向或者纵向排列控件(Orientation属性)
  • Grid:类似图标的布局,有raw和column

空间之间的距离有margin属性,这些都很简单,参见MSDN

 

4. 事件处理

事件响应的简单实现是,在支持事件的空间标签上添加相应的属性,比如button支持click时间,就在button标签中添加click属性,click的值是处理函数(slot)的函数名,函数在XAML对应的CS文件中实现。

也可以在cs文件中使用buttonName.click+="functionName";添加处理函数。处理函数的形参是固定的:object sender,RoutedEventArgs e

了解更多,或者为自定义控件添加事件


 5. 多媒体

5.1图形

5.1.1 Shape

Shape是一种UI元素,可以用在各种Panel里面。包括Ellipse、Line、Path、Polygon、Polyline 和 Rectangle。

所有的Shape元素公用的三个属性是Stroke,StrokeThickness和Fill,分别是轮廓定义,轮廓粗细和填充。其坐标用X1,X2....等属性定义,坐标以Shape元素被定义的位置为坐标原点。

 

代码
<Canvas Height="300" Width="300">
<!-- Draws a diagonal line from (10,10) to (50,50)
and moves it 100 pixels to the right.
-->
<Line X1="10" Y1="10" X2="50" Y2="50"
StrokeThickness
="10"
Canvas.Left
="100">
<Line.Stroke>
<RadialGradientBrush GradientOrigin="0.5,0.5" Center="0.5,0.5"
RadiusX
="0.5" RadiusY="0.5">
<RadialGradientBrush.GradientStops>
<GradientStop Color="Red" Offset="0" />
<GradientStop Color="Blue" Offset="0.5" />
</RadialGradientBrush.GradientStops>
</RadialGradientBrush>
</Line.Stroke>
</Line>

Line就是直线,Ellipse是椭圆,Path:路径

path有一个Data属性,其值是一个用特殊语法标记的字符串,查看语法

5.1.2 形状变换

Transform标签集可以用于2D图形变换,包括括旋转 (RotateTransform)、缩放 (ScaleTransform)、斜切 (SkewTransform) 和转换 (TranslateTransform)。就Shape而言,所有Shape都有一个RenderTransform属性,可以接受Transform标签集作为其子标签。如果要应用多个Tramsform则需要添加TransformGroup标签。

 

代码
<Grid x:Name="LayoutRoot" Background="White">
<Rectangle Width="50" Height="50"
Fill
="RoyalBlue">
<Rectangle.RenderTransform>
<RotateTransform Angle="45" />
</Rectangle.RenderTransform>
</Rectangle>
</Grid>

 

5.2 Brush

就像任何绘图软件一样,除了能画形状,还需要定制一种画笔,可以产生一个填充区域(你也可以把line看做一个填充区域吧= =)。Brush标签集有SolidColorBrush(有一个Color属性,用于定义任何shape的fill属性),LinearGradientBrush(线性渐变)和RadialGradientBrush(辐射渐变)和ImageBrush,VideoBrush。

注意颜色可以有透明值,Color属性支持ARGB颜色(#AARRGGBB)。

思考一下在PS中渐变是怎么产生的,首先线性渐变需要一个渐变方向(角度),其次可以设置多个位置,设置它们的颜色(我称之为关键颜色),程序会产生从一个颜色到另一个的渐变。在SL中,线性渐变的角度由StartPoint 和 EndPoint定义,他们都是point值,且只能取0-1之间的小数。比如从(0,0) 到(1,1)将定义一个对角线渐变。而关键颜色值通过GradientStop定义,该标签有两个属性,Color和Offset(基于StartPoint的偏移值)

 

代码
1 <StackPanel>
2 <!-- This rectangle is painted with a horizontal linear gradient. -->
3 <Rectangle Width="200" Height="100">
4 <Rectangle.Fill>
5 <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
6 <GradientStop Color="Yellow" Offset="0.0" />
7 <GradientStop Color="Red" Offset="0.25" />
8 <GradientStop Color="Blue" Offset="0.75" />
9 <GradientStop Color="LimeGreen" Offset="1.0" />
10 </LinearGradientBrush>
11 </Rectangle.Fill>
12 </Rectangle>
13  </StackPanel>

而对于辐射渐变,我们需要一个椭圆区域,所以需要X,Y轴长和圆心,在该区域内设定一个渐变核心点,然后以之为中心展开渐变,对应了RadialGradientBrush的GradientOrigin、Center、RadiusX 和 RadiusY属性。

ImageBrush有ImageSource和Stretch(有Fill, NoneUniformUniformToFil四个可选值)两个属性定义一个图像填充笔刷。顾名思义,就不多说了。

5.3 Deep Zoom

简单说就是SL提供的一种图像缩放技术。使用Deep Zoom Composer创建dzi格式的图像或图像序列,然后在SL中加载。SL提供了一些相关API,如果你很感兴趣可以看看Deep Zoom

5.4 动画

用StoryBoard标签为一个UI组件提供一组动画,每一个动画可以用XXAnimation标签标示,比如创建一个变化值为小数的动画,就用DoubleAnimation. Animation标签集有From,To,Duaration, AutoReverse, RepeatBehaviour等属性。此外,Animation还可以指定其作用对象(TargetName)以及作用属性(TargetProperty)。StoryBoard也可以作为一个panel元素的元素(和Style,templates一样),通过x:Name访问,或者通过事件处理函数中调用动画的begin函数触发。

下面有个简单的实例:

 

代码
<StackPanel>
<StackPanel.Resources>
<!-- Animates the rectangle's opacity. -->
<Storyboard x:Name="myStoryboard">
<DoubleAnimation
Storyboard.TargetName="MyAnimatedRectangle"
Storyboard.TargetProperty
="Opacity"
From
="1.0" To="0.0" Duration="0:0:1"
AutoReverse
="True" RepeatBehavior="Forever" />
</Storyboard>
</StackPanel.Resources>

<Rectangle
x:Name="MyAnimatedRectangle"
Width
="100" Height="100" Fill="Blue" />
</StackPanel>

Animation还提供了一个XXXAnimation.EasingFunction子集,可以为动画进行缓冲、反弹等等效果

 

代码
<StackPanel.Resources>
<Storyboard x:Name="myStoryboard">
<DoubleAnimation From="30" To="200" Duration="00:00:3"
Storyboard.TargetName
="myRectangle"
Storyboard.TargetProperty
="Height">
<DoubleAnimation.EasingFunction>
<BounceEase Bounces="2" EasingMode="EaseOut"
Bounciness
="2" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</StackPanel.Resources>
 

关键帧动画则用XXXAnimationUsingKeyFrames标签集定义。他没有from,to标签,而是从一个关键帧用制定方法变化到下一个关键帧,变化方法由关键帧标签说明。关键帧标签有三种:DiscreteDoubleKeyFrame、LinearDoubleKeyFrame 和 SplineDoubleKeyFrame。分别是均匀变化,突然出现和加速出现(?)

5.5 音频和视频

使用MediaElement标签即可,

6. SL高级特性

    这里高级指适合看MSDN的部分= =

L支持Array,List<T>,Dictionary<key,value>等数据结构。SL插件为应用程序提供1MB的本地存储空间。查看如何存储

SL提供了API允许HTTP请求,查看cookies等,查看网络通信特性

 

至此笔记暂时完结,稍后有空可能完善修改一下。

 

转载于:https://www.cnblogs.com/superx/archive/2010/11/22/1863970.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解

目录1、内容概述2、反向链接技术&#xff1a;一种特殊的P2P场景&#xff08;通信双方中只有一方位于NAT设备之后&#xff09;3、基于UDP协议的P2P打洞技术详解3.1、原理概述3.2、典型P2P情景1&#xff1a; 两客户端位于同一NAT设备后面&#xff08;即相同内网中&#xff09;3.3…

显示照片的RGB直方图

显示照片的RGB直方图 import numpy as np import cv2 as cv from matplotlib import pyplot as plt img cv.imread(E:\Python-workspace\OpenCV\OpenCV/BEYOND.png,1)#第一个参数为选择照片的路径&#xff0c;注意照片路径最后一个为正斜杠其他都为反斜杠&#xff1b;第二个参…

mysql慢查询开启语句分析_mysql慢查询语句分析总结

我们经常会接触到MySQL&#xff0c;也经常会遇到一些MySQL的性能问题。我们可以借助慢查询日志和explain命令初步分析出SQL语句存在的性能问题通过SHOW FULL PROCESSLIST查看问题SHOW FULL PROCESSLIST相当于select * from information_schema.processlist可以列出正在运行的连…

P2P技术详解(三):P2P中的NAT穿越(打洞)方案详解(进阶分析篇)

目录1、NAT和NAPT2、NAT带来的问题3、P2P通信穿越NAT的技术、方法4、NAT穿越技术1&#xff1a;应用层网关4.1、原理4.2、限制5、NAT穿越技术2&#xff1a;中间件技术5.1、原理5.2、限制6、NAT穿越技术3&#xff1a;打洞技术(Hole Punching)6.1、原理6.2、方法6.2.1NAT行为类型与…

将两大小完全相同的照片进行加权混合对比

将两张大小完全相同的照片进行加权混合对比 import cv2 img1cv2.imread(E:\Python-workspace\OpenCV\OpenCV/water1.png,1)#第一个参数为选择照片的路径&#xff0c;注意照片路径最后一个为正斜杠其他都为反斜杠&#xff1b;第二个参数&#xff0c;其中1表示所选照片为彩色照片…

P2P技术详解(四):P2P技术之STUN、TURN、ICE详解

目录1、内容概述2、STUN详解2.1 RFC3489/STUN2.1.1 报文结构2.1.2实现原理2.1.3STUN功能举例2.2 RFC5389/STUN2.2.1STUN用途2.2.2报文结构2.3 RFC5389与RFC3489的区别2.4 新特性介绍2.4.1指纹机制2.4.2通过DNS发现服务器机制2.4.3认证和消息完整性机制2.4.4备份服务器机制2.5 R…

比较两张大小相同的照片的差异,返回数值

比较两张大小相同的照片的差异&#xff0c;返回数值 from PIL import Image import math import operator from functools import reducedef image_contrast(img1, img2):image1 Image.open(img1)image2 Image.open(img2)h1 image1.histogram()h2 image2.histogram()resul…

poj2115C Looooops

http://poj.org/problem?id2115 参考人家的 如下 如i65534&#xff0c;当i3时&#xff0c;i1 其实就是 i(655343)%(2^16)1 有了这些思想&#xff0c;设对于某组数据要循环x次结束&#xff0c;那么本题就很容易得到方程&#xff1a; x[(B-A2^k)%2^k] /C 即 Cx(B-A)(mod 2^k) 此…

黑色背景下,计算照片白色的区域面积和周长

黑色背景下&#xff0c;计算照片白色的区域面积和周长 import cv2 img cv2.imread(E:\Python-workspace\OpenCV\OpenCV/beyond.png,1)#第一个参数为选择照片的路径&#xff0c;注意照片路径最后一个为正斜杠其他都为反斜杠&#xff1b;第二个参数&#xff0c;其中1表示所选照…

通俗易懂:快速理解P2P技术中的NAT穿透原理

目录1、基础知识1.1、什么是NAT&#xff1f;1.2、为什么会有NAT&#xff1f;1.3、NAT有什么优缺点&#xff1f;2、NAT的实现方式2.1、静态NAT2.2、NAPT3、NAT的主要类型3.1、完全锥型NAT&#xff08;Full Cone NAT&#xff0c;后面简称FC&#xff09;3.2、受限锥型NAT&#xff…

java 负载均衡_java负载均衡 - 岁月静好I的个人空间 - OSCHINA - 中文开源技术交流社区...

作用对系统的高可用&#xff0c;网络压力的缓解&#xff0c;处理能力扩容的重要手段之一。服务器负载我们通常所说的负载是指&#xff1a;服务器负载软硬件负载服务器负载又分为&#xff1a;软件负载--硬件负载软件负载&#xff1a;通过在服务器上安装一些具有负载功能或模块的…

b tree和b+tree_B TREE实施

b tree和btreeB TREE及其操作简介 (Introduction to B TREE and its operations) A B tree is designed to store sorted data and allows search, insertion and deletion operation to be performed in logarithmic time. As In multiway search tree, there are so many nod…

黑色背景下,将照片内封闭空心图案的空心区域染成Cyan并保存

在黑色背景下&#xff0c;将照片内封闭空心图案的空心区域染色 import cv2 import numpy as np img cv2.imread(E:\Python-workspace\OpenCV\OpenCV/beyond.png,1)#第一个参数为选择照片的路径&#xff0c;注意照片路径最后一个为正斜杠其他都为反斜杠&#xff1b;第二个参数…

SDP协议基本分析(RTSP、WebRTC使用)

目录一、介绍二、标准 SDP 规范1. SDP 的格式2. SDP 的结构&#xff08;1&#xff09;会话描述&#xff08;2&#xff09;媒体描述三、WebRTC 中的 SDP一、介绍 SDP&#xff08;Session Description Protocal&#xff09;以文本描述各端&#xff08;PC 端、Mac 端、Android 端…

黑色背景下,描绘照片的轮廓形状并保存

描绘照片的轮廓形状并保存 import cv2 from matplotlib import pyplot as plt # 1.先找到轮廓 img cv2.imread(E:\Python-workspace\OpenCV\OpenCV/beyond.png, 0) _, thresh cv2.threshold(img, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) image, conturs, hierarchy c…

java pdf合并_Java 合并、拆分PDF文档

本文将介绍如何在Java程序中合并及拆分PDF文档&#xff0c;合并文档时&#xff0c;包括合并多个不同PDF文档为一个文档&#xff0c;以及合并PDF文档的不同页面为一页&#xff1b;拆分文档是&#xff0c;包括将PDF文档按每一页拆分&#xff0c;以及按指定页数范围来拆分。下面将…

HDU4405 期望

对于期望&#xff0c;首先&#xff0c;对于这个公式中p表示概率&#xff0c;x表示随机变量 展开则为 ex p1*x1p2*x2p3*x3....... 对于本题 假设 ex[ i ]表示当前 i 走到 n 的期望值。所以若 i 处没有飞机&#xff0c;ex[ i ]sigma(1/6*ex[ik])1 其中(k1...6) &#xff08;1表示…

很全的SQL注入语句

1、返回的是连接的数据库名and db_name()>02、作用是获取连接用户名and user>03、将数据库备份到Web目录下面;backup database 数据库名 to diskc:\inetpub\wwwroot\1.db;--4、显示SQL系统版本and 1(select VERSION) 或and 1convert(int,version)--5、判断xp_cmdshell扩展…

java异常体系_JAVA异常体系结构详解

一、什么是异常异常&#xff1a;程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。(在Java等面向对象的编程语言中)异常本身是一个对象&#xff0c;产生异常就是产生了一个异常对象。 ——百度百科二、异常体系Java把异常当作对象来处理&#xf…

对照片质量进行压缩

对照片质量进行压缩 其实无论是jpg还是png都是已经压缩编码化的格式罢了&#xff0c;原图片的大小要远远大于压缩编码后的格式 1&#xff0c;像素&#xff1a;图片放大到一定程度之后的一个个的小方块 2&#xff0c;RGB&#xff1a;每一个像素&#xff08;小方块&#xff09;都…