我想在我的应用程序中使用xamarian表单添加横幅广告。假设我有一个广告视图,我想将它放在我的应用程序中,该应用程序在所有页面上使用iOS,Android和UWP上的导航。
如何让所有网页的广告视图实例都相同?
我最好不要每页重新加载广告视图,而是让每个页面都存在,而不是重新加载。我认为它可能是两种方式中的一种,一种始终在屏幕上,如导航栏,其中内容在添加下方呈现,或者另一种方式是视图在每个页面上,但是加载了单个实例所有页面。
答案 0 :(得分:1)
这是个好方法。
转到App.xaml并声明以下资源:
...
<controls:AdViewControl AdUnitId="YOUR_UNIT_ID" BackgroundColor="#FFFFFF"
HeightRequest="50" x:Key="AdViewControl1"/>
<ControlTemplate x:Key="AdOnFooterPage">
<Grid BackgroundColor="#FFFFFF">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ContentView Content="{StaticResource AdViewControl1}" Grid.Row="1"/>
</Grid>
</ControlTemplate>
...
下一步是将ControlTemplate与您要显示广告的页面链接:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
mc:Ignorable="d"
x:Class="BdvAssistant.Views.Recharge.RechargePage"
Title="Page 1"
ControlTemplate="{StaticResource AdOnFooterPage}">
...
(这是可选的),如果您将导航缓存页面,则需要取消AdViewControl与旧父项(ControlTemplate)的链接并将其分配给新父项。这是MasterDetailPage的示例,以下代码应适合MainPage。
public partial class MainPage : MasterDetailPage
{
private readonly Dictionary<MenuItemType, NavigationPage> _menuPages
= new Dictionary<MenuItemType, NavigationPage>();
private readonly Dictionary<MenuItemType, ContentView> _adContentViews
= new Dictionary<MenuItemType, ContentView>();
private AdViewControl AdControl => (AdViewControl)Application.Current.Resources["AdViewControl1"];
public MainPage()
{
InitializeComponent();
}
public async Task NavigateFromMenu(MenuItemType menu)
{
if (AdControl.Parent is ContentView parent)
parent.Content = null;
if (_menuPages.TryGetValue(menu, out var newPage))
{
if (_adContentViews.TryGetValue(menu, out var adParent))
adParent.Content = AdControl;
}
else
{
switch (menu)
{
case MenuItemType.Dashboard:
newPage = new NavigationPage(new DashboardPage());
break;
case MenuItemType.Security:
newPage = new NavigationPage(new PinManagerPage());
break;
default:
return;
}
_adContentViews[menu] = AdControl.Parent as ContentView;
_menuPages[menu] = newPage;
}
if (ReferenceEquals(Detail, newPage))
return;
Detail = newPage;
if (MasterBehavior == MasterBehavior.Popover)
{
if (Device.RuntimePlatform == Device.Android)
await Task.Delay(200);
IsPresented = false;
}
}
}