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.pswp.cn/news/378853.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378853.shtml
英文地址,請注明出處:http://en.pswp.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…

Java Byte類的compareTo()方法和示例

簡短的類compareTo()方法 (Short class compareTo() method) compareTo() method is available in java.lang package. compareTo()方法在java.lang包中可用。 compareTo() method is used to check equality or inequality for this Byte object against the given Byte objec…

顯示照片的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;第二個參…

OUT還開通博客!

現在哪有人還在玩博客哦&#xff0c;哎試試&#xff0c;記錄一下自己開發網站的點滴吧&#xff01;轉載于:https://www.cnblogs.com/17say/archive/2013/02/18/2915125.html

網站V5的一些想法(轉)

V5即將到來&#xff0c;面對“全新”的V5&#xff0c;前端這塊自然也要借這次改版的機會&#xff0c;將我們前端的一些想法實踐到V5中去&#xff0c;實現一次跨越。 1 嘗試模塊化的代碼書寫(html、css等) 模塊化的目的是為了提高代碼的重用性、擴展性、可維護性 2 文件引用使用…

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行為類型與…

Java BufferedReader reset()方法及示例

BufferedReader類的reset()方法 (BufferedReader Class reset() method) reset() method is available in java.io package. reset()方法在java.io包中可用。 reset() method is used to reset the stream to the most recent mark of this stream. reset()方法用于將流重置為該…

將兩大小完全相同的照片進行加權混合對比

將兩張大小完全相同的照片進行加權混合對比 import cv2 img1cv2.imread(E:\Python-workspace\OpenCV\OpenCV/water1.png,1)#第一個參數為選擇照片的路徑&#xff0c;注意照片路徑最后一個為正斜杠其他都為反斜杠&#xff1b;第二個參數&#xff0c;其中1表示所選照片為彩色照片…

過了很久了

很久沒來這里了&#xff0c;一般也就找找資料會上一下子。差不多算是荒廢了吧 不要緊&#xff0c;開始寫了轉載于:https://www.cnblogs.com/Anykong/archive/2013/02/18/2916333.html

古文中驚艷的句子

-1】終于為那一身江南煙雨覆了天下&#xff0c;容華謝后&#xff0c;不過一場&#xff0c;山河永寂。-2】千秋功名&#xff0c;一世葬你&#xff0c;玲瓏社稷&#xff0c;可笑卻無君王命。-3】鳳凰臺上鳳凰游&#xff0c;負約而去&#xff0c;一夜苦等&#xff0c;從此江南江北…

java 方法 示例_Java ArrayDeque pollFirst()方法與示例

java 方法 示例ArrayDeque類pollFirst()方法 (ArrayDeque Class pollFirst() method) pollFirst() Method is available in java.lang package. pollFirst()方法在java.lang包中可用。 pollFirst() Method is used to return the first element of the queue denoted by this d…

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) 此…

ASP.NET調用javascript腳本的常見方法小結

http://www.codesky.net/article/doc/201004/2010041706872.htm轉載于:https://www.cnblogs.com/ZC_Mo-Blog/archive/2010/11/23/1885125.html

python wait方法_Python條件類| 帶有示例的wait()方法

python wait方法Python Condition.wait()方法 (Python Condition.wait() Method) wait() is an inbuilt method of the Condition class of the threading module in Python. wait()是Python中線程模塊的Condition類的內置方法。 Condition class implements condition variab…

return編程python_python3 第二十一章 - 函數式編程之return函數和閉包

我們來實現一個可變參數的求和。通常情況下&#xff0c;求和的函數是這樣定義的&#xff1a;def calc_sum(*args):ax0for n inargs:ax ax nreturn ax但是&#xff0c;如果不需要立刻求和&#xff0c;而是在后面的代碼中&#xff0c;根據需要再計算怎么辦&#xff1f;可以不返回…

黑色背景下,計算照片白色的區域面積和周長

黑色背景下&#xff0c;計算照片白色的區域面積和周長 import cv2 img cv2.imread(E:\Python-workspace\OpenCV\OpenCV/beyond.png,1)#第一個參數為選擇照片的路徑&#xff0c;注意照片路徑最后一個為正斜杠其他都為反斜杠&#xff1b;第二個參數&#xff0c;其中1表示所選照…

php連接mssql數據庫的幾種方式

數據庫查詢不外乎4個步驟&#xff0c;1、建立連接。2、輸入查詢代碼。3、建立查詢并取出數據。4、關閉連接。 php連接mssql數據庫有幾個注意事項&#xff0c;尤其mssql的多個版本、32位、64位都有區別。 首先&#xff0c;php.ini文件中;extensionphp_pdo_mssql.dll ;extensionp…