在Xamarin Forms中使用PopAsync后,UWP AdControl为空白

时间:2018-04-26 07:50:42

标签: forms xamarin uwp advertising

使用Microsoft Advertising AdControl的Xamarin Forms项目。打开页面时控件正常工作,但是当页面的PopAsync在页面上方再次显示时,AdControl为空白,之后保持空白。

我发现了一个似乎在同一主题here上的旧问题,但我无法使用这些答案和评论。

当带有AdControl的页面在页面的PopAsync之后重新出现时,e.NewElement为null,e.OldElement具有AdControlView(我在PCL中的自定义视图)。

UWP渲染器:

public class AdViewRenderer : ViewRenderer<AdControlView, UWPAdView>
{
    protected override void OnElementChanged(ElementChangedEventArgs<AdControlView> e)
    {
        base.OnElementChanged(e);

        if (null == Control && e.NewElement != null)
        {
            UWPAdView ad = new UWPAdView();
            SetNativeControl(ad);
        }
    }
}

UWP项目中的AdControl用户控件:

<UserControl
    x:Class="Sample.UWP.Helpers.UWPAdView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:aduwp="using:Microsoft.Advertising.WinRT.UI"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    d:DesignHeight="300"
    d:DesignWidth="400"
    mc:Ignorable="d">

    <Grid>
        <aduwp:AdControl
            Width="640"
            Height="100"
            HorizontalAlignment="Stretch"
            AdUnitId="myadunitid"
            ApplicationId="myappid"
            AutoRefreshIntervalInSeconds="30"
            ErrorOccurred="AdControl_ErrorOccurred"
            IsAutoRefreshEnabled="True" />
    </Grid>
</UserControl>

是否有人在Xamarin Forms UWP制作应用中使用AdControl?

1 个答案:

答案 0 :(得分:0)

通过测试,当第二页调用PopAsync()时,第二页面实例将从导航堆栈中删除,新的最顶层页面将成为活动页面,但它似乎是当前最顶层的页面不会创建新实例,而是缓存旧实例。这应该符合预期,但您的AdControl也不会刷新,并且AdControl AdControl事件不会被触发,因为它保持空白。

要解决此问题,您可以考虑强制自己刷新控件。您可能需要覆盖包含OnAppearing的第一页中的Refresh方法,因为返回的页面已调用此方法覆盖。返回第一个页面后,将调用AdControl,您可以执行某些操作以强制在此方法中刷新public MainPage() { InitializeComponent() } async void OnButtonClicked(object sender, EventArgs args) { await Navigation.PushAsync(new Page2()); } protected override void OnAppearing() { base.OnAppearing(); InitializeComponent(); } 。例如,在这里我重新初始化将起作用的页面:

{{1}}

更多详情请参阅OnAppearing