.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个人空间%X8~^Y s*O.Jk;PV
ITPUB个人空间!AdTcw @!}:wY

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

<divid="parentdiv">
`0q e5\-V h0<
ulid="list">
5Q$y2e&w~ ?,EIr0</
ul>
9{ I5eY1U @@0</
div>
'WY aY TE0<
divstyle="height:200px;">
,U1`ti3l`0<
asp:SilverlightID="Xaml1"runat="server"ITPUB个人空间\Q;PJ h!cW
Source="~/ClientBin/TerryLee.SilverlightAccessDom2.xap"
;r,EU.w%sB7Te,~0
Version="2.0"Width="100%"Height="200px" />ITPUB个人空间 _Oy&aGzsl'M
</
div>

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

#parentdivITPUB个人空间#\Z9ZN
N\E,h
{
hs0x?r1L2j!IT0background:#FCDFB3;ITPUB个人空间%F,P;] m6K"\b/n
border:solid 1px #FF9900;ITPUB个人空间 e5vS!V1Mlj[n0R
width:500px;ITPUB个人空间 p4qxjl wr2o&g
height:100px;ITPUB个人空间y:A,GM1y
margin-bottom:20px;ITPUB个人空间,MZ)I q+b[
}

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

<CanvasBackground="#CDFCAE">ITPUB个人空间5Y1lH2|!^oqf
<
TextBlockText="Silverlight Accessing the HTML DOM"Foreground="Red"ITPUB个人空间%A3^$`8l}O Q
Canvas.Top="10"Canvas.Left="30"FontSize="18">
1n `K2\k0h-ndwiN[0</
TextBlock>
g0Q;x$n&P0j In7W*[6I^0<
WatermarkedTextBoxx:Name="input"Watermark="请在这里输入"ITPUB个人空间bN p/H B]
Height="40"Width="300"
A2|"^ Y zlM~H8L0
Canvas.Left="30"Canvas.Top="50">
y.@ hA)a!g)M0</
WatermarkedTextBox>ITPUB个人空间/|5NC-e f+U)v$K
<
Buttonx:Name="createButton"Background="Red"ITPUB个人空间A*MHb H xK7z
Height="40"Width="100"Content="创 建"
'y$V~Z f Z0
Canvas.Top="50"Canvas.Left="350"
RfiSk*H0
Click="createButton_Click">
e7O4r R!Rp#Q,|i(x0</
Button>
nR;p,n:i/J8aN0</
Canvas>

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

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

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

HtmlElementchild =HtmlPage.Document.CreateElement("li");ITPUB个人空间&k!V/^
ja'B
p"tGB
child.SetAttribute("innerText",this.input.Text);

添加新元素到parent中

parent.AppendChild(child);

完整的代码如下:

private voidcreateButton_Click(objectsender,RoutedEventArgse)ITPUB个人空间AadJ2?N
{ITPUB个人空间K1?$Y]-Wh!y
HtmlElementparent =HtmlPage.Document.GetElementById("list");
4T9`;t jm;\-n2T{Y'S0
9[Mr!oWx t0HtmlElementchild =HtmlPage.Document.CreateElement("li");ITPUB个人空间?g6k5r!I+S$gGD
child.SetAttribute("innerText",this.input.Text);ITPUB个人空间r vw?|4S0K)A
ITPUB个人空间-oh,r9T T4d'`
parent.AppendChild(child);
]d0f@7j?G4F0}

运行后创建第一个元素

再次创建一个
r8_S6M%S~0^)WC0ITPUB个人空间6Lx-a czI+f5Q

移除DOM元素

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

private voiddeleteButton_Click(objectsender,RoutedEventArgse)ITPUB个人空间'[kd!IU
{
*r8r@;N.r/n\0HtmlElementparent =HtmlPage.Document.GetElementById("list");ITPUB个人空间}F#Q9y%H zH

$s9`9QY6` D,i0HtmlElementchild =HtmlPage.Document.GetElementById(this.input.Text);
-uT2G%utG rj0ITPUB个人空间n#B)B^$o$Z$U
parent.RemoveChild(child);
'w7[[H6]p}&o0}

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


?8F5@ B Z\aP@0删除其中一个ITPUB个人空间H4ffz/Y_
ITPUB个人空间pr|uFu

为DOM注册事件

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

<divid="parent">ITPUB个人空间r#C\^6R!XjF

