2017-05-31 69 views
0

我想導航到Xamarin表單導航頁面。不過,我正在嘗試在Frame首次加載一些「本機」UWP頁面後執行此操作。AccessViolationException引發導航到Xamarin表單頁面

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應用程序,與本地的頁面開始,後來推出了一些XF頁面。官方Xamarin Forms samples有這樣的iOS和Android的例子

回答

0

我想導航到Xamarin表單導航頁面。不過,我正在嘗試在Frame首次加載一些「本機」UWP頁面後執行此操作。

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

此代碼導致AccessViolationException。頁面對象是一個Xamarin.Forms.Page,但我也嘗試過使用NavigationPage(page)包裝器。

rootFrame.Navigate方法中的第一個參數的類型是forms:WindowsPage。但在你的代碼中,你已經使用ContentPage作爲第一個參數,在Xamarin.Forms命名空間下,它不是WindowsPage。所以它會拋出異常。

您無法導航到本地客戶端項目中的Xamarin Forms Page。因爲使用的頁面在Xamarin.Forms和UWP中不同。該頁面在uwp中繼承Windows.UI.Xaml.Controls.Page,並且繼承了TemplatedPage

我正嘗試創建一個混合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樞紐。請檢查。 「

+0

」rootFrame.Navigate方法中第一個參數的類型是窗體:WindowsPage「這是不正確的。該類型是「System.Type」。將NavigationPage作爲類型傳遞正是MVVMCross所做的「所有UWP」應用程序,您可以在這裏看到https://github.com/MvvmCross/MvvmCross/tree/develop/TestProjects/Forms/Example001XAML。請參閱Presenter.Your DependenmcyService方法不適用於MVVMCross,即使它確實如此,我不認爲「回頭」是我的要求 –

+0

也許我的描述不清楚。該類型是['sourcePageType'](https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.frame#remarks)而不是'System.Type'。所以當你通過帶有NavigationPage(page)包裝器的'Xamarin.page'時,它會拋出異常。 –

+0

如果這是正確的「你知道它爲什麼拋出一個異常,爲什麼它會是AccessViolationException比類似InvalidArgumentException更大,但更重要的是傳遞一個NavigationPage類型作爲第一個參數就是它在MVVMCross中的工作原理。 https://github.com/MvvmCross/MvvmCross/blob/develop/MvvmCross-Forms/MvvmCross.Forms.Uwp/Presenters/MvxFormsUwpPagePresenter.cs#L30。我會爲您創建一個更簡單的repro,但我的環境目前已被擰緊 –