Как расширить все контентные страницы, используя pagerenderer в UWP? - PullRequest
0 голосов
/ 13 февраля 2019

Я хотел бы расширить все страницы содержимого в моем приложении xamarin.forms с собственным представлением в UWP.Я могу в основном перейти на каждую страницу и встроить собственный вид, но я не хочу этого.Я хочу знать, есть ли способ сделать это с помощью Pagerenderer.Я попытался сделать, как показано ниже.

Моя идея состояла в том, чтобы получить рендеринг текущей страницы и расширить содержимое с помощью собственного представления и стекового макета и снова определить app.content с этим изменением.Работает в общем.Если вы запустите небольшой тестовый проект, показанный ниже, вы увидите, что для каждой страницы отображаются родные шрифтовые символы UWP, но есть проблема, если я перехожу одну и ту же страницу 2 раза в MasterDetail в прикрепленном проекте, страница становится пустой.Почему это происходит?и подходит ли подход ниже для моего случая?Я открыт для альтернативных решений.

[assembly: ExportRenderer(typeof(ContentPage), typeof(App3.UWP.ContentPageRenderer))]
namespace App3.UWP
{

    public class ContentPageRenderer : PageRenderer
    {

        bool isDisposing = false;
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Page> e)
        {
            base.OnElementChanged(e);

            if (isDisposing)
                return;

            if (e.OldElement != null || Element == null)
            {
                return;
            }


            ContentPage page = ((ContentPage)Element);
            if (page.Content == null)
                return;


            var XboxControls = new MyUserControl1();
            StackLayout stackLayout = new StackLayout() { Orientation = StackOrientation.Vertical };
            stackLayout.Children.Add(page.Content);
            stackLayout.Children.Add(XboxControls.ToView());

            page.Content = stackLayout;

        }

        protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize)
        {
            return base.ArrangeOverride(finalSize);
        }

        protected override void Dispose(bool disposing)
        {
            isDisposing = disposing;

            base.Dispose(disposing);
        }

    }

Тестовый проект

...