先介绍一下背景
我正在开发一个Web应用程序,它将在WPF应用程序中的WebBrowser中运行。
这是暂时的必需品,而我们正在逐步将功能转移到网络应用程序。只要尚未完成,仍然需要WPF客户端。最终,WPF客户端将完全淘汰。
现在针对手头的问题
当用户关闭客户端(网页)时,webbrowser应该捕获该事件并关闭它所属的窗口。
我发现此链接描述了我需要的内容:WebBrowser and javascript window.close()
唉,我不认为那里描述的答案仍然有用,因为甚至不可能做一个window.close(),因为我不是那个打开我正在运行的窗口的人。从那以后,浏览器(正当地)收紧了他们的安全性。
问题
有没有办法触发从客户端关闭的窗口,它会冒泡到WPF?
感谢。
答案 0 :(得分:1)
在使用WebBrowser.InvokeScript
和WebBrowser.ObjectForScripting
请参阅此MSDN文章How to: Implement Two-Way Communication Between DHTML Code and Client Application Code 另请参阅此CodeProject文章,看起来它可能会解决您的问题 Call a C# Method From JavaScript Hosted in a WebBrowser
[ComVisible(true)]
public class ScriptManager
{
// Variable to store the form of type Form1.
private Window _window;
// Constructor.
public ScriptManager(Window window)
{
// Save the form so it can be referenced later.
_window = window;
}
// This method can be called from JavaScript.
public void MethodToCallFromScript()
{
// Call a method on the form.
_window.Close();
}
}
来自Window的代码:
webBrowser1.ObjectForScripting = new ScriptManager(this);
答案 1 :(得分:0)
那很有效,谢谢!
我做了以下事情:
[ComVisible(true)]
public class ScriptManager
{
protected Window Window { get; set; }
public ScriptManager(Window window)
{
this.Window = window;
}
public void CloseWindow()
{
this.Window.Close();
}
}
在我的窗口(加载事件)中:
// Build browser
this.Browser = new WebBrowser();
this.Browser.Navigate(this.GetUri());
this.Browser.ObjectForScripting = new ScriptManager(this);
客户端Javascript然后执行:
$scope.Close = function() {
window.external.CloseWindow();
}