AccessViolationException, создаваемый при переходе на страницу форм Xamarin

Я пытаюсь перейти на страницу навигации Xamarin Forms. Однако я пытаюсь сделать это после того, как кадр был впервые загружен некоторыми "родными" страницами UWP.

this.rootFrame.Navigate(page.GetType(), param);

Этот код приводит к AccessViolationException, Объект страницы является Xamarin.Forms.Page, но я также пробовал его с помощью оболочки NavigationPage(page).

Я понимаю, что нормальная навигация XF выполняется с помощью Navigation.PushAsync и т. Д., Но я нахожусь в той точке, где приложение XF и инфраструктура навигации еще не инициализированы.

Вот как я создаю свою начальную NavigationPage

XFormsApp.MainPage = new NavigationPage(contentPage);

var converter = Mvx.Resolve<IMvxNavigationSerializer>();
var requestText = converter.Serializer.SerializeObject(request);

_rootFrame.Navigate(mainPage.GetType(), requestText);

Я пытаюсь создать гибридное приложение UWP, которое начинается с Native Pages, а затем запускает некоторые страницы XF. Официальные образцы Xamarin Forms имеют пример этого для iOS и Android

1 ответ

Я пытаюсь перейти на страницу навигации Xamarin Forms. Однако я пытаюсь сделать это после того, как кадр был впервые загружен некоторыми "родными" страницами UWP.

this.rootFrame.Navigate(page.GetType(), param);

Этот код приводит к AccessViolationException. Объект страницы является Xamarin.Forms.Page, но я также пробовал его с помощью оболочки NavigationPage (page).

Тип первого параметра в rootFrame.Navigate метод forms:WindowsPage, Но в вашем коде вы использовали ContentPage где под Xamarin.Forms пространство имен как первый параметр, это не WindowsPage. Так что это бросило бы исключение.

Вы не можете перейти на страницу форм Xamarin в проекте собственного клиента. Поскольку используемая страница отличается в Xamarin.Forms и UWP. Страница наследуется Windows.UI.Xaml.Controls.Page в uwp, и это наследуется TemplatedPage,

Я пытаюсь создать гибридное приложение UWP, которое начинается с Native Pages, а затем запускает некоторые страницы XF. Официальные образцы Xamarin Forms имеют пример этого для iOS и Android.

По вашему требованию вы можете использовать DependencyService чтобы достичь этого, вернитесь из ContentPage в WindowsPage, Для более подробной информации, пожалуйста, обратитесь к следующему коду.

MainPage.xaml.cs

public sealed partial class MainPage
{
 public MainPage()
 {
     this.InitializeComponent();

 }

 private void MyBtn_Click(object sender, RoutedEventArgs e)
 {
     LoadApplication(new App65.App());
 }
}

MainPage.xaml (Portable)

<StackLayout>
   <Label Text="Welcome to Xamarin Forms!" 
      VerticalOptions="Center" 
       HorizontalOptions="Center" />
   <Button Text="GoBack"  Clicked="Button_Clicked"/>
</StackLayout>

GoBackImplementation.cs

[assembly: Xamarin.Forms.Dependency(typeof(GoBackImplementation))]

namespace App65.UWP
{
    public class GoBackImplementation : IGoBack
    {
        public void GoBack()
        {
            Frame rootFrame = Window.Current.Content as Frame;
            if (rootFrame != null)
            {
                rootFrame = new Frame();
                rootFrame.NavigationFailed += RootFrame_NavigationFailed;

                Window.Current.Content = rootFrame;
            }
            if (rootFrame.Content == null)
            {
                rootFrame.Navigate(typeof(MainPage));
            }
        }

        private void RootFrame_NavigationFailed(object sender, Windows.UI.Xaml.Navigation.NavigationFailedEventArgs e)
        {
            throw new NotImplementedException();
        }
    }
}

У меня есть пример кода загрузки в git hub. Пожалуйста, проверьте.

Другие вопросы по тегам