2017-04-27 45 views
1

使用xamarin PCL &棱鏡圖書館InitializeComponent();在棱鏡庫中不存在?

public class App : PrismApplication 
    { 
    public App(IPlatformInitializer initializer = null) : base(initializer) 
    { } 
    protected override void OnInitialized() 
    { 

     //InitializeComponent(); 
     NavigationService.NavigateAsync("MainPage"); 
    } 

    protected override void RegisterTypes() 
    { 
     Container.RegisterTypeForNavigation<MainPage>("MainPage"); 
     Container.RegisterTypeForNavigation<LoginPage>("LoginPage"); 
     Container.RegisterTypeForNavigation<ServicePage>("ServicePage"); 
    } 

} 

形式MainActivity.cs

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     //TabLayoutResource = Resource.Layout.Tabbar; 
     //ToolbarResource = Resource.Layout.Toolbar; 

     base.OnCreate(bundle); 

     global::Xamarin.Forms.Forms.Init(this, bundle); 
     LoadApplication(new App(new AndroidInitializer())); 
    } 
    public class AndroidInitializer : IPlatformInitializer 
    { 
     public void RegisterTypes(IUnityContainer container) 
     { 
     } 


    } 

主要Page.cs

namespace PRProject.Views 
    { 
     public partial class MainPage : ContentPage 
    { 
    public MainPage() 
    { 
     InitializeComponent(); 
     BackgroundImage = "Background.png"; 
    } 
} 

和MainPage.xaml中

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="PRProject.Views.MainPage" BackgroundImage="Background.png" 
      xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 
      prism:ViewModelLocator.AutowireViewModel="True"> 

    <StackLayout VerticalOptions="End" HorizontalOptions="Center" Orientation="Vertical" Margin="20,0,20,10"> 
    <ScrollView VerticalOptions="FillAndExpand" Orientation="Vertical" HorizontalOptions="Center"> 
     <StackLayout> 


     <StackLayout VerticalOptions="End" HorizontalOptions="Center" Orientation="Horizontal" Margin="0,0,0,20"> 
      <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 


      <Image Grid.Column="1" Source="signin.png"> 
       <Image.GestureRecognizers> 
       <TapGestureRecognizer Command="{Binding NavigateCommand}" /> 
       </Image.GestureRecognizers> 
      </Image> 
      </Grid> 

     </StackLayout> 
     </StackLayout> 
    </ScrollView> 
    </StackLayout> 
    </ContentPage> 

和視圖模型

namespace PRProject.ViewModels 
    { 
    public class MainPageViewModel : BindableBase, INavigationAware 
    { 
    private INavigationService _navigationService; 

    public DelegateCommand NavigateCommand { get; set; } 
    public MainPageViewModel(INavigationService navigationService) 
    { 
     _navigationService = navigationService; 
     NavigateCommand = new DelegateCommand(Navigate); 
    } 
    private void Navigate() 
    { 
     _navigationService.NavigateAsync("LoginPage"); 
    } 
    }} 
  • 問題是
    1. 我沒有InitializeCompenent()被調用內部OnInitialized()
    2. 當導航到網主頁它顯示爲空白頁
    3. 主活動中的另一個額外問題如果主活動類繼承自 global :: Xamarin.Forms.Platform.Android.FormsAppCompatActivity它將返回null異常
    4. 裏面主要活動Registertype的參數是IContainer,但對我來說它是IUnityContainer。

回答

2

App類只會有一個InitializeComponent方法,如果它有一個附帶的XAML文件。如果您不這樣做,最簡單的方法是通過在New File對話框中將App類重新創建爲「Forms ContentPage XAML」。然後確保XAML文件也使用PrismApplication類。

你的XAML文件應該是這樣的:

<prism:PrismApplication 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:prism="clr-namespace:Prism.Unity;assembly=Prism.Unity.Forms" 
    x:Class="SampleApp"> 
    <!-- other XAML can go here --> 
</prism:PrismApplication> 

請注意,沒有要求使用具有Prism.Forms XAML文件(儘管在我看來推薦),所以你也可以直接撥打電話InitializeComponent。接收更多信息

在你MainPage.xaml

編輯,你已經在StackLayout,其中StackLayoutVerticalOptions設置爲End放在ScrollViewStackLayout無法知道應該變成多大,因爲ScrollView是其唯一的孩子。刪除外部StackLayout,最有可能的東西將出現在MainPage

如果您只是想嘗試一種簡單的方法來排除棱鏡問題,您還可以用簡單的Label元素替換XAML。

只是基於您的XAML的另一種說法:儘量避免嵌套不必要的StackLayouts,因爲它會導致性能下降。

+0

我刪除了滾動視圖,並且主頁也是空白的,但一段時間後它返回(System.InvalidOperationException:Sequence不包含任何元素)異常 –

+0

只需在MainPage中使用'Label'即可排除其他任何問題。 MainPage構造函數是否被調用? –

+0

yes MainPage構造函數調用成功,沒有問題或異常,但頁面仍然爲空。 –