我正在尝试在WPF Webbrowser控件内的单词插件自定义任务窗格(VSTO)中加载Web应用程序URL。问题是它在开发计算机和其他一些计算机上都可以正常工作,但是在某些计算机上却不起作用。以下是我的计算机特定发现(所有计算机都具有IE11):
我尝试使用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中创建用于显示和编辑所有数据的网页。
答案 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"));
}
}
}