gpt4 book ai didi

c# - 如何正确处理网页浏览器控件的后退导航

转载 作者:行者123 更新时间:2023-11-30 17:58:16 26 4
gpt4 key购买 nike

我试图在我放置在我的 WP7 应用程序中的 Web 浏览器控件中执行正确的返回堆栈导航。 Web 浏览器位于自定义控件中,我在其中实现导航方法,然后将此控件放置在我的应用程序的页面中。导航似乎工作正常,除了后台。有时它会返回到上一页,而其他时候(当它不应该这样做时)它会关闭应用程序。到目前为止,这是我的实现:

WebBrowser.cs(用户控件)

    //The navigation urls of the browser.
private readonly Stack<Uri> _NavigatingUrls = new Stack<Uri>();

//The history for the browser
private readonly ObservableCollection<string> _History =
new ObservableCollection<string>();

//Flag to check if the browser is navigating back.
bool _IsNavigatingBackward = false;


/// <summary>
/// Gets the History property for the browser.
/// </summary>
public ObservableCollection<string> History
{
get { return _History; }
}

/// <summary>
/// CanNavigateBack Dependency Property
/// </summary>
public static readonly DependencyProperty CanNavigateBackProperty =
DependencyProperty.Register("CanNavigateBack", typeof(bool),
typeof(FullWebBrowser), new PropertyMetadata((bool)false));

/// <summary>
/// Gets or sets the CanNavigateBack property. This dependency property
/// indicates whether the browser can go back.
/// </summary>
public bool CanNavigateBack
{
get { return (bool)GetValue(CanNavigateBackProperty); }
set { SetValue(CanNavigateBackProperty, value); }
}


void TheWebBrowser_Navigating(object sender,
Microsoft.Phone.Controls.NavigatingEventArgs e)
{
//show the progress bar while navigating
}

void TheWebBrowser_Navigated(object sender,
System.Windows.Navigation.NavigationEventArgs e)
{
//If we are Navigating Backward and we Can Navigate back,
//remove the last uri from the stack.
if (_IsNavigatingBackward == true && CanNavigateBack)
_NavigatingUrls.Pop();

//Else we are navigating forward so we need to add the uri
//to the stack.
else
{
_NavigatingUrls.Push(e.Uri);

//If we do not have the navigated uri in our history
//we add it.
if (!_History.Contains(e.Uri.ToString()))
_History.Add(e.Uri.ToString());
}

//If there is one address left you can't go back.
if (_NavigatingUrls.Count > 1)
CanNavigateBack = true;
else
CanNavigateBack = false;

//Finally we hide the progress bar.
ShowProgress = false;
}

/// <summary>
/// Used to navigate back.
/// </summary>
public void NavigateBack()
{
_IsNavigatingBackward = true;
TheWebBrowser.InvokeScript("eval", "history.go(-1)");
}

浏览器页面.xaml.cs

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
if (TheBrowser.CanNavigateBack)
{
e.Cancel = true;
TheBrowser.NavigateBack();
}
else
base.OnBackKeyPress(e);
}

注意:我的网络浏览器启用了 Javascript,所有其他导航都正常工作。我的问题是,有时网络浏览器会正确导航回来,而其他时候它不起作用并一起关闭。我的实现有问题吗?我可以做些什么来解决这个问题?

最佳答案

当您调用 base.OnBackKeyPress(e) 时,是我还是您在创建无限循环引用 - 因此当向后导航不可用时,它会尝试将事件重新发送回自身,事实上,你不需要这样做,不做 e.Cancel = true;您将自动允许 OnBackKeyPress 事件继续而不会出现任何问题,因此请完全删除 else 部分并查看会发生什么。由于当返回导航不可用时您会收到错误消息,因此只有在那时才启动循环引用是有道理的。

请记住,我是一名 VB.NET 程序员,所以除非 C# 有一些我没有了解的非常不同的东西,否则我们可能会找到一个解决方案。

您正在执行 e.cancel=true 的事实;建议如果您不这样做,事件将继续,因此,没有必要重新启动事件(因为您没有取消它),并且可能会创建循环引用。尝试删除它,让我们知道会发生什么。也就是说,您需要删除以下行:

 } 
else
base.OnBackKeyPress(e);

关于c# - 如何正确处理网页浏览器控件的后退导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12466138/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com