Silverlight開發(fā)之偷拿別人HTML控件
現(xiàn)在我們需要的是是在非OOB下的HTML控件,并且支持中文輸入無需設(shè)置windowsless等于true。
好吧下面我們開始吧:去年的在深藍(lán)色右手群里有位叫“超人”的哥們說DIV的方式,Silverlihgt在html中作為插件顯示。我們可以在html中建立一個(gè)DIV 覆蓋在Silverlight的上方。這樣我們就能輸入中文了。今天我們這里也是這樣的方式實(shí)現(xiàn)的。
以下代碼是去年從某地反編譯過來,然后稍作修改的。具體哪里也忘了。下面我們簡單分析下代碼:
我們先定義Uri屬性,指定顯示某個(gè)Uri的html
- /// <summary>
- /// 設(shè)置Uri的依賴屬性,并且定義Uri改變時(shí)事件SourceUriChanged
- /// </summary>
- public static readonly DependencyProperty SourceUriProperty =
- DependencyProperty.Register("SourceUri", typeof(Uri), typeof(HTMLControl),
- new PropertyMetadata(null, new PropertyChangedCallback(HTMLControl.SourceUriChanged)));
- /// <summary>
- /// 指定顯示的Uri
- /// </summary>
- public Uri SourceUri
- {
- get
- {
- return (Uri)base.GetValue(SourceUriProperty);
- }
- set
- {
- base.SetValue(SourceUriProperty, value);
- }
- }
下面是當(dāng)Uri改變時(shí)候觸發(fā)的事件,大致原理為:
1.獲取Sl所屬頁面在頁面中增加一個(gè)Div元素
2.調(diào)整Div元素所處位置以及長寬高。讓它剛好處于Sl控件位置
3.Refresh方法主要調(diào)整位置以及長寬高
- private static void SourceUriChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
- {
- ((HTMLControl)sender).ReloadUri();
- }
- private void ReloadUri()
- {
- if (!HtmlPage.IsEnabled)
- {
- return;
- }
- if (!this.isLoad)
- {
- return;
- }
- if (this.div.Children.Count > 0)
- {
- while (div.Children.Count>0)
- {
- this.div.RemoveChild((HtmlElement)this.div.Children[0]);
- }
- }
- if (this.SourceUri == null)
- {
- //直接設(shè)置SourceHtml 未設(shè)置Uri
- this.div.SetStyleAttribute("overflow", "auto");
- this.SetDivHtml(this.div, this.SourceHtml);
- //這里刷新Html,并且創(chuàng)建Div
- this.Refresh();
- }
- else
- {
- //通過URL設(shè)置
- this.div.SetStyleAttribute("overflow", "hidden");
- this.div.AppendChild(this.IFrame);
- this.IFrame.SetAttribute("src", this.SourceUri.ToString());
- //這里刷新Html
- this.Refresh();
- }
- }
上面控件只能在非OOB模式下使用,因?yàn)樵贠OB模式下無法創(chuàng)建Div,HtmlPage等對象訪問也會報(bào)錯(題外話:真不明白為啥默認(rèn)建的SL項(xiàng)目App.xaml.cs中會用到HtmlPage對象)。所以要在OOB運(yùn)行的時(shí)候朋友們可以使用MS的WebBrowser控件。
原文鏈接:http://www.cnblogs.com/ForrestZhang/archive/2011/03/08/SilverlightHtml.html
【編輯推薦】