.NEt专家博客!

一步一步学Silverlight 2系列(20):如何在Silverlight中与HTML DOM交互(下)

上一篇 / 下一篇  2008-04-11 20:44:37

概述

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章将从Silverlight 2基础知识、数据与通信、自定义控件、动画、图形图像等几个方面带您快速进入Silverlight 2开发。

Silverlight中 内置了对于HTML、客户端脚本等的支持,本文为如何在Silverlight 2中与HTML DOM交互第二部分。在第一部分中主要介绍了如何访问和修改已有的HTML DOM,我们还可以完全创建一个新的DOM元素或者移除一个已有的DOM元素,除此之外,我们还可以为DOM元素添加事件处理。

创建DOM元素

首先我们来看如何创建一个新的DOM元素,最终的效果如下,当我们在文本框中输入文字后,单击创建,将在上面的区域中创建一个li元素。ITPUB个人空间r ? a z BV

,LUe+}8F?0

先来定义一下HTML页面,甚至Silverlight插件的高度。

<divid="parentdiv">
vYc.Z]0<
ulid="list">
;zr9m#J$Kqm:_b0</
ul>ITPUB个人空间2w,T-ZZs Y e2AI:\
</
div>
e)e@W-f$L&Mv"N g0<
divstyle="height:200px;">ITPUB个人空间KZ mp3b4Ec"po
<
asp:SilverlightID="Xaml1"runat="server"ITPUB个人空间 xP.DeH5GP*fD
Source="~/ClientBin/TerryLee.SilverlightAccessDom2.xap"ITPUB个人空间iQolR'Jq7c"ePR$b
Version="2.0"Width="100%"Height="200px" />ITPUB个人空间e r?t's!zis$? m
</
div>

并且为上面的div定义一个简单的样式,以示与Silverlight区分

#parentdiv
$l*CG*O KJ'PJr0
{ITPUB个人空间6i;`_5AA$tzX"r
background:#FCDFB3;ITPUB个人空间!KM \2K)qt8U
border:solid 1px #FF9900;
X[n*SpNx!d-|-f0width:500px;ITPUB个人空间3kY8UyXcMs
height:100px;ITPUB个人空间r#@;SD4dG7hg1B
margin-bottom:20px;ITPUB个人空间sB1s U2n f"I0e0@
}

在Silverlight中进行界面布局,XAML如下:

<CanvasBackground="#CDFCAE">
"WGn)^x6Y0<
TextBlockText="Silverlight Accessing the HTML DOM"Foreground="Red"
qQK I9j0
Canvas.Top="10"Canvas.Left="30"FontSize="18">
?'a_}yU$CNB(v0</
TextBlock>ITPUB个人空间/sh,h;g^/s*d-wyZ
<
WatermarkedTextBoxx:Name="input"Watermark="请在这里输入"
PQ.szZYz)p*|0
Height="40"Width="300"ITPUB个人空间 OO"MMZx(d7L5^
Canvas.Left="30"Canvas.Top="50">
4]EBdWp0</
WatermarkedTextBox>
R Q1H#Y"\0<
Buttonx:Name="createButton"Background="Red"ITPUB个人空间:R7\Q%?~v!Hi
Height="40"Width="100"Content="创 建"ITPUB个人空间I9Aj r$[+h YZ
Canvas.Top="50"Canvas.Left="350"ITPUB个人空间A$XG*C(G d
Click="createButton_Click">
^)W)G3a)A'Oa#B4p0</
Button>
x`6uj6v^1B0</
Canvas>

编写创建按钮的代码,首先获取到要往里面添加元素的父元素,即我们定义的ul:

HtmlElementparent =HtmlPage.Document.GetElementById("list");

创建一个新的元素li,并设置属性

HtmlElementchild =HtmlPage.Document.CreateElement("li");ITPUB个人空间&Q(_(q7^3^p
Tc
child.SetAttribute("innerText",this.input.Text);

添加新元素到parent中

parent.AppendChild(child);

完整的代码如下:

private voidcreateButton_Click(objectsender,RoutedEventArgse)ITPUB个人空间$`#^X8peqj
{ITPUB个人空间m%G1d Z~
HtmlElementparent =HtmlPage.Document.GetElementById("list");ITPUB个人空间2}&yd2wK$a*\5`WB
ITPUB个人空间K)a7xi-n"s7t7T3p
HtmlElementchild =HtmlPage.Document.CreateElement("li");ITPUB个人空间-@*J(?%o U:C/q
child.SetAttribute("innerText",this.input.Text);ITPUB个人空间)Xp[ PyU

7iD+egN"\0parent.AppendChild(child);
%WV%HB7u2?~0}

运行后创建第一个元素

再次创建一个ITPUB个人空间@'^^e["`*Q

e9]S|:m+]0

