Webbrowsercontrol не загружает URL в пользовательской панели задач - Word Plugin - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь загрузить URL-адрес веб-приложения в настраиваемой области плагинов слов (VSTO) внутри веб-браузера WPF. Проблема в том, что он отлично работает на компьютере разработчика и некоторых других машинах, но не работает на некоторых машинах. Ниже приведена информация о моей машине (все машины имеют 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. Я разработал плагин vsto на целевой платформе 4.6. Я также пытался использовать целевой фреймворк 4.6.2, который требуется для управления WEBVIEW, как упоминалось в предыдущих ссылках. Также, включение .net версии 4.7 на машине windows 10 не работает. Загрузка веб-страницы в IE занимает 3-4 секунды. Веб-страница использует jquery1.9 и угловой каркас 1.6. И страница также содержит метатег для IE = edge, как предлагается на некоторых сайтах.

Есть ли какие-нибудь другие способы сделать эту работу?

Некоторые предложения касаются воссоздания представления в WPF, я не могу создать веб-страницу в WPF для отображения и редактирования всех данных из-за строгих сроков доставки.

1 Ответ

0 голосов
/ 15 июля 2019

Вы пробовали обходной путь, описанный здесь: https://support.microsoft.com/en-my/help/4490421/webbrowser-or-wpf-control-content-may-not-display-d-in-office

Симптомы

В некоторых ситуациях содержимое элемента управления WebBrowser или WPF может не отображаться или работать неправильно в приложении Office, если элемент управления размещен внутри элемента управления CustomTaskPane.

Причина

Эта проблема может быть вызвана самими элементами управления WebBrowser или WPF. Хост-приложения, которые не возвращают фокус HTML-элементам, отображаемым внутри элементов управления WebBrowser или WPF, также могут вызывать эту проблему.

Обход

Чтобы обойти эту проблему, добавьте промежуточную форму между элементом управления CustomTaskPane и элементом управления WebBrowser или WPF. Для получения дополнительной информации о том, как добавить пользовательскую область задач в приложение, см. Добавление пользовательской области задач в приложение.

При возникновении проблем с отображением элементов управления WPF рекомендуется разместить пользовательский элемент управления WPF внутри WindowsForm и добавить промежуточную форму. Чтобы добавить промежуточную форму, см. Пошаговое руководство. Размещение трехмерного составного элемента управления WPF в Windows Forms.

При возникновении проблем с отображением элемента управления 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"));
        }
    }
}
...