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

概述

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元素。

 TerryLee_Silverlight2_0089

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

<div id="parentdiv">
    <ul id="list">
    </ul>
</div>
<div  style="height:200px;">
    <asp:Silverlight ID="Xaml1" runat="server" 
    Source="~/ClientBin/TerryLee.SilverlightAccessDom2.xap" 
    Version="2.0" Width="100%" Height="200px" />
</div>

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

#parentdiv
{
    background:#FCDFB3;
    border:solid 1px #FF9900;
    width:500px;
    height:100px;
    margin-bottom:20px;    
}

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

<Canvas Background="#CDFCAE">
    <TextBlock Text="Silverlight Accessing the HTML DOM" Foreground="Red"
               Canvas.Top="10" Canvas.Left="30" FontSize="18">
    </TextBlock>
    <WatermarkedTextBox x:Name="input" Watermark="请在这里输入"
                        Height="40" Width="300"
                        Canvas.Left="30" Canvas.Top="50">
    </WatermarkedTextBox>
    <Button x:Name="createButton" Background="Red"
            Height="40" Width="100" Content="创 建"
            Canvas.Top="50" Canvas.Left="350"
            Click="createButton_Click">
    </Button>
</Canvas>

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

HtmlElement parent = HtmlPage.Document.GetElementById("list");

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

HtmlElement child = HtmlPage.Document.CreateElement("li");
child.SetAttribute("innerText", this.input.Text);

添加新元素到parent中

parent.AppendChild(child);

完整的代码如下:

private void createButton_Click(object sender, RoutedEventArgs e)
{
    HtmlElement parent = HtmlPage.Document.GetElementById("list");

    HtmlElement child = HtmlPage.Document.CreateElement("li");
    child.SetAttribute("innerText", this.input.Text);

    parent.AppendChild(child);
}

运行后创建第一个元素

TerryLee_Silverlight2_0090

再次创建一个

TerryLee_Silverlight2_0091 

移除DOM元素

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

private void deleteButton_Click(object sender, RoutedEventArgs e)
{
    HtmlElement parent = HtmlPage.Document.GetElementById("list");

    HtmlElement child = HtmlPage.Document.GetElementById(this.input.Text);

    parent.RemoveChild(child);
}

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

TerryLee_Silverlight2_0092

删除其中一个

TerryLee_Silverlight2_0093

为DOM注册事件

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

<div id="parent">

</div>
<div  style="height:200px;">
    <asp:Silverlight ID="Xaml1" runat="server" 
        Source="~/ClientBin/TerryLee.SilverlightAccessingDom3.xap" 
        Version="2.0" Width="100%" Height="200px" />
</div>

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

#parent
{
    background:#FCDFB3;
    border:solid 1px #FF9900;
    width:500px;
    height:100px;
    margin-bottom:20px;    
}
.newstyle
{
    background:#0099FF;
    border:solid 1px #0000FF;
}

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

<Canvas Background="#CDFCAE">
    <TextBlock Text="Silverlight Accessing the HTML DOM" Foreground="Red"
           Canvas.Top="10" Canvas.Left="30" FontSize="18">
</TextBlock>
    <Rectangle x:Name="result" Height="40" Width="300" Fill="Red"
               Canvas.Left="30" Canvas.Top="50"
               RadiusX="5" RadiusY="5">
    </Rectangle>
    <Button x:Name="addButton" Background="Red"
        Height="40" Width="100" Content="添 加"
        Canvas.Top="50" Canvas.Left="350"
        Click="addButton_Click">
    </Button>
</Canvas>

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

HtmlElement parent = HtmlPage.Document.GetElementById("parent");

HtmlElement button = HtmlPage.Document.CreateElement("a");
button.SetAttribute("innerText", "改变Silverlight中的颜色");
button.SetAttribute("href","#");
button.CssClass = "newstyle";

parent.AppendChild(button);

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

button.AttachEvent("onclick", new EventHandler<HtmlEventArgs>(button_Click));
void button_Click(object sender, HtmlEventArgs e)
{
    result.Stroke = new SolidColorBrush(Colors.Black);
    result.Fill = new SolidColorBrush(Colors.Green);
    result.StrokeThickness = 2;
}

完整的代码如下:

private void addButton_Click(object sender, RoutedEventArgs e)
{
    HtmlElement parent = HtmlPage.Document.GetElementById("parent");

    HtmlElement button = HtmlPage.Document.CreateElement("a");
    button.SetAttribute("innerText", "改变Silverlight中的颜色");
    button.SetAttribute("href","#");
    button.CssClass = "newstyle";

    parent.AppendChild(button);

    button.AttachEvent("onclick", new EventHandler<HtmlEventArgs>(button_Click));
}

void button_Click(object sender, HtmlEventArgs e)
{
    result.Stroke = new SolidColorBrush(Colors.Black);
    result.Fill = new SolidColorBrush(Colors.Green);
    result.StrokeThickness = 2;
}

运行一下看看效果如何,起始界面

TerryLee_Silverlight2_0094

添加新元素a

TerryLee_Silverlight2_0095

单击改变矩形的背景颜色

TerryLee_Silverlight2_0096 

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

结束语

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