移除DOM元素

既然可以创建元素,对应的也可以删除元素,我们在页面上放上几个<li>元素,然后输入id进行删除。代码如下:

private voiddeleteButton_Click(objectsender,RoutedEventArgse)
~7\MZ3`3s/]h0{ITPUB个人空间{3t}j6ZL
HtmlElementparent =HtmlPage.Document.GetElementById("list");ITPUB个人空间K S5Vah8h!Pi"z u

+m]n"` h#y}0HtmlElementchild =HtmlPage.Document.GetElementById(this.input.Text);
N0?r:@'{-C'o$~0
(P8P7U*YXGn*c0parent.RemoveChild(child);
;}J rVA:]s,n8\;W(N0}

运行后界面上有三个<li>

ITPUB个人空间]r#x9IjJ
删除其中一个
K&j#j)V9gmG0ITPUB个人空间X"M!tM9R

为DOM注册事件

除了添加和移除DOM元素外,我们还可以为DOM元素附加事件,在下面的例子中我们将通过Silverlight动态创建一个DOM元素<a>,并未它注册单击事件,单击时修改Silverlight中的矩形背景色。先准备相关的HTML。

<divid="parent">
RffX-y.k.@0
9_4Qmw.[!E0</
div>ITPUB个人空间*@%u S)t;R$U^
<
divstyle="height:200px;">
b*h!{JHKf?'Y7c#NT0<
asp:SilverlightID="Xaml1"runat="server"
R&h5z%}d }5~#`z%o0
Source="~/ClientBin/TerryLee.SilverlightAccessingDom3.xap"ITPUB个人空间`:CR5@#? mr
Version="2.0"Width="100%"Height="200px" />ITPUB个人空间"e$y }` v{`6L,{!|
</
div>

并且定义两个样式,其中newstyle我们将在Silverlight中为新添加的a元素使用。

#parentITPUB个人空间rM
dGNU"C3I
{
9j0fr _3@"]ya0background:#FCDFB3;
\e:^ _3m%c`)n c2sj0border:solid 1px #FF9900;ITPUB个人空间+aM#eitY
width:500px;ITPUB个人空间KSx s-x1D*O
height:100px;
ivI$[|So0margin-bottom:20px;
p0ro$lnM0}
c b:p5K.I s.n+a{3J+`0.newstyleITPUB个人空间0o L}8Q i6MT;WlT
{ITPUB个人空间2V{f-G5]ia
background:#0099FF;ITPUB个人空间Kg^ V0jW&fnV'O
border:solid 1px #0000FF;
4h%WRF1z yL0}

做一个简单的界面,放置一个按钮和矩形:

<CanvasBackground="#CDFCAE">
'W mlTd9eO0<
TextBlockText="Silverlight Accessing the HTML DOM"Foreground="Red"
nPT di'g5P&U0
Canvas.Top="10"Canvas.Left="30"FontSize="18">
4K V Pbf*])V0</
TextBlock>
l ["v&~)|z8Br0<
Rectanglex:Name="result"Height="40"Width="300"Fill="Red"
Sbr3iJ0
Canvas.Left="30"Canvas.Top="50"
$Ut4{?HjCT Z0
RadiusX="5"RadiusY="5">
f]VaP!RF}t0</
Rectangle>
%d[@:`U G4{0<
Buttonx:Name="addButton"Background="Red"
*v{rqG)y0
Height="40"Width="100"Content="添 加"
U r(UJx ug W\0
Canvas.Top="50"Canvas.Left="350"
$R i8O3|5P2vD(] |0
Click="addButton_Click">
V/fL x{#a"~,E0</
Button>
n%\$yz8R @0</
Canvas>

添加DOM元素,创建一个a元素,并为它设置属性,其中用CssClass来定义它的样式:

HtmlElementparent =HtmlPage.Document.GetElementById("parent");ITPUB个人空间L%z9F4M@+h*?n
d

/L,\ ZX"b3E0HtmlElementbutton =HtmlPage.Document.CreateElement("a");ITPUB个人空间9sHu,c [s
button.SetAttribute("innerText","改变Silverlight中的颜色");ITPUB个人空间Q1j%fkbj[
button.SetAttribute("href","#");ITPUB个人空间/U!?.e ~-EV
button.CssClass ="newstyle";
7`3?"o3C:g0
\\ ] I6^;w%yZ0parent.AppendChild(button);

为a元素附加onclick事件,HtmlElement提供了AttachEvent方法用来附加事件,使用泛型的EventHandler,在a元素单单击时我们改变Silverlight中的矩形填充色和边框。

button.AttachEvent("onclick",newEventHandler<HtmlEventArgs>(button_Click));
voidbutton_Click(objectsender,HtmlEventArgse)ITPUB个人空间K.X'hL'{ j.H?B6P
{
#n7ab)jj-H;V*|0result.Stroke =newSolidColorBrush(Colors.Black);
"V0y%O?)Q5] a8{0result.Fill =newSolidColorBrush(Colors.Green);
l6q+VS*y3z^ H:n+C1lC0result.StrokeThickness = 2;ITPUB个人空间SW-G/J(NOM3o
}

完整的代码如下:

private voidaddButton_Click(objectsender,RoutedEventArgse)
x(K;d'hFA:] }0{ITPUB个人空间8g*WGG0i E
HtmlElementparent =HtmlPage.Document.GetElementById("parent");
9Z H)[ {q T C%`0
;lo+@8k\ @0HtmlElementbutton =HtmlPage.Document.CreateElement("a");ITPUB个人空间\ M&mt0`%}9w
button.SetAttribute("innerText","改变Silverlight中的颜色");
^#SL:Mu+g0button.SetAttribute("href","#");ITPUB个人空间(TV eBKXL'X?%kt
button.CssClass ="newstyle";ITPUB个人空间5E/T3@m(w l"th8X;h

j^qH#rG$k%K0parent.AppendChild(button);
E6J E)Km D#|,u0ITPUB个人空间+a6@(c nVPF]},fMF
button.AttachEvent("onclick",newEventHandler<HtmlEventArgs>(button_Click));ITPUB个人空间,o`!Yaep nz3?(J
}ITPUB个人空间UkB)@1M9TG
ITPUB个人空间P,igUmzUs&F4W I@p
voidbutton_Click(objectsender,HtmlEventArgse)
{ N*ii#dC)f'@\j1T0{ITPUB个人空间!w;G|#y6F-F bS
result.Stroke =newSolidColorBrush(Colors.Black);ITPUB个人空间2`"}z#YAz
result.Fill =newSolidColorBrush(Colors.Green);
`6T[?!g|a0result.StrokeThickness = 2;ITPUB个人空间b,h#~o7y6\
}

运行一下看看效果如何,起始界面
1dR1}sfZ,[}0
4hEH#a]0添加新元素aITPUB个人空间1Mu;Q6FZ

;n(j8g4K6_t x6f0单击改变矩形的背景颜色
b(A6O*B)k3a#@?0ITPUB个人空间L/u CV-uL

HtmlElement也提供了DetachEvent方法,可以取消注册事件。

结束语

本文简单介绍了如何在Silverlight中添加和移除DOM元素,以及为DOM元素添加、取消事件处理程序。

作者:TerryLeeITPUB个人空间:S2al&h Mt,xA
出处:http://terrylee.cnblogs.com

ITPUB个人空间n'j@ j`${ h4qVk3J_


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar