繁体   English   中英

在现有的Xamarin.Forms共享应用程序中实现Prism

[英]Implement Prism in existing Xamarin.Forms Shared Application

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

为了在我的项目中尝试实现Prism,我将Prims.Unity.Forms nuget安装到每个平台项目中。 我试图从PrismApplication继承:

public partial class App : PrismApplication 
{ }

但是,这不起作用。 app类不允许我从不同的基类继承。

将以下行添加到我的android项目没有帮助:

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

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

也许我错过了一些东西或尝试在结构上不可能的东西。

是的,这是完全可能的。

首先,确保安装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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM