导航到Xamarin Forms页面时抛出AccessViolationException

时间:2017-05-31 12:43:55

标签: xamarin uwp xamarin.forms

我正在尝试导航到Xamarin Forms NavigationPage。但是我想在框架第一次加载一些" native"之后尝试这样做。 UWP页面。

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

此代码会生成AccessViolationException。页面对象是一个Xamarin.Forms.Page,但我也尝试使用NavigationPage(页面)包装器。

我意识到正常的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);

我正在尝试创建一个以Native Pages开头的混合UWP应用程序,然后启动一些XF页面。官方Xamarin Forms samples有一个适用于iOS和Android的示例

1 个答案:

答案 0 :(得分:0)

  

我正在尝试导航到Xamarin Forms NavigationPage。但是我想在框架第一次加载一些&#34; native&#34;之后尝试这样做。 UWP页面。

     

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

     

此代码导致AccessViolationException。页面对象是一个Xamarin.Forms.Page,但我也尝试使用NavigationPage(页面)包装器。

rootFrame.Navigate方法中第一个参数的类型为forms:WindowsPage。但是在您的代码中,您使用ContentPage作为第一个参数在Xamarin.Forms名称空间下,它不是WindowsPage。所以它会抛出异常。

您无法导航到本机客户端项目中的Xamarin表单页面。因为在Xamarin.Forms和UWP中使用的页面不同。该页面在uwp中继承Windows.UI.Xaml.Controls.Page,并且是继承的TemplatedPage

  

我正在尝试创建一个以Native Pages开头的混合UWP应用程序,然后启动一些XF页面。官方Xamarin Forms示例有一个适用于iOS和Android的示例。

根据您的要求,您可以使用DependencyService来实现从ContentPageWindowsPage的回复。有关更多详细信息,请参阅以下代码。

<强> 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中(便携式)

<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();
        }
    }
}

enter image description here

我已将code sample上传到git hub。请检查。