下一篇:一步一步学Silverlight 2系列(21):如何在Silverlight中调用JavaScript

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Tag标签: Silverlight
posted @ 2008-03-11 19:00 TerryLee 阅读(6841) 评论(30)  编辑 收藏 网摘 所属分类: [03]  银光点亮世界

  回复  引用  查看    
#1楼 2008-03-11 19:41 | Clark Zheng      
好快呀,佩服勤奋的人!
  回复  引用  查看    
#2楼 2008-03-11 19:45 | Q.Lee.lulu      
好快啊..佩服!!
  回复  引用  查看    
#3楼 [楼主]2008-03-11 19:46 | TerryLee      
@Clark Zheng
@Q.Lee.lulu
谢谢两位的支持,呵呵:)
  回复  引用  查看    
#4楼 2008-03-11 19:48 | 阿布      
我在想要是Silverlight支持自定义右键菜单就好了。Terrylee英语好帮提到开发组。呵呵
  回复  引用  查看    
#5楼 [楼主]2008-03-11 19:50 | TerryLee      
@阿布
支持自定义右键菜单啊,估计2.0是不会提供了,呵呵:)
  回复  引用    
#6楼 2008-03-11 21:03 | kains [未注册用户]
估计可以用flex中屏蔽右键的方式搞定 :)
  回复  引用    
#7楼 2008-03-11 21:10 | kains [未注册用户]
不知道1000行的表格在客户端滚动效率怎样,比较关心这个。其他的东西反倒是其次的。因为1.0的客户端性能比较差所有没有选择sl。
  回复  引用  查看    
#8楼 [楼主]2008-03-11 22:04 | TerryLee      
@kains
:)
  回复  引用  查看    
#9楼 2008-03-11 22:19 | 菜菜灰      
如果不在Sliverlight里建button.AttachEvent("onclick", new EventHandler<HtmlEventArgs>(button_Click)); 事件,在客户端怎么去操作silverlight里面的元素。
  回复  引用  查看    
#10楼 [楼主]2008-03-11 22:33 | TerryLee      
@菜菜灰
明天即将发布这部分内容,敬请期待^_^
  回复  引用  查看    
#11楼 2008-03-11 22:58 | 阿布      
这里也是个不错的关于Silverlight学习的blog,不过讲的要比较深一些的内容
http://www.wilcob.com/Wilco/View.aspx
  回复  引用  查看    
#12楼 [楼主]2008-03-11 23:28 | TerryLee      
@阿布
谢谢推荐,有空看看,呵呵:)
  回复  引用  查看    
#13楼 2008-03-12 01:42 | aspnetx      
现在忙得只有时间看了,难得抽出点时间赶紧来顶一下.佩服TerryLee的勤奋.
  回复  引用  查看    
#14楼 [楼主]2008-03-12 08:30 | TerryLee      
@aspnetx
多谢支持:)
  回复  引用  查看    
#15楼 2008-03-12 09:28 | 一瞬间      
--引用--------------------------------------------------
菜菜灰: 如果不在Sliverlight里建button.AttachEvent(&quot;onclick&quot;, new EventHandler&lt;HtmlEventArgs&gt;(button_Click)); 事件,在客户端怎么去操作silverlight里面的元素。
--------------------------------------------------------
你可以使用Silverlight2.0之前的Javascript的方法来操作Silverlight里面的元素,用Sender.getHost().content.findName("yourname")就可以获取到Silverlight里面的元素,通过在CreateSilverlight()函数中的OnLoad事件中绑定对应的事件。
  回复  引用  查看    
#16楼 [楼主]2008-03-12 09:38 | TerryLee      
@一瞬间
现在貌似不用这么麻烦了,直接可以在JavaScript中调用Silverlight中的.NET代码:)
  回复  引用    
#17楼 2008-03-12 17:11 | 的 [未注册用户]
似的发射方式
  回复  引用    
#18楼 2008-03-12 17:13 | shiyong [未注册用户]
我也是 silverlight 爱好者,推荐一个网站,很不错的 ,叫 一元居
网址是 www.1yuanju.cn ,里面有很多的 silverlight 教程!

大家也可以到那里 交流一下!!
  回复  引用  查看    
#19楼 [楼主]2008-03-12 18:18 | TerryLee      
@的

这是什么意思呢?:)
  回复  引用  查看    
#20楼 2008-10-10 18:46 | threeG      
div的innerText 的属性设置 ,,我怎么没有反映? 取这个属性 不行!??

  回复  引用    
#21楼 2008-11-09 01:31 | 冻结 [未注册用户]
@threeG

System.Windows.Browser.HtmlElement element = System.Windows.Browser.HtmlPage.Document.GetElementById("div1");

string s= element.GetAttribute("innerText");

这样去取,
  回复  引用  查看    
#22楼 2008-11-11 09:45 | threeG      
@冻结
我是这样取得。。好像在firefox里面不行!!!哈哈!innerText 换成 innerHTML可以!!很奇怪!
  回复  引用  查看    
#23楼 [楼主]2008-11-12 11:15 | TerryLee      
@threeG
各种浏览器之间的差异……

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-12 18:32 编辑过
Google站内搜索



相关文章:


相关搜索:
Silverlight

相关链接: