Xamarin表单 - 如何让视图(广告)在所有页面上都有一个实例?

时间:2017-05-01 03:36:18

标签: c# android ios xamarin xamarin.forms

我想在我的应用程序中使用xamarian表单添加横幅广告。假设我有一个广告视图,我想将它放在我的应用程序中,该应用程序在所有页面上使用iOS,Android和UWP上的导航。

如何让所有网页的广告视图实例都相同?

我最好不要每页重新加载广告视图,而是让每个页面都存在,而不是重新加载。我认为它可能是两种方式中的一种,一种始终在屏幕上,如导航栏,其中内容在添加下方呈现,或者另一种方式是视图在每个页面上,但是加载了单个实例所有页面。

1 个答案:

答案 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;
        }
    }
}