2s8n#Z$f%w0ef0</
div>ITPUB个人空间M/Al;A;Z.S2cM
<
divstyle="height:200px;">
r2Vr [v0<
asp:SilverlightID="Xaml1"runat="server"ITPUB个人空间+^4V7xV9UVEYX
Source="~/ClientBin/TerryLee.SilverlightAccessingDom3.xap"ITPUB个人空间(Aj]#bh*m*Wo7G
Version="2.0"Width="100%"Height="200px" />
9{{*m bj0</
div>

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

#parentITPUB个人空间
Rj!|`,Q
{ITPUB个人空间ddl~ ka$b
background:#FCDFB3;
.i;JQ4^;i9CoG0border:solid 1px #FF9900;
/j]-g RG0width:500px;ITPUB个人空间JJ3] | qV3o2c
height:100px;ITPUB个人空间;}f:f;gMz bxl
margin-bottom:20px;ITPUB个人空间_we#gR
}
MW}uaJ0.newstyleITPUB个人空间 A)RZ R8RgQ
{ITPUB个人空间 _B&J%f9]T-Y
background:#0099FF;
)}k)eB8zZ)UZ4D0border:solid 1px #0000FF;
!C$W5g#p9m$A0}

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

<CanvasBackground="#CDFCAE">ITPUB个人空间RQ!J[EWx&vO,x
<
TextBlockText="Silverlight Accessing the HTML DOM"Foreground="Red"ITPUB个人空间 y AAZ`D*DisN
Canvas.Top="10"Canvas.Left="30"FontSize="18">
w9]LX x0</
TextBlock>
8P_E7aqinm&@-U0<
Rectanglex:Name="result"Height="40"Width="300"Fill="Red"
B"RL8s,O+LY9x0
Canvas.Left="30"Canvas.Top="50"
g*b+]tF!OR0
RadiusX="5"RadiusY="5">
k7J/g\/b e_NM0</
Rectangle>ITPUB个人空间&?j0Qz.w d r
<
Buttonx:Name="addButton"Background="Red"
wDa]i2D7t9~l0
Height="40"Width="100"Content="添 加"ITPUB个人空间`&J8}t8U ?6t
Canvas.Top="50"Canvas.Left="350"
M9No0?\ W?Y0
Click="addButton_Click">ITPUB个人空间V?+G]$b%sM%mm
</
Button>ITPUB个人空间*YZY tQZ8iy)d
</
Canvas>

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

HtmlElementparent =HtmlPage.Document.GetElementById("parent");
o4~n$PO U _)w0
WRBJYa0HtmlElementbutton =HtmlPage.Document.CreateElement("a");
2A'w'\3a6}AM0button.SetAttribute("innerText","改变Silverlight中的颜色");
to_A{i0button.SetAttribute("href","#");ITPUB个人空间*Jt:MO ]}
button.CssClass ="newstyle";
SS)G]X M0
ddq1~ ~:{ g:D)K0parent.AppendChild(button);

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

button.AttachEvent("onclick",newEventHandler<HtmlEventArgs>(button_Click));
voidbutton_Click(objectsender,HtmlEventArgse)ITPUB个人空间%WYJ$h/Zx]/|(y`
{
h(yoHuOk0result.Stroke =newSolidColorBrush(Colors.Black);ITPUB个人空间$k`{1}(\
result.Fill =newSolidColorBrush(Colors.Green);
@-p Xb(I0result.StrokeThickness = 2;
0m#q#\-Zw2?2HCQ0}

完整的代码如下:

private voidaddButton_Click(objectsender,RoutedEventArgse)ITPUB个人空间,b(G;RI[
{ITPUB个人空间!`7{zL)sm%S
HtmlElementparent =HtmlPage.Document.GetElementById("parent");
w(Hw*_&w ~*]'P0ITPUB个人空间c+J8V*ge[d
HtmlElementbutton =HtmlPage.Document.CreateElement("a");ITPUB个人空间r`Kv2c7USS+EU!T
button.SetAttribute("innerText","改变Silverlight中的颜色");ITPUB个人空间iu9l6N&b3L$nW5q
button.SetAttribute("href","#");
p9UT@s1l$fmFa.X0button.CssClass ="newstyle";
.K\7}{F0
:z'~cb9@x#]0parent.AppendChild(button);
vb:F7^6t9N~Z2f0
Z?/n.Y;Y x"^J0button.AttachEvent("onclick",newEventHandler<HtmlEventArgs>(button_Click));
I H2^JYv&O*?0}
V%^$WP G JBb0
T |;d f#nJ!oC0voidbutton_Click(objectsender,HtmlEventArgse)
5_0j U"WA7Cq9sO0{
+Z3ulTv7U0result.Stroke =newSolidColorBrush(Colors.Black);
;MP:`#n!sr*V8k0result.Fill =newSolidColorBrush(Colors.Green);ITPUB个人空间RX-Ox/Zkc+DQc#A:U
result.StrokeThickness = 2;ITPUB个人空间cr'EGa_1[O
}

运行一下看看效果如何,起始界面ITPUB个人空间\'a b9Z["z+d

9T a8|Og(y:NL{U0添加新元素a
;^%t un8^&b0ITPUB个人空间A:i#t c h~a
单击改变矩形的背景颜色ITPUB个人空间 N%n0y:ak!J X

U1AJ cz~:y0

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

结束语

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

作者:TerryLee
nWJ|(G6k*K R,~0出处:http://terrylee.cnblogs.com

ITPUB个人空间Dp%x sdZZ


TAG:

 

评分:0

我来说两句

显示全部

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

日历

« 2008-07-25  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 26056
  • 日志数: 749
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2008-07-24

RSS订阅

Open Toolbar