c# - MvvmCross : conventional plugin bypass

标签 c# windows-phone-7 xamarin.ios xamarin.android mvvmcross

使用 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/

相关文章:

.net - Objective-C to Monotouch (.NET) 单行代码转换

c# - Wpf 按标签和类型查找所有控件

c# - 如何在页面之间传递值? (Windows 手机)

c# - 在 MonoTouch 中绑定(bind) NSArray

windows-phone-7 - windows phone 7 xaml学习教程

windows-phone-7 - 检测 WP7 代码中的 DesignTime

c# - Xamarin Studio 中 iOS 应用程序的屏幕布局乱序

c# - 如何在 EntityFramework Seed() 方法中重置用户密码?

c# - 一旦 ARCore 在 Unity 应用程序中加载,文本就会消失

c# - Windows Phone 8 异步等待用法