Откройте веб-всплывающее окно из приложения WPF и закройте его с помощью JavaScript - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть приложение WPF, которое связывается с каким-либо сторонним сервером.

После того, как пользователь выполнил некоторую задачу в инструменте WPF, мне нужно отобразить определенный веб-сайт с сервера во всплывающем окне. Всплывающее окно должно быть закрыто с помощью одной из кнопок на сайте (которая подтвердит другую задачу). Но когда javascript хочет закрыть это окно, Internet Explorer обычно открывает диалоговое окно и просит пользователя подтвердить закрытие всплывающего окна.

Я ищу простое решение для отключения этого диалогового окна. Я не могу изменить поведение сервера, поэтому мне нужно обойти его.

Мой старый подход с раздражающим диалоговым окном подтверждения состоял в том, чтобы запустить iexplore.exe с URL-адресом всплывающих окон в качестве параметра (через System.Diagnostics.Process).

Мой новый подход - скрытый элемент <Frame x:Name="PopupFrame" />. Когда всплывающее окно должно быть открыто, я устанавливаю атрибут Source PopupFrame на страницу, которая открывает всплывающее окно. Таким образом, всплывающее окно имеет базовое окно, и JavaScript может закрыть его без диалогового окна подтверждения. Однако это не работает на нескольких системах (возможно, из-за некоторых настроек безопасности) и включает другую страницу, которая выполняет перенаправление / всплывающее окно.

Есть ли более простой способ сделать это?

1 Ответ

1 голос
/ 27 марта 2011

Обновление: Хорошо, я только что понял, что у вас нет контроля над веб-страницей, я могу только думать о том, чтобы добавить какой-нибудь JavaScript-код на страницу, добавить обработчик события в событие LoadCompleted WebBrowser и ввести javascript там, это должно позаботиться об этом и не требовать, чтобы вы изменили исходную веб-страницу:

// Add a reference to Microsoft.mshtml
using mshtml;

// inside the window constructor after you set 
// the webBrowser's ObjectForScripting property
this.webBrowser.LoadCompleted += this.webBrowser_LoadCompleted;

void webBrowser_LoadCompleted(object sender, NavigationEventArgs e)
{
    var doc = (HTMLDocument)webBrowser.Document;
    var head = doc.getElementsByTagName("head").Cast<HTMLHeadElement>().First();
    var script = (IHTMLScriptElement)doc.createElement("script");
    script.text = 
        "javascript:window.onbeforeunload = function () { window.external.Close(); }";
    head.appendChild((IHTMLDOMNode)script);
}

Похоже, у вас есть веб-страница, которую вы открываете, поэтому вот что вы можете сделать:

1.- Добавьте элемент управления Popup в свое окно и добавьте в него элемент управления WebBrowser, вы будете использовать его для перехода на свою страницу:

<Button Content="Button" Click="button1_Click" />
<Popup x:Name="PopUp" Width="300" Height="300">
        <WebBrowser x:Name="webBrowser">
        </WebBrowser>
</Popup>

2.- Создайте новый класс и добавьте к нему атрибут [ComVisible (true)]. Он должен содержать ссылку на ваш объект управления Popup. Добавьте открытый метод в ваш новый класс, который скрывает элемент управления Popup.

using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls.Primitives;

[ComVisible(true)]
public class ScriptHandler
{
    private Popup popup;
    public ScriptHandler(Popup popup)
    {
        this.popup = popup;
    }

    public void Close()
    {
        this.popup.IsOpen = false;
    }
}

3.- Установите для свойства ObjectForScripting элемента управления WebBrowser экземпляр вашего нового класса.

public partial class MainWindow : Window
{
    private ScriptHandler scriptHandler;
    public MainWindow()
    {
        InitializeComponent();
        this.scriptHandler = new ScriptHandler(this.PopUp);
        this.webBrowser.ObjectForScripting = this.scriptHandler;
    }

    // Shows the pop up and navigates to your page
    private void button1_Click(object sender, RoutedEventArgs e)
    {
        this.webBrowser.Navigate("http://localhost:56977/PopUp.htm");
        this.PopUp.IsOpen = true;
    }
}

4.- Так как вы зарегистрировали объект ScriptHandler с помощью элемента управления WebBrowser, все открытые методы в этом классе могут быть доступны из javascript, добавьте метод javascript на свою страницу (вам может потребоваться проверить «неопределенную» проверку, которую я делаю ) который вызывает метод Close в вашем классе ComVisible:

<script type="text/javascript">
    function CloseMe()
    {
        if(window.external != null && window.external.CloseMe != 'undefined')
        {
            window.external.Close();
        }
    }
</script>

5.- Добавьте ссылку, которая вызывает javascript метод CloseMe на вашу страницу:

<a href='javascript:CloseMe()'>Close Me</a>

Как вы, вероятно, уже поняли, это решение будет работать не только с элементом управления Popup, вы также можете создать новое окно и закрыть его, утилизировать элемент управления WeBrowser и т. Д. Или просто показать / скрыть другой тип элемента управления.

...