Webbrowsercontrol无法在自定义任务窗格中加载URL-Word插件

时间:2018-09-06 06:38:57

标签: c# .net vsto webbrowser-control

我正在尝试在WPF Webbrowser控件内的单词插件自定义任务窗格(VSTO)中加载Web应用程序URL。问题是它在开发计算机和其他一些计算机上都可以正常工作,但是在某些计算机上却不起作用。以下是我的计算机特定发现(所有计算机都具有IE11): enter image description here

我尝试使用https://docs.microsoft.com/en-us/windows/communitytoolkit/controls/webview,&&,https://blogs.windows.com/msedgedev/2018/05/09/modern-webview-winforms-wpf-apps/#34jyIaiQaMTrX2zR.97

根据某些线程的发现,我在网页上启用了window.error并删除了JavaScript脚本中出现的一些错误。但是在某些机器上,它会在jquery文件中提供未指定的错误。 我还尝试从注册表中为WINWORD.EXE设置浏览器仿真以使用IE11。

P.S。我已经在目标框架4.6上开发了vsto插件。我还尝试了使用目标框架4.6.2,这是前面链接中提到的WEBVIEW控件所必需的。同样,在Windows 10计算机上启用.net版本4.7也不起作用。在IE中加载网页需要3-4秒。 该网页使用jquery1.9和angular框架1.6。而且该页面还包含某些网站建议的IE = edge的元标记。

还有其他方法可以解决这个问题吗?

  
    

关于在WPF中重新创建视图的一些建议,由于严格的交付时间表,我无法在WPF中创建用于显示和编辑所有数据的网页。

  

1 个答案:

答案 0 :(得分:1)

您是否尝试过此处描述的解决方法:https://support.microsoft.com/en-my/help/4490421/webbrowser-or-wpf-control-content-may-not-display-d-in-office

症状

在某些情况下,当控件托管在CustomTaskPane控件中时,WebBrowser或WPF控件内容可能无法在Office应用程序中正确显示或运行。

原因

此问题可能是由WebBrowser或WPF控件本身引起的。无法将焦点返回到WebBrowser或WPF控件内部呈现的HTML元素的主机应用程序也可能导致此问题。

解决方法

要变通解决此问题,请在CustomTaskPane控件和WebBrowser或WPF控件之间添加一个中间表单。有关如何将自定义任务窗格添加到应用程序中的更多信息,请参阅将自定义任务窗格添加到应用程序中。

对于WPF控件呈现问题,建议您在WindowsForm内托管WPF UserControl并添加一个中间表单。要添加中间表单,请参阅演练:在Windows表单中托管3-D WPF复合控件。

对于WebBrowser控件呈现问题,请使用UserControl MyUserControl来实现以下变通方法:

// ThisAddIn.cs

namespace TaskPaneWorkaround
{
    public partial class ThisAddIn
    {
        private MyUserControl myUserControl1;
        private Microsoft.Office.Tools.CustomTaskPane myCustomTaskPane;

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            myUserControl1 = new MyUserControl();
            myCustomTaskPane = this.CustomTaskPanes.Add(myUserControl1, "My Task Pane");
            myCustomTaskPane.Visible = true;
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region VSTO generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

        #endregion
    }
}

// MyUserControl.cs

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace TaskPaneWorkaround
{
    public partial class MyUserControl: UserControl
    {
        bool isformdisplayed = false;
        WorkaroundForm workaroundForm;

        [DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        public MyUserControl()
        {
            this.SuspendLayout();
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Name = "MyUserControl";
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.MyUserControl_Paint);
            this.Resize += new System.EventHandler(this.MyUserControl_Resize);
            this.ResumeLayout(false);

            this.Paint += MyUserControl_Paint;
            this.Resize += MyUserControl_Resize;
        }

        private void MyUserControl_Load(object sender, System.EventArgs e)
        {
           this.Paint += MyUserControl_Paint;
        }

        private void MyUserControl_Paint(object sender, PaintEventArgs e)
        {
            if (!isformdisplayed)
            {
                this.SuspendLayout();
                workaroundForm = new WorkaroundForm();
                SetParent(workaroundForm.Handle, this.Handle);
                workaroundForm.Dock = DockStyle.Fill;
                workaroundForm.Width = Width;
                workaroundForm.Height = Height;
                workaroundForm.Show();
                isformdisplayed = true;
                this.ResumeLayout();
            }
        }

        private void MyUserControl_Resize(object sender, EventArgs e)
        {
            if (isformdisplayed)
            {
                workaroundForm.Width = this.Width;
                workaroundForm.Height = this.Height;
            }
        }
    }
}

//WorkaroundForm.cs

using System;
using System.Drawing;
using System.Windows.Forms;

namespace TaskPaneWorkaround
{
    public partial class WorkaroundForm: Form
    {
        public WorkaroundForm()
        {
            this.SuspendLayout();
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(509, 602);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.WorkaroundForm_Load);
            this.ResumeLayout(false);
        }
        private void WorkaroundForm_Load(object sender, EventArgs e)
        {
            this.SuspendLayout();
            this.Location = new Point(0, 0);
            this.Dock = DockStyle.Fill;
            this.FormBorderStyle = FormBorderStyle.None;
            WebBrowser webBrowser = new WebBrowser();
            this.Controls.Add(webBrowser);
            webBrowser.Location = new Point(0, 0);
            webBrowser.Dock = DockStyle.Fill;
            this.ResumeLayout();
            webBrowser.Focus();
            webBrowser.Navigate(new System.Uri("https://bing.com"));
        }
    }
}