首页 > 解决方案 > Xamarin Forms 中的 PopAsync 后 UWP AdControl 空白

问题描述

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

我在这里发现了一个似乎关于同一主题的老问题,但我无法使用答案和评论。

当具有 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?

标签: formsxamarinuwpads

解决方案


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

要解决此问题,您可以考虑自行强制刷新控件。您可能需要覆盖OnAppearing包含 的第一页中的方法AdControl,因为要返回的页面已调用此方法覆盖。一旦返回的第一页将被调用,您可以在此方法中根据需要OnAppearing执行一些操作来强制刷新。AdControl例如,在这里我重新初始化将工作的页面:

public MainPage()
{
    InitializeComponent() 
}

async void OnButtonClicked(object sender, EventArgs args)
{
    await Navigation.PushAsync(new Page2());  
}
protected override void OnAppearing()
{
    base.OnAppearing();
    InitializeComponent();
}

更多细节请参考本文档


推荐阅读