【问题标题】:Implement Prism in existing Xamarin.Forms Shared Application在现有 Xamarin.Forms 共享应用程序中实现 Prism
【发布时间】:2017-12-30 00:15:43
【问题描述】:

我想知道在现有 Xamarin.Forms 共享项目中实现 Prism 的有效方法。我敢肯定,其他人也想知道他们是否可以从 Prism 提供的产品中获利,而无需将现有项目转换为 PCL 项目。我发现的所有现有示例都显示了一个 PCL 项目(可能有充分的理由)。

为了尝试在我的项目中实施 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)
   { }
}

也许我遗漏了一些东西,或者尝试了一些结构上不可能的东西。

【问题讨论】:

    标签: c# xamarin xamarin.forms prism


    【解决方案1】:

    是的,完全有可能。

    首先,确保安装了 nuget 包。

    例如,对于 Prism 和 Unity,您需要:

    <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" ... />
    

    添加缺少的文件夹(仅用于订购)

    并将现有页面移动到Views 文件夹,但请记住 调整命名空间,否则您的绑定将无法正常工作。

    更改应用程序基类型

    记得在代码和 XAML 中更改应用程序基类型。

    using Prism.Unity;
    using Xamarin.Forms;
    
    namespace XamPrismShared
    {
        public partial class App : PrismApplication
        {
            public App (IPlatformInitializer platformInitializer):base(platformInitializer)
            {                       
            }
    
        }
    }
    

    设置首页及其ViewModel

    实现 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"添加到您现有的视图中,以允许Prism 自动绑定与它们各自的ViewModel

    <?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>
    

    添加缺少的 ViewModel

    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)
              {
      
              }
          }
      }
      

    然后瞧

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

    【讨论】:

    • 谢谢,这个答案确实为我解决了。我错过了 Xaml 命名空间和统一包。亲爱的朋友!
    • 我不会这样做。我用当前的应用程序做到了这一点,它崩溃并烧毁了一个简单的应用程序。基本上这是全有或全无。如果不是,您将花费大部分时间来尝试使现有应用程序没有问题。我们从这条路开始,然后不得不完全使用 Prism,因为有太多的陷阱。棱镜是要走的路。
    猜你喜欢
    • 2017-08-27
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多