是否可以在文本更改时刷新单独的WebBrowser控件,而不会失去对文本框的关注

本文关键字:文本 失去 控件 WebBrowser 是否 单独 刷新 | 更新日期: 2023-09-27 18:00:46

我正在为我的公司设计一个文章编辑器,我希望能够在单独的WebBrowser窗口/控件中显示文章的实时预览。每当用户更改文章的某个字段中的任何内容时,WebBrowser控件都需要刷新页面。

以前,我在同一个窗体上有WebBrowser控件,但由于空间原因,我不得不将其分解到一个单独的窗体上,并使用编辑器窗体上的按钮访问它。然而,由于我将该控件移动到一个独立的窗体中,WebBrowser在每次刷新时都会获得关注,这意味着我可以键入一个字符,然后我必须单击回我正在键入的文本框。

我的问题是:有没有一种方法可以在后台刷新预览页面而不会窃取焦点,这样我就可以更新预览以反映用户正在键入的内容,而不会在键入时打断用户?

以下是分别显示和刷新预览的方法:

private void buttonShowPreview_Click(object sender, EventArgs e)
    {
        if (buttonShowPreview.Tag == null)
        {
            Form browserForm = new Form();
            browserForm.FormClosing += new FormClosingEventHandler(delegate(Object form, FormClosingEventArgs args)
            {
                if (args.CloseReason == CloseReason.UserClosing)
                {
                    args.Cancel = true;
                    browserForm.Hide();
                    previewShowing = false;
                }
            });
            browserForm.Size = new System.Drawing.Size(1024, 768);
            browserForm.DesktopLocation = new System.Drawing.Point(0, 0);
            browserForm.Text = "Article Preview";
            preview = new WebBrowser();
            browserForm.Controls.Add(preview);
            preview.Dock = DockStyle.Fill;
            preview.Navigate("about:blank");
            buttonShowPreview.Tag = browserForm;
        }
        Form previewForm = buttonShowPreview.Tag as Form;
        previewForm.Show();
        previewShowing = true;
        RefreshPreview();
    }
private void RefreshPreview(string jumpToAnchor)
    {
        if (preview != null)
        {
            preview.Document.OpenNew(true);
            preview.Document.Write(structuredContent.GetStructuredContentHTML(content, jumpToAnchor, false));
            preview.Refresh(); 
        }
    }

是否可以在文本更改时刷新单独的WebBrowser控件,而不会失去对文本框的关注

根据Robbrechts的回答,尝试禁用父窗体,更新WebBrowser,然后在DocumentCompleted()事件中再次启用父窗体:

    private void buttonShowPreview_Click(object sender, EventArgs e)
    {
        if (buttonShowPreview.Tag == null)
        {
            Form browserForm = new Form();
            browserForm.FormClosing += new FormClosingEventHandler(delegate(Object form, FormClosingEventArgs args)
            {
                if (args.CloseReason == CloseReason.UserClosing)
                {
                    args.Cancel = true;
                    browserForm.Hide();
                }
            });
            preview = new WebBrowser();
            preview.DocumentCompleted += preview_DocumentCompleted; // handle the DocumentCompleted() event
            browserForm.Controls.Add(preview);
            preview.Dock = DockStyle.Fill;
            preview.Navigate("about:blank");
            buttonShowPreview.Tag = browserForm;
        }
        Form previewForm = buttonShowPreview.Tag as Form;
        previewForm.Size = new System.Drawing.Size(1024, 768);
        previewForm.DesktopLocation = new System.Drawing.Point(0, 0);
        previewForm.Text = "Article Preview";
        RefreshPreview();
        previewForm.Show();
    }
    private void RefreshPreview(string jumpToAnchor)
    {
        if (preview != null && preview.Parent != null)
        {
            preview.Parent.Enabled = false; // disable parent form
            preview.Document.OpenNew(true);
            preview.Document.Write(structuredContent.GetStructuredContentHTML(content, jumpToAnchor, false));
            preview.Refresh();
        }
    }
    private void preview_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        WebBrowser wb = sender as WebBrowser;
        if (wb.Parent != null)
        {
            wb.Parent.Enabled = true; // re-enable parent form
        }
    }