【问题标题】:Dynamic Gridview - get first child native adsDynamic Gridview - 获取第一个子原生广告
【发布时间】:2018-07-12 09:57:07
【问题描述】:

我有一个简单的动态 Gridview:

<GridView x:Name="MainGridStations" ItemsSource="{x:Bind Stations}" IsItemClickEnabled="True" ItemClick="GridView_ItemClick">
            <GridView.ItemTemplate>
                <DataTemplate x:DataType="local:Station">
                    <Grid>
                        <Grid Background="White" HorizontalAlignment="Center" Width="300" Height="200" VerticalAlignment="Center">
                            <Image x:Name="ImageStation" Source="{Binding ImageURL}"/>
                            <Grid Background="#e4f0fc" Height="65" VerticalAlignment="Bottom" Opacity="0.8">
                                <TextBlock x:Name="StationName" Text="{Binding Name}" FontWeight="Bold" Foreground="#2c9a8b" HorizontalAlignment="Center" />
                            </Grid>
                        </Grid>
                    </Grid>
                </DataTemplate>
            </GridView.ItemTemplate>
</GridView>

现在我想在这个 gridview 中使用原生广告。在本机广告的代码中,我需要注册包含点击事件等广告的广告容器。 它始终是 gridview 的第一个子项,即 gridview 中的第一个网格容器。

我试过这个:

nativeAd.RegisterAdContainer(MainGridStations.ContainerFromIndex(0));

这里给了我一个错误,它不能从 Windows.UI.Xaml.DependencyObject 转换为 Windows.UI.Xaml.FrameworkElement

基本上它需要一个我无法提供的 xaml 控件的直接名称。 我该如何克服呢?

【问题讨论】:

    标签: c# xaml gridview datagridview uwp


    【解决方案1】:

    这里它给了我错误,它无法从 Windows.UI.Xaml.DependencyObject 转换为 Windows.UI.Xaml.FrameworkElement

    RegisterAdContainer 方法注册作为原生广告容器的 UI 元素;这是正确跟踪广告展示次数和点击次数所必需的。

    RegisterAdContainer 的可用参数是FrameworkElement。但是MainGridStations.ContainerFromIndex(0) 的值是DependencyObject。所以它会抛出异常。

    如果您想在GridView 第一项中显示原生广告,您可以在呈现如下时获取第一项。

    你需要继承GridView并重写MeasureOverrideArrangeOverride方法来获取item,然后用Visual Helper获取child。

    class MyGridView : GridView
    {
        private const string ImageStation = "ImageStation";
        private const string StationName = "StationName";
        private const string RootLayout = "RootLayout";
        private bool isFirst;
    
        NativeAdsManagerV2 myNativeAdsManager = null;
        string myAppId = "d25517cb-12d4-4699-8bdc-52040c712cab";
        string myAdUnitId = "test";
    
        public MyGridView()
        {
            myNativeAdsManager = new NativeAdsManagerV2(myAppId, myAdUnitId);
            myNativeAdsManager.AdReady += MyNativeAd_AdReady;
            myNativeAdsManager.ErrorOccurred += MyNativeAdsManager_ErrorOccurred;
            myNativeAdsManager.RequestAd();
        }
    
        private void MyNativeAdsManager_ErrorOccurred(object sender, NativeAdErrorEventArgs e)
        {
    
        }
    
        private void MyNativeAd_AdReady(object sender, NativeAdReadyEventArgs e)
        {
            NativeAdV2 nativeAd = e.NativeAd;
            AdTitle.Text = nativeAd.Title;
            Adimage.Source = nativeAd.AdIcon.Source;
            nativeAd.RegisterAdContainer(AdContainer);
        }
    
        protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
        {
            if (this.IndexFromContainer(element) == 0)
            {
                isFirst = true;
            }
            else
            {
                isFirst = false;
            }
    
            base.PrepareContainerForItemOverride(element, item);
        }
    
    
        protected override Size MeasureOverride(Size availableSize)
        {
            return base.MeasureOverride(availableSize);
    
        }
        private Image Adimage;
        private TextBlock AdTitle;
        private Grid AdContainer;
    
        protected override Size ArrangeOverride(Size finalSize)
        {
            if (isFirst)
            {
                var item = this.ContainerFromIndex(0);
                AdContainer = MyFindGridViewChildByName(item, RootLayout) as Grid;
                Adimage = MyFindGridViewChildByName(item, ImageStation) as Image;
                AdTitle = MyFindGridViewChildByName(item, StationName) as TextBlock;
                isFirst = false;
    
            }
    
            return base.ArrangeOverride(finalSize);
        }
    
        public static DependencyObject MyFindGridViewChildByName(DependencyObject parant, string ControlName)
        {
            int count = VisualTreeHelper.GetChildrenCount(parant);
    
            for (int i = 0; i < count; i++)
            {
                var MyChild = VisualTreeHelper.GetChild(parant, i);
                if (MyChild is FrameworkElement && ((FrameworkElement)MyChild).Name == ControlName)
                    return MyChild;
    
                var FindResult = MyFindGridViewChildByName(MyChild, ControlName);
                if (FindResult != null)
                    return FindResult;
            }
    
            return null;
        }
    
    }
    

    【讨论】:

    • 广告点击对您有用吗?我可以显示它,但点击没有注册。
    • 它在我身边有效。请将网格名称修改为其他名称,避免使用Root
    • 嗯。实际上它不再起作用了。我不能从我的主类中的 GridView 继承,因为它从页面继承。所以我有一个完整的单独类中的代码,我用 var callnative = new NativeAds();在 AdTitle 和其他上获取空指针异常。
    • 您可以在 GridView Loaded 事件中获取 GridView 项,然后使用 View Tree Helper 获取 chind。
    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多