System.InvalidOperationException: 'Невозможно назначить собственный элемент управления без элемента; - PullRequest
0 голосов
/ 27 марта 2019

Я работаю над проектом "CoManga", и я хотел добавить в него рекламу. Внедрение рекламы в UWP казалось простым, как в Android и iOS. Однако я застрял сейчас.

В любом случае, я следовал этому уроку Джеймса Монтемагно и добавил все. Я даже вижу тестовую рекламу, и это здорово. Однако, когда я пытаюсь отойти от этой страницы (когда я нажимаю кнопку «НАЗАД») и перейти на предыдущую страницу, я получаю сообщение об ошибке.

Это ошибка:

Setting up AdControlView in UWP throws System.InvalidOperationException: 'Cannot assign a native control without an Element; Renderer unbound and/or disposed. Please consult Xamarin.Forms renderers for reference implementation of OnElementChanged.'.

Он выбрасывается на номер строки 50 , где я установил SetNativeControl(adView);. Я закомментировал это прямо сейчас, но как только я откомментировал это, я вижу эту ошибку.

Может кто-нибудь помочь мне с этим.

1 Ответ

2 голосов
/ 28 марта 2019

Настройка AdControlView в UWP вызывает System.InvalidOperationException: 'Невозможно назначить собственный элемент управления без элемента; Рендерер не связан и / или ликвидирован. Пожалуйста, обратитесь к средствам визуализации Xamarin.Forms для справочной реализации OnElementChanged.

Причина в том, что элемент xamarin выпущен, но SetNativeControl вызван снова, потому что нативный элемент управления не может найти соответствующий элемент xamarin при возврате страницы. Таким образом, вы можете установить флаг (isRegist) для записи зарегистрированного объявления.

public class AdViewRenderer : ViewRenderer<AdControlView, AdControl>
{
    string bannerId = "test";
    AdControl adView;
    string applicationID = "3f83fe91-d6be-434d-a0ae-7351c5a997f1";
    bool isRegist = false;

    protected override void OnElementChanged(ElementChangedEventArgs<AdControlView> e)
    {
        base.OnElementChanged(e);

        if (Control == null && isRegist != true)
        {
            CreateNativeAdControl();
            SetNativeControl(adView);
            isRegist = true;
        }
    }
    private void CreateNativeAdControl()
    {
        if (adView != null)
            return;

        var width = 300;
        var height = 50;
        if (AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Desktop")
        {
            width = 728;
            height = 90;
        }
        // Setup your BannerView, review AdSizeCons class for more Ad sizes. 
        adView = new AdControl
        {
            ApplicationId = applicationID,
            AdUnitId = bannerId,
            HorizontalAlignment = Windows.UI.Xaml.HorizontalAlignment.Center,
            VerticalAlignment = Windows.UI.Xaml.VerticalAlignment.Bottom,
            Height = height,
            Width = width
        };
    }
}
...