Silverlight开发之偷拿别人HTML控件

开发 后端 前端
需求:大家都现有MS提供的HTML控件只能在OOB模式下使用,而第三方的控件如要在非OOB下使用则需设置windowsless等于true,我们知道windowsless等于true对性能是有影响的,还有个特大的bug就是不能输入中文。

现在我们需要的是是在非OOB下的HTML控件,并且支持中文输入无需设置windowsless等于true。

好吧下面我们开始吧:去年的在深蓝色右手群里有位叫“超人”的哥们说DIV的方式,Silverlihgt在html中作为插件显示。我们可以在html中建立一个DIV 覆盖在Silverlight的上方。这样我们就能输入中文了。今天我们这里也是这样的方式实现的。

以下代码是去年从某地反编译过来,然后稍作修改的。具体哪里也忘了。下面我们简单分析下代码:

我们先定义Uri属性,指定显示某个Uri的html

  1. /// <summary> 
  2. /// 设置Uri的依赖属性,并且定义Uri改变时事件SourceUriChanged  
  3. /// </summary> 
  4. public static readonly DependencyProperty SourceUriProperty =  
  5. DependencyProperty.Register("SourceUri", typeof(Uri), typeof(HTMLControl),  
  6. new PropertyMetadata(null, new PropertyChangedCallback(HTMLControl.SourceUriChanged)));  
  7.     
  8. /// <summary> 
  9. /// 指定显示的Uri  
  10. /// </summary> 
  11.  public Uri SourceUri  
  12.  {  
  13.     get  
  14.    {  
  15.         return (Uri)base.GetValue(SourceUriProperty);  
  16.       }  
  17.    set  
  18.     {  
  19.         base.SetValue(SourceUriProperty, value);  
  20.     }  
  21.  } 

下面是当Uri改变时候触发的事件,大致原理为:

1.获取Sl所属页面在页面中增加一个Div元素

2.调整Div元素所处位置以及长宽高。让它刚好处于Sl控件位置

3.Refresh方法主要调整位置以及长宽高

  1. private static void SourceUriChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)  
  2.    {  
  3.              ((HTMLControl)sender).ReloadUri();  
  4.         }  
  5.          private void ReloadUri()  
  6.          {  
  7.             if (!HtmlPage.IsEnabled)  
  8.             {  
  9.                  return;  
  10.              }  
  11.              if (!this.isLoad)  
  12.             {  
  13.                  return;  
  14.              }  
  15.            if (this.div.Children.Count > 0)  
  16.              {  
  17.                  while (div.Children.Count>0)  
  18.                 {  
  19.                      this.div.RemoveChild((HtmlElement)this.div.Children[0]);  
  20.                 }  
  21.              }  
  22.    
  23.             if (this.SourceUri == null)  
  24.             {  
  25.                  //直接设置SourceHtml 未设置Uri  
  26.                   this.div.SetStyleAttribute("overflow", "auto");  
  27.                  this.SetDivHtml(this.div, this.SourceHtml);  
  28.                  //这里刷新Html,并且创建Div  
  29.                  this.Refresh();  
  30.              }  
  31.              else  
  32.              {  
  33.                  //通过URL设置  
  34.                  this.div.SetStyleAttribute("overflow", "hidden");  
  35.                 this.div.AppendChild(this.IFrame);  
  36.                  this.IFrame.SetAttribute("src", this.SourceUri.ToString());  
  37.                  //这里刷新Html  
  38.                   this.Refresh();  
  39.                      
  40.             }  
  41.          } 

上面控件只能在非OOB模式下使用,因为在OOB模式下无法创建Div,HtmlPage等对象访问也会报错(题外话:真不明白为啥默认建的SL项目App.xaml.cs中会用到HtmlPage对象)。所以要在OOB运行的时候朋友们可以使用MS的WebBrowser控件。

原文链接:http://www.cnblogs.com/ForrestZhang/archive/2011/03/08/SilverlightHtml.html

【编辑推荐】

  1. 你可能不知道的15个Silverlight诀窍
  2. Silverlight 之轻
  3. Silverlight 之重
  4. 在Silverlight应用程序中调试WCF服务
责任编辑:陈贻新 来源: Mr.Wrong博客
相关推荐

2012-02-02 16:37:51

Silverlight常用控件

2009-12-30 13:30:16

Silverlight

2009-12-30 13:51:43

Silverlight

2010-01-04 14:49:30

Silverlight

2011-01-26 09:50:18

Silverlight.NetJavaScript

2011-01-27 08:49:47

SilverlightWeb.NET

2009-08-03 15:43:22

asp.net控件

2011-08-24 09:29:00

Silverlight

2009-08-14 10:14:07

Silverlight

2009-12-30 17:29:53

Silverlight

2009-12-30 16:43:47

Silverlight

2009-12-30 13:59:58

Silverlight

2009-12-31 16:44:53

Silverlight

2009-12-30 11:16:36

Silverlight

2010-08-06 15:44:28

Windows PhoWindows PhoSilverlight

2009-08-07 14:05:21

ASP.NET控件

2009-12-31 11:15:57

Silverlight

2012-02-02 16:32:23

Silverlight控件模型分类

2009-12-30 14:10:27

Silverlight

2014-10-22 10:46:03

ViewportHTML
点赞
收藏

51CTO技术栈公众号