在现有 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
{ }
但是,这是行不通的。应用程序 class 不允许我从不同的基础继承 class。
将以下行添加到我的 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" ... />
添加丢失的文件夹(仅用于订购)
And move your existing page to the Views
folder, but remember to
adjust the namespaces or your binding just won't work.
更改应用程序基类型
记得在代码中更改应用程序基类型 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)
{
}
}
}
瞧瞧
If you have any question or want to check, you can review the code in Github https://github.com/jesulink2514/Xamarin-Prism-shared-project
我想知道在现有的 Xamarin.Forms 共享项目中是否有一种有效的方法来实施 Prism。我相信其他人也想知道他们是否可以从 Prism 提供的产品中获利,而不必将他们现有的项目转换为 PCL 项目。我发现的所有现有示例都显示了一个 PCL 项目(可能有充分的理由)。
为了尝试在我的项目中实施 Prism,我为每个平台项目安装了 Prims.Unity.Forms nuget。 我试图从 PrismApplication 继承:
public partial class App : PrismApplication
{ }
但是,这是行不通的。应用程序 class 不允许我从不同的基础继承 class。
将以下行添加到我的 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" ... />
添加丢失的文件夹(仅用于订购)
And move your existing page to the
Views
folder, but remember to adjust the namespaces or your binding just won't work.
更改应用程序基类型
记得在代码中更改应用程序基类型 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) { } } }
瞧瞧
If you have any question or want to check, you can review the code in Github https://github.com/jesulink2514/Xamarin-Prism-shared-project