c# – 当在Xamarin Forms的主/明细面布局中切换当前页面时,保留WebView的加载页面内容
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 当在Xamarin Forms的主/明细面布局中切换当前页面时,保留WebView的加载页面内容,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3172字,纯文字阅读大概需要5分钟。
内容图文
![c# – 当在Xamarin Forms的主/明细面布局中切换当前页面时,保留WebView的加载页面内容](/upload/InfoBanner/zyjiaocheng/789/c08c9c73e1b847d0a21f13d038310549.jpg)
我正在使用Master / Detail布局来构建导航菜单和几页.其中一个页面是WebView控件,没有别的.当我从导航菜单切换回此WebView页面然后切换回来时,WebView的内容消失了,状态也消失了.在iOS和Android上都会发生这种情况.
但是,如果我从WebView页面导航到完全不同的页面(非主/详细信息页面),在返回WebView页面后,一切都很好.保留所有内容和状态.
我必须重新加载页面,但用户的操作将丢失.有没有办法保留页面的内容和状态,并在不重新加载页面的情况下恢复它们?
解决方法:
不幸的是,您需要修改source code of Xamarin.Forms.MasterDetailPage以提供所需的行为.问题是当从MasterDetail中删除Detail页面(从Webview切换到另一个页面)时,所有本机控件都被处理掉;即使你保持对Xamarin.Forms.Webview或Xamarin.Forms.Page对象的硬引用.
在源代码中,您可以看到如果_detail属性不为null,则会从MasterDetailPage.PageController.InternalChildren中删除它.您可能需要检查包含Xamarin.Forms.Webview的Xamarin.Forms.Page,并确保它不会从页面控制器中删除.这将保留原生webview和webview处理程序,因此不会重新加载任何内容.有几点需要注意:
>确保您也不要将您的webview页面重新添加到MasterDetail PageController.InternalChildren
> webview页面将保持加载到内存中.这很重要,因为如果你的网站有很多javascript,存储或者更多内容,你应该知道即使没有显示它也会留在内存中
您可以通过创建新的Forms项目并使用以下内容替换App类代码来验证所有这些:
public class App : Application
{
public App()
{
MainPage = new MasterDetail();
}
}
public class MasterDetail : MasterDetailPage
{
static WebViewPage persistentWebPage = new WebViewPage();
public MasterDetail()
{
var masterPage = new MasterPage();
persistentWebPage = new WebViewPage();
Master = masterPage;
Detail = persistentWebPage;
masterPage.listview.ItemSelected += (sender, e) =>
{
var item = e.SelectedItem as string;
if (string.IsNullOrEmpty(item))
return;
switch (item)
{
case "1":
Detail = persistentWebPage;
break;
default:
Detail = new ContentPage { BackgroundColor = Color.Red };
break;
}
masterPage.listview.SelectedItem = null;
IsPresented = false;
};
}
}
public class MasterPage : ContentPage
{
public ListView listview = new ListView { ItemsSource = new string[] { "1", "2", "3" } };
public MasterPage()
{
Title = "Master";
Content = listview;
}
}
public class WebViewPage : ContentPage
{
public static WebView webView = new WebView { Source = "https://www.google.com/" };
public WebViewPage()
{
Content = webView;
}
}
接下来在Android项目中创建一个渲染器(你也可以做iOS,我只做Android)并复制以下代码:
public class WebViewRenderer_Droid : WebViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
if (e.NewElement == null)
Console.WriteLine("*********e.NewElement is null");
else
Console.WriteLine("*********e.NewElement is not null");
if (e.OldElement == null)
Console.WriteLine("*********e.OldElement is null");
else
Console.WriteLine("*********e.OldElement is not null");
if (Control == null)
Console.WriteLine("*********Control is null");
else
Console.WriteLine("*********Control is not null");
base.OnElementChanged(e);
}
}
运行项目并切换回webview页面并返回.您将看到Control和e.OldElement在某一点都为空.这证明您的本地处理程序即使有硬参考也可以处理.这是因为您无法控制Xamarin.Forms如何处理本机控件引用. From the source code of Xamarin.Forms,我们可以看到如果Control为null,则重新创建所有内容.
我希望这有帮助!很有趣的挖掘深入了解这一个.
内容总结
以上是互联网集市为您收集整理的c# – 当在Xamarin Forms的主/明细面布局中切换当前页面时,保留WebView的加载页面内容全部内容,希望文章能够帮你解决c# – 当在Xamarin Forms的主/明细面布局中切换当前页面时,保留WebView的加载页面内容所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。