Система.Исключение InvalidOperationException: ‘Невозможно назначить собственный элемент управления без элемента;

#c# #xamarin #xamarin.forms #uwp #custom-renderer

#c# #xamarin #xamarin.forms #uwp #пользовательский рендерер

Вопрос:

Я работаю над проектом «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. Извините, я не смог установить этот. Поэтому не удалось проверить. Попытаюсь проверить это сегодня вечером и пометю как решаемую, если это сработает.

Ответ №1:

Настройка AdControlView в UWP приводит к сбоям в системе.Исключение InvalidOperationException: ‘Невозможно назначить собственный элемент управления без элемента; Средство визуализации не привязано и / или удалено. Пожалуйста, обратитесь к Xamarin.Средства визуализации форм для эталонной реализации 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 amp;amp; 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
        };
    }
}
  

Комментарии:

1. Я все еще получаю ошибку после возврата со страницы, на которой отображается реклама. Если я проверю isRegist != true , я не получу никакого объявления на предыдущей странице. Если я удаляю его, я получаю ту же ошибку. На первой странице я получаю ad только при запуске приложения. после этого при переходе со следующей страницы я либо получаю эту ошибку, либо не получаю никакого объявления.