2017-07-24 125 views
4

我想知道在现有的Xamarin.Forms共享项目中实现Prism的有效方法。我相信其他人也想知道,如果他们能够从Prism所提供的产品中获益,而无需将他们现有的项目转换为PCL项目。我发现的所有现有示例都显示了一个PCL项目(​​可能是出于很好的原因)。在现有的Xamarin.Forms共享应用程序中实现Prism

要尝试在我的项目中实施棱镜我安装Prims.Unity.Forms nuget到每个平台项目。 我试图从PrismApplication继承:

public partial class App : PrismApplication 
{ } 

但是,这是行不通的。应用程序类不允许我从不同的基类继承。

添加以下行到我的Android项目并没有帮助:

protected override void OnCreate(Bundle bundle) 
{  
    LoadApplication(new App(new AndroidInitializer())); 
} 

public class AndroidInitializer : IPlatformInitializer 
{ 
    public void RegisterTypes(IUnityContainer container) 
    { } 
} 

也许我缺少的东西,或尝试一些在结构上是不可能的。

回答

10

是的,这是完全可能的。

首先,确保安装了nuget软件包。

例如,对于棱镜和统一,你需要:

<package id="Prism.Core" version="6.3.0" ... /> 
    <package id="Prism.Forms" version="6.3.0" .../> 
    <package id="Prism.Unity.Forms" version="6.3.0" ... /> 
    <package id="Unity" version="4.0.1" ... /> 

添加缺少的文件夹(只为序)

enter image description here

并移动现有页面的Views文件夹, 但记住要调整名称空间或者你的绑定不起作用。

更改应用程序基类

记住改变代码和XAML应用基本类型。

using Prism.Unity; 
using Xamarin.Forms; 

namespace XamPrismShared 
{ 
    public partial class App : PrismApplication 
    { 
     public App (IPlatformInitializer platformInitializer):base(platformInitializer) 
     {      
     } 

    } 
} 

设置的第一页和视图模型

实施OnInitialized和RegisterTypes。请记住,您需要将每个您想要用于Prism的类型注册为页面。

using Prism.Unity; 
using Xamarin.Forms; 

namespace XamPrismShared 
{ 
    public partial class App : PrismApplication 
    { 
     public App (IPlatformInitializer platformInitializer):base(platformInitializer) 
     {      
     } 

     protected override void OnInitialized() 
     { 
      InitializeComponent(); 
      NavigationService.NavigateAsync("MainPage"); 
     } 

     protected override void RegisterTypes() 
     { 
      Container.RegisterTypeForNavigation<NavigationPage>(); 
      Container.RegisterTypeForNavigation<MainPage>();    
     }     
    } 
} 

如果现有的网页

添加ViewModelLocator.AutowireViewModel="True"到你存在的意见,以使棱镜自动绑定各自的视图模型

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 
      prism:ViewModelLocator.AutowireViewModel="True" x:Class="x:Class="XamPrismShared.Views.MainPage"" Title="MainPage"> 
    <Label Text="{Binding Title}" 
      VerticalOptions="Center" 
      HorizontalOptions="Center" /> 
</ContentPage> 

添加缺少的视图模型

enter image description here

using Prism.Mvvm; 

namespace XamPrismShared.ViewModels 
{ 
    public class MainPageViewModel : BindableBase 
    { 
     public MainPageViewModel() 
     { 
      Title = "Hi from Prism."; 
     } 

     public string Title { get; set; } 
    } 
} 

添加平台初始化各个平台项目

添加缺少的平台初始化和修复Xamarin.Forms负荷。

  • 对于Android,
 
    using Android.App; 
    using Android.Content.PM; 
    using Android.OS; 
    using Microsoft.Practices.Unity; 
    using Prism.Unity; 

    namespace XamPrismShared.Droid 
    { 
     [Activity (Label = "XamPrismShared", Icon = "@drawable/icon", Theme="@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 
     public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
     { 
      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 XamPrismShared.App(new AndroidPlatformInitializer())); 
      } 
     } 

     public class AndroidPlatformInitializer : IPlatformInitializer 
     { 
      public void RegisterTypes(IUnityContainer container) 
      { 

      } 
     } 
    } 

  • 对于iOS,
 

    using Foundation; 
    using Microsoft.Practices.Unity; 
    using Prism.Unity; 
    using UIKit; 

    namespace XamPrismShared.iOS 
    { 
     [Register("AppDelegate")] 
     public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate 
     { 
      public override bool FinishedLaunching(UIApplication app, NSDictionary options) 
      { 
       global::Xamarin.Forms.Forms.Init(); 
       LoadApplication (new XamPrismShared.App(new iOSPlatformInitializer())); 

       return base.FinishedLaunching (app, options); 
      } 
     } 

     public class iOSPlatformInitializer : IPlatformInitializer 
     { 
      public void RegisterTypes(IUnityContainer container) 
      { 

      } 
     } 
    } 

enter image description here

如果您有任何问题或要检查,可以检查代码中Github上https://github.com/jesulink2514/Xamarin-Prism-shared-project

+0

@DanielBkr我希望这可以帮助。告诉我们您的问题是否已解决。 :) –

+1

谢谢,这个答案确实为我解决了它。我错过了Xaml命名空间和unity包。格拉西亚斯阿米戈! – DanielBkr

+0

太棒了! @DanielBkr,请考虑将此标记为答案:) –

相关问题