顯示具有 Embed HTML 標籤的文章。 顯示所有文章
顯示具有 Embed HTML 標籤的文章。 顯示所有文章

2010年9月16日

Embed HTML in Silverlight 的問題

將 silverlight 設定為 windowless 雖然可以順利以 floating 方式顯示 HTML 區塊,卻會造成中文輸入法失效的問題。由於公司入選台灣微軟BizsparkCamp 雲端/ Silverlight創新徵選會,很榮幸能就此問題向章立民老師請教。
章老師提到,使用 windowless 不是一個恰當的做法,可能衍生的不只是中文輸入的問題,應避免使用。文件內容以資料庫或 xml 存放,並依照 HTML 或 Silverlight 的不同,來採取最恰當的顯示方法,才是最佳的處理方式。
章老師的答案,讓我覺得寫程式真的偷懶不得!!
前一篇 Embed HTML in Silverlight

2010年5月19日

Embed HTML in Silverlight

最近處理 Silverlight 顯示 HTML 視窗的問題,
看到一篇文章,測試了五種不同的方法,
分別如下:
  1. WebBrowser - 可以顯示, 但限定在 Out of Browser 的模式
  2. RichTextBox - 無法顯示 HTML
  3. HTML Host Control - 即在 Silverlight 上, 疊一個 position:absolute 的區塊或 ifarem
  4. Liquid RichTextBox - 勉強可以, 有些 HTML 的語法無法呈現, 對中文的支援更糟
  5. HtmlTextBox - 同樣是勉強可用

原始文章位置:http://www.cnblogs.com/Robin2005/archive/2010/05/18/1737887.html
其中 HTML Host Control 應該是相容性最不受限的方法,
但嚴格來說,這不能算是 Silverlight 所提供的功能。

下列class,可以輸入InnerHtml,來顯示 HTML 的內容
但記得在包含 Silverlight 的網頁上,加入 id 為 winContent 的 div
並將 Silverlight 物件設為 windowless。
    public partial class HtmlHostControl : UserControl
    {
        public string InnerHtml
        {
            get { return m_InnerHtml; }
            set
            {
                m_InnerHtml = value;
                if (m_DivIFrameHost != null)
                    m_DivIFrameHost.SetProperty("innerHTML", value);
            }
        }

        public HtmlHostControl()
        {
            InitializeComponent();
            SizeChanged += new SizeChangedEventHandler(HtmlHostControl_SizeChanged);
            CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
        }

        void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            ResetHtmlHostPosition();
        }

        void HtmlHostControl_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            ResetHtmlHostPosition();
        }

        HtmlElement m_DivIFrameHost = null;
        string m_InnerHtml = "";

        public void Show()
        {
            if (m_DivIFrameHost == null)
            {
                HtmlDocument doc = HtmlPage.Document;
                m_DivIFrameHost = doc.GetElementById("winContent"); 
                m_DivIFrameHost.SetStyleAttribute("visibility", "visible");

                m_DivIFrameHost.SetProperty("innerHTML", "Hello");
            }

            ResetHtmlHostPosition();
        }

        private void ResetHtmlHostPosition()
        {
            if (m_DivIFrameHost != null)
            {
                GeneralTransform generalTransform = HtmlHostPanel.TransformToVisual(Application.Current.RootVisual);

                Point pos1 = generalTransform.Transform(new Point(0, 0));
                Point pos2 = generalTransform.Transform(new Point(HtmlHostPanel.ActualWidth, HtmlHostPanel.ActualHeight));

                m_DivIFrameHost.SetStyleAttribute("left", pos1.X.ToString() + "px");
                m_DivIFrameHost.SetStyleAttribute("top", pos1.Y.ToString() + "px");
                m_DivIFrameHost.SetStyleAttribute("width", (pos2.X - pos1.X).ToString() + "px");
                m_DivIFrameHost.SetStyleAttribute("height", (pos2.Y - pos1.Y).ToString() + "px");
            }
        }

        public void ReleaseAll()
        {
            CompositionTarget.Rendering -= CompositionTarget_Rendering;
            if (m_DivIFrameHost != null)
                m_DivIFrameHost.SetStyleAttribute("visibility", "hidden");
        }
    }

Deploying Vue & .NET with Google OAuth on GCP Cloud Run

Deploying Vue & .NET with Google OAuth on GCP Cloud Run Deploying Vue & .NET with Google OAuth on GCP Cloud Run...