使用 AddConventionalPlugin
时收到此错误:
您必须传入插件实例的类型 - 例如
typeof(Cirrious.MvvmCross.Plugins.Visibility.WindowsPhone.Plugin)
因为我的插件是这样的:
Cirrious.MvvmCross.Plugins.Visibility.Wp7.Plugin
我认为 Wp7 和 Wp8 将分为 2 个项目,因为它们将使用不同的 SDK。
有办法绕过这个问题吗?
预先感谢您的帮助。
最佳答案
“约定”部分只是命名约定。
即它只是在寻找能够提供 IMvxPlugin 的东西:
Cirrious.MvvmCross.Plugins.Visibility
使用规则“添加“WindowsPhone””来获取:
Cirrious.MvvmCross.Plugins.Visibility.WindowsPhone.Plugin
如果 WP8 的规则发生变化...那么我们只需更改 https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.WindowsPhone/Platform/MvxBaseWindowsPhoneSetup.cs 中的约定即可
虽然 WP8 仍然有点不清楚...您可以在您的项目中的 Setup.cs 中使用以下代码自行完成此操作:
protected override IMvxPluginManager CreatePluginManager()
{
var toReturn = new MvxLoaderBasedPluginManager();
var registry = new MvxLoaderPluginRegistry(".WP7",toReturn.Loaders);
AddPluginsLoaders(registry);
return toReturn;
}
或者你甚至可以混合和匹配版本 - 即你可以这样做:
protected override IMvxPluginManager CreatePluginManager()
{
var toReturn = new MvxLoaderBasedPluginManager();
var sharedRegistry = new MvxLoaderPluginRegistry(".WindowsPhone",toReturn.Loaders);
sharedRegistry.AddConventionBasedPlugin<SharedP1>();
sharedRegistry.AddConventionBasedPlugin<SharedP1>();
sharedRegistry.AddConventionBasedPlugin<SharedP3>();
var wp7Registry = new MvxLoaderPluginRegistry(".WP7",toReturn.Loaders);
wp7Registry.AddConventionBasedPlugin<WP7P1>();
wp7Registry.AddConventionBasedPlugin<WP7P2>();
return toReturn;
}
最后,没有什么强制您使用约定 - 您始终可以提供自己的插件加载方法,提供 Func<IMvxPlugin>
- 例如
protected override IMvxPluginManager CreatePluginManager()
{
var toReturn = new MvxLoaderBasedPluginManager();
toReturn.Loaders.Add('Cirrious.MvvmCross.Plugins.Visibility.WindowsPhone.Plugin', () =>
{
// do whatever code you want to do...
return thePlugin;
});
return toReturn;
}
您可以混合搭配这些技术
或者,如果您愿意,您可以提供 IMvxPluginManager 的全新实现。界面就是:
public interface IMvxPluginManager
{
bool IsPluginLoaded<T>() where T : IMvxPluginLoader;
void EnsureLoaded<T>() where T : IMvxPluginLoader;
}
因此,您可以提供一个非常简单的管理器,例如
public class SimplePluginManager : IMvxPluginManager
{
public SimplePluginManager()
{
// load the plugins your app needs here!
Cirrious.MvvmCross.Plugins.Visibility.Wp7.Plugin.Load();
Cirrious.MvvmCross.Plugins.Color.WindowsPhone.Plugin.Load();
}
public bool IsPluginLoaded<T>() where T : IMvxPluginLoader
{
return true;
}
public void EnsureLoaded<T>() where T : IMvxPluginLoader
{
}
}
关于c# - MvvmCross : conventional plugin bypass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12842